一、核心思想
配置動(dòng)態(tài)DNS服務(wù)器的核心思想是:在DNS服務(wù)器上運(yùn)行多個(gè)BIND,每個(gè)BIND為來自不同區(qū)
域的用戶提供解析,因此每個(gè)BIND都應(yīng)具有不同的配置文件和域文件,并且分別監(jiān)聽在不同
的端口。在接到客戶端DNS請求時(shí),根據(jù)客戶的ip地址將請求重定向不同的BIND服務(wù)端口。
BIND響應(yīng)時(shí),再改寫相應(yīng)包的服務(wù)端口為標(biāo)準(zhǔn)的53端口。這樣就可以根據(jù)客戶端的ip地址將
不同的解析結(jié)果返回給客戶端。整個(gè)過程對于客戶端來說都是透明的。實(shí)現(xiàn)的關(guān)鍵在于運(yùn)行
不同的BIND及運(yùn)用iptables進(jìn)行ip地址及端口改寫操作。
關(guān)于iptables更為詳細(xì)的信息,請參考解決方案中作者的兩篇文章——《用iptales實(shí)現(xiàn)包
過慮型防火墻》及《用iptables實(shí)現(xiàn)NAT》。
二、配置過程
步驟1: 配置內(nèi)核
netfilter要求內(nèi)核版本不低于2.3.5,在編譯新內(nèi)核時(shí),要求選擇和netfilter相關(guān)的項(xiàng)目。這
些項(xiàng)目通常都是位于"Networking options"子項(xiàng)下。以2.4.0內(nèi)核為例,我們應(yīng)該選中的項(xiàng)目有:
[*] 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
&! nbsp; REJECT target support
Fu ll 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
其中最后兩個(gè)項(xiàng)目可以不選,但是如果你比較懷念ipchains或者ipfwadm,你也可以將其
選中,以便在2.4內(nèi)核中使用ipchians或ipfwadm。但是需要注意的是,iptables是和
ipchians/ipfwadm相對立的,在使用iptables的同時(shí)就不能同時(shí)使用ipchains/ipfwadm。
編譯成功后,這些模塊文件都位于以下目錄中
/lib/modules/2.4.0/kernel/net/ipv4/netfilter
編譯2.4.0的新內(nèi)核時(shí)還應(yīng)該注意要在"Processor type and fea! tures"中選擇和你的
CPU相對應(yīng)的正確的CPU選項(xiàng),否則新內(nèi)核可能無法正常工作。
步驟二、 配置BIND服務(wù)
缺省地,BIND服務(wù)監(jiān)聽在53端口,我們可以通過配置讓BIND運(yùn)行在不同的ip及端口上。
實(shí)現(xiàn)這一點(diǎn)并不復(fù)雜,假設(shè)我們的DNS服務(wù)器的ip地址是211.163.76.1,并且我們想?yún)^(qū)分
CERNET及非CERNET的客戶,這時(shí)我們必須運(yùn)行兩個(gè)BIND,使用不同的配置文件。可以在
使用非標(biāo)準(zhǔn)監(jiān)聽端口的BIND的配置文件中用listen-on指定BIND監(jiān)聽的端口,比如:
options {
listen-on port 54 {211.163.76.1;}
directory "/var/named_cernet";
};
可以用named的-c 選項(xiàng)指定named讀入不同的配置文件,比如:
/usr/sbin/named -u named -c /etc/named_cernet.conf
步驟三、配置重定向規(guī)則
假設(shè)監(jiān)聽在標(biāo)準(zhǔn)端口的BIND服務(wù)器為非CERNET客戶提供DNS解析,監(jiān)聽在54端口的BIND服務(wù)器
為CERNET服務(wù)器提供DNS解析,我們可以建立如下的規(guī)則腳本:
#!/bin/bash
#打開端口轉(zhuǎn)發(fā)
echo 1 >&nb! sp;/proc/sys/net/ipv4/ip_forward
#加載相關(guān)的內(nèi)核模塊
/sbi n/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&n! bsp;nat -A POSTROUTING -p tcp --sport&n bsp;54 -o eth0 -j SNAT --to 211.163.76.1:53
教育網(wǎng)網(wǎng)的朋友可以從這里這里下載該腳本,將腳本中的DNS_IP及CNET_PORT參數(shù)改成你自
己的DNS服務(wù)器地址及監(jiān)聽端口即可。
步驟四、 運(yùn)行動(dòng)態(tài)DNS
配置完成后我們啟動(dòng)DNS服務(wù)器,并且運(yùn)行相應(yīng)的規(guī)則腳本,我們的動(dòng)態(tài)DNS服務(wù)器就可以正常工作了。