在防火墻環(huán)境下DNS的安裝與設置
在一般防火墻下,都是采用DMZ 區(qū)內(nèi)放服務器,外部訪問DMZ 區(qū)得到外部的IP ,內(nèi)部訪問DMZ 區(qū)時得到內(nèi)部的IP 。如一個,內(nèi)部IP 地址<--->放在DMZ 的web 服務器的IP <-----
在一般防火墻下,都是采用DMZ 區(qū)內(nèi)放服務器,外部訪問DMZ 區(qū)得到外部的IP ,內(nèi)部訪問DMZ 區(qū)時得到內(nèi)部的IP 。
如一個,
內(nèi)部IP 地址<--->放在DMZ 的web 服務器的IP <----->外部IP 地址
192.168.1.1<--->192.168.0.1<----->211.202.49.1
從DNS 上可以從以下四個方面解決:
一.iptables 應用
1. 核心思想
配置動態(tài)DNS 服務器的核心思想是:在DNS 服務器上運行多個BIND ,每個BIND 為來自不同區(qū)域的用戶提供解析,因此每個BIND 都應具有不同的配置文件和域文件,并且分別監(jiān)聽在不同的端口。在接到客戶端DNS 請求時,根據(jù)客戶的ip 地址將請求重定向不同的BIND 服務端口。BIND 響應時,再改寫相應包的服務端口為標準的53端口。這樣就可以根據(jù)客戶端的ip 地址將不同的解析結(jié)果返回給客戶端。整個過程對于客戶端來說都是透明的。實現(xiàn)的關(guān)鍵在于運行不同的BIND 及運用iptables 進行ip 地址及端口改寫操作。
2 配置過程
步驟1: 配置內(nèi)核
netfilter 要求內(nèi)核版本不低于2.3.5,在編譯新內(nèi)核時,要求選擇和netfilter 相關(guān)的項目。這些項目通常都是位于"Networking options"子項下。以2.4.0內(nèi)核為例,我們應該選中的項目有: ? Kernel/User netlink socket
[ ] Routing messages
<*> Netlink device emulation
? Network packet filtering (replaces ipchains)
.......
然后,在"IP: Netfilter Configuration ---->"選中:
Connection tracking (required for masq/NAT)
FTP protocol support
IP tables support (required for filtering/masq/NAT)
limit match support
MAC address match support
Netfilter MARK match support
Multiple port match support
,TOS match support
Connection state match support
Packet filtering
REJECT target support
Full NAT
MASQUERADE target support
REDIRECT target support
Packet mangling
TOS target support
MARK target support
LOG target support
ipchains (2.2-style) support
ipfwadm (2.0-style) support
其中最后兩個項目可以不選,但是如果你比較懷念ipchains 或者ipfwadm ,你也可以將其選中,以便在2.4內(nèi)核中使用ipchians 或ipfwadm 。但是需要注意的是,iptables 是和ipchians/ipfwadm相對立的,在使用iptables 的同時就不能同時使用ipchains/ipfwadm。編譯成功后,這些模塊文件都位于以下目錄中
/lib/modules/2.4.0/kernel/net/ipv4/netfilter
編譯2.4.0的新內(nèi)核時還應該注意要在"Processor type and features" 中選擇和你的CPU 相對應的正確的CPU 選項,否則新內(nèi)核可能無法正常工作。
步驟二、 配置BIND 服務
缺省地,BIND 服務監(jiān)聽在53端口,我們可以通過配置讓BIND 運行在不同的ip 及端口上。實現(xiàn)這一點并不復雜,假設我們的DNS 服務器的ip 地址是211.163.76.1,并且我們想?yún)^(qū)分CERNET 及非CERNET 的客戶,這時我們必須運行兩個BIND ,使用不同的配置文件??梢栽谑褂梅菢藴时O(jiān)聽端口的BIND 的配置文件中用listen-on 指定BIND 監(jiān)聽的端口,比如:
options {
listen-on port 54 {211.163.76.1;}
directory "/var/named_cernet";
};
可以用named 的-c 選項指定named 讀入不同的配置文件,比如:
/usr/sbin/named -u named -c /etc/named_cernet.conf
3、配置重定向規(guī)則
假設監(jiān)聽在標準端口的BIND 服務器為非CERNET 客戶提供DNS 解析,監(jiān)聽在54端口的BIND 服務器為CERNET 服務器提供DNS 解析,我們可以建立如下的規(guī)則腳本:
#!/bin/bash
#打開端口轉(zhuǎn)發(fā)
echo 1 > /proc/sys/net/ipv4/ip_forward
#加載相關(guān)的內(nèi)核模塊
/sbin/modprobe iptable_filter
/sbin/modprobe ip_tables
/sbin/modprobe iptables_nat
#刷新所有規(guī)則
/sbin/iptables -t nat -F
,#加入來自CERNET 的DNS 請求轉(zhuǎn)發(fā)規(guī)則,將其轉(zhuǎn)發(fā)到本地54端口,CERNET 地址列表可從www.nic.edu.cn/RS/ipstat/獲得
/sbin/iptables -t nat -A PREROUTING -p udp -s 163.105.0.0/16 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 163.105.0.0/16 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p udp -s 166.111.0.0/16 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 166.111.0.0/16 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p udp -s 202.4.128.0/19 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 202.4.128.0/19 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p udp -s 202.112.0.0/15 --dport 53 -i eth0 -j REDIRECT 54
/sbin/iptables -t nat -A PREROUTING -p tcp -s 202.112.0.0/15 --dport 53 -i eth0 -j REDIRECT 54
…
#將返回給CERNET DNS客戶數(shù)據(jù)包的源端口(54端口) 偽裝成53端口
/sbin/iptables -t nat -A POSTROUTING -p udp --sport 54 -o eth0 -j SNAT --to 211.163.76.1:53
/sbin/iptables -t nat -A POSTROUTING -p tcp --sport 54 -o eth0 -j SNAT --to 211.163.76.1:53
教育網(wǎng)網(wǎng)的朋友可以從這里下載該腳本,將腳本中的DNS_IP及CNET_PORT參數(shù)改成你自己的DNS 服務器地址及監(jiān)聽端口即可。
4、運行動態(tài)DNS
配置完成后我們啟動DNS 服務器,并且運行相應的規(guī)則腳本,我們的動態(tài)DNS 服務器就可以正常工作了。
二。利用bind9的cache 紀錄
1) 、用戶向瀏覽器提供要訪問的域名;
2) 、瀏覽器調(diào)用域名解析庫對域名進行解析,由于CDN 對域名解析過程進行了調(diào)整,
所以解析函數(shù)庫一般得到的是該域名對應的CNAME 記錄,為了得到實際IP 地址,
瀏覽器需要再次對獲得的CNAME 域名進行解析以得到實際的IP 地址;在此過程中,
使用的全局負載均衡DNS 解析,如根據(jù)地理位置信息解析對應的IP 地址,使得用戶能就近訪問。
3) 、此次解析得到CDN 緩存服務器的IP 地址,瀏覽器在得到實際的IP 地址以后,
向緩存服務器發(fā)出訪問請求;
4) 、緩存服務器根據(jù)瀏覽器提供的要訪問的域名,通過Cache 內(nèi)部專用DNS 解析
得到此域名的實際IP 地址,再由緩存服務器向此實際IP 地址提交訪問請求;
5) 、緩存服務器從實際IP 地址得得到內(nèi)容以后,一方面在本地進行保存,
以備以后使用,二方面把獲取的數(shù)據(jù)返回給客戶端,完成數(shù)據(jù)服務過程;
6) 、客戶端得到由緩存服務器返回的數(shù)據(jù)以后顯示出來并完成整個瀏覽的數(shù)據(jù)請求過程。
,1、要加入CDN 服務的網(wǎng)站,需要域名(如www.linuxaid.com.cn, 地址202.99.11.120) 解析權(quán)提供給CDN 運營商,Linuxaid 的域名解析記錄只要把www 主機的A 記錄改為CNAME 并指向cache.cdn.com 即可。cache.cdn.com 是CDN 網(wǎng)絡自定義的緩存服務器的標識。在/var/named/linuxaid.com.cn域名解析記錄中,由:
www IN A 202.99.11.120
改為
www IN CNAME cache.cdn.com.
2、CDN 運營商得到域名解析權(quán)以后,得到域名的CNAME 記錄,指向CDN 網(wǎng)絡屬下緩存服務器的域名,如cache.cdn.com ,CDN 網(wǎng)絡的全局負載均衡DNS ,需要把CNAME 記錄根據(jù)策略解析出IP 地址,一般是給出就近訪問的Cache 地址。
Bind 9的基本功能可以根據(jù)不同的源IP 地址段解析對應的IP ,實現(xiàn)根據(jù)地域就近訪問的負載均衡,一般可以通過Bind 9的sortlist 選項實現(xiàn)根據(jù)用戶端IP 地址返回最近的節(jié)點IP 地址,具體的過程為:
1) 為cache.cdn.com 設置多個A 記錄,/var/named/cdn.com 的內(nèi)容如下:
$TTL 3600
@ IN SOA ns.cdn.com. root.ns.cdn.com. (
2002090201 ;Serial num
10800 ;Refresh after 3 hours
3600 ;Retry
604800 ;Expire
1800 ;Time to live
)
IN NS ns
www IN A 210.33.21.168
ns IN A 202.96.128.68
cache IN A 202.93.22.13 ;有多少個CACHE 地址
cache IN A 210.21.30.90 ;就有多少個CACHE 的A 記錄
cache IN A 211.99.13.47
2) /etc/named.conf中的內(nèi)容為:
options {
directory "/var/named";
sortlist {
#這一段表示當在本地執(zhí)行查詢時
#將按照202.93.22.13,210.21.30.90,211.99.13.47的順序返回地址
{ localhost;
{ localnets;
202.93.22.13;
{ 210.21.30.90; 211.99.13.47; };
};
};
#這一段表示當在202/8地址段進行DNS 查詢時
#將按照202.93.22.13,210.21.30.90,211.99.13.47的順序返回地址
{ 202/8;
{ 202.93.22.13;
{ 210.21.30.90; 211.99.13.47; };
,};
};
#這一段表示當在211/8地址段進行DNS 查詢時
#將按照211.99.13.47,202.93.22.13,210.21.30.90的順序返回地址, #也就是211.99.13.47是最靠近查詢地點的節(jié)點
{ 211/8;
{ 211.99.13.47;
{ 202.93.22.13; 210.21.30.90; };
};
};
{ 61/8;
{ 202.93.22.13;
{ 210.21.30.90; 211.99.13.47; };
};
};
};
};
zone "." {
type hint;
file "root.cache";
};
zone "localhost" {
type master;
file "localhost";
};
zone "cdn.com" {
type master;
file "cdn.com";
};
三。設內(nèi)外DNS
外部DNS 就是一般的設置,關(guān)鍵在于內(nèi)部的DNS 的設置上
## named.conf - configuration for bind
#
# Generated automatically by redhat-config-bind, alchemist et al. # Any changes not supported by redhat-config-bind should be put # in /etc/named.custom
#
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
include "/etc/named.custom";
include "/etc/rndc.key";
,options {
directory "/var/named/";
forwarders { 192.168.22.9; }; //轉(zhuǎn)向到外部的DNS
};
zone "0.0.127.in-addr.arpa" {
type master;
file "0.0.127.in-addr.arpa.zone";
};
zone "22.168.192.in-addr.arpa" {
type master;
file "22.168.192.in-addr.arpa.zone";
};
zone "7.20.172.in-addr.arpa" {
type master;
file "7.20.172.in-addr.arpa.zone";
};
zone "localhost" {
type master;
file "localhost.zone";
};
zone "hutc.zj.cn" {
type master;
file "hutc.zj.cn.zone";
forwarders { }; //除了內(nèi)部的本域解析,其余都放到外部的DNS 上 };
四。利用bind9的view 功能
options {
directory "/var/named";
};
acl "fx_subnet" {192.253.254/24; };
view "internal" { //我們區(qū)的內(nèi)部視圖
match-clients { "fx-subnet"; };
zone "fx.movie.edu" {
type master;
file 'db.fx.moive.edu";
};
zone "254.253.192.in-addr.arpa" {
,type master;
file "db.192.253.254";
};
};
view "external" { //相應于世界的其余部分,我們區(qū)的視圖
match-clients { any; }; //隱式地
rescursion no; //我們的子網(wǎng)外面,它們不應該請求遞歸查詢
zone "fx.movie.edu" {
type master;
file "db.fx.movie.edu.external"; //外部區(qū)數(shù)據(jù)文件
};
zone "254.254.192.in.arpa" {
type master;
file "db.192.253.254.external";//外部區(qū)數(shù)據(jù)文件
};
};
總結(jié):方法一:過于復雜,并且不能解決MX 紀錄的問題
方法二:實際上用別的思想來解決內(nèi)外DNS 解析的問題
方法三:實際已經(jīng)運用過,還可以用ACL 來做進一步的限制,就是和方法四比較起來,機器用的多了一點
方法四:感覺最好了。