在防火墙环境下DNS的安装与设置
在一般防火墙下,都是采用DMZ 区内放服务器,外部访问DMZ 区得到外部的IP ,内部访问DMZ 区时得到内部的IP 。如一个,内部IP 地址<--->放在DMZ 的web 服务器的IP <-----
在一般防火墙下,都是采用DMZ 区内放服务器,外部访问DMZ 区得到外部的IP ,内部访问DMZ 区时得到内部的IP 。
如一个,
内部IP 地址<--->放在DMZ 的web 服务器的IP <----->外部IP 地址
192.168.1.1<--->192.168.0.1<----->211.202.49.1
从DNS 上可以从以下四个方面解决:
一.iptables 应用
1. 核心思想
配置动态DNS 服务器的核心思想是:在DNS 服务器上运行多个BIND ,每个BIND 为来自不同区域的用户提供解析,因此每个BIND 都应具有不同的配置文件和域文件,并且分别监听在不同的端口。在接到客户端DNS 请求时,根据客户的ip 地址将请求重定向不同的BIND 服务端口。BIND 响应时,再改写相应包的服务端口为标准的53端口。这样就可以根据客户端的ip 地址将不同的解析结果返回给客户端。整个过程对于客户端来说都是透明的。实现的关键在于运行不同的BIND 及运用iptables 进行ip 地址及端口改写操作。
2 配置过程
步骤1: 配置内核
netfilter 要求内核版本不低于2.3.5,在编译新内核时,要求选择和netfilter 相关的项目。这些项目通常都是位于"Networking options"子项下。以2.4.0内核为例,我们应该选中的项目有: ∙ 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内核中使用ipchians 或ipfwadm 。但是需要注意的是,iptables 是和ipchians/ipfwadm相对立的,在使用iptables 的同时就不能同时使用ipchains/ipfwadm。编译成功后,这些模块文件都位于以下目录中
/lib/modules/2.4.0/kernel/net/ipv4/netfilter
编译2.4.0的新内核时还应该注意要在"Processor type and features" 中选择和你的CPU 相对应的正确的CPU 选项,否则新内核可能无法正常工作。
步骤二、 配置BIND 服务
缺省地,BIND 服务监听在53端口,我们可以通过配置让BIND 运行在不同的ip 及端口上。实现这一点并不复杂,假设我们的DNS 服务器的ip 地址是211.163.76.1,并且我们想区分CERNET 及非CERNET 的客户,这时我们必须运行两个BIND ,使用不同的配置文件。可以在使用非标准监听端口的BIND 的配置文件中用listen-on 指定BIND 监听的端口,比如:
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、配置重定向规则
假设监听在标准端口的BIND 服务器为非CERNET 客户提供DNS 解析,监听在54端口的BIND 服务器为CERNET 服务器提供DNS 解析,我们可以建立如下的规则脚本:
#!/bin/bash
#打开端口转发
echo 1 > /proc/sys/net/ipv4/ip_forward
#加载相关的内核模块
/sbin/modprobe iptable_filter
/sbin/modprobe ip_tables
/sbin/modprobe iptables_nat
#刷新所有规则
/sbin/iptables -t nat -F
,#加入来自CERNET 的DNS 请求转发规则,将其转发到本地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客户数据包的源端口(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
教育网网的朋友可以从这里下载该脚本,将脚本中的DNS_IP及CNET_PORT参数改成你自己的DNS 服务器地址及监听端口即可。
4、运行动态DNS
配置完成后我们启动DNS 服务器,并且运行相应的规则脚本,我们的动态DNS 服务器就可以正常工作了。
二。利用bind9的cache 纪录
1) 、用户向浏览器提供要访问的域名;
2) 、浏览器调用域名解析库对域名进行解析,由于CDN 对域名解析过程进行了调整,
所以解析函数库一般得到的是该域名对应的CNAME 记录,为了得到实际IP 地址,
浏览器需要再次对获得的CNAME 域名进行解析以得到实际的IP 地址;在此过程中,
使用的全局负载均衡DNS 解析,如根据地理位置信息解析对应的IP 地址,使得用户能就近访问。
3) 、此次解析得到CDN 缓存服务器的IP 地址,浏览器在得到实际的IP 地址以后,
向缓存服务器发出访问请求;
4) 、缓存服务器根据浏览器提供的要访问的域名,通过Cache 内部专用DNS 解析
得到此域名的实际IP 地址,再由缓存服务器向此实际IP 地址提交访问请求;
5) 、缓存服务器从实际IP 地址得得到内容以后,一方面在本地进行保存,
以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程;
6) 、客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。
,1、要加入CDN 服务的网站,需要域名(如www.linuxaid.com.cn, 地址202.99.11.120) 解析权提供给CDN 运营商,Linuxaid 的域名解析记录只要把www 主机的A 记录改为CNAME 并指向cache.cdn.com 即可。cache.cdn.com 是CDN 网络自定义的缓存服务器的标识。在/var/named/linuxaid.com.cn域名解析记录中,由:
www IN A 202.99.11.120
改为
www IN CNAME cache.cdn.com.
2、CDN 运营商得到域名解析权以后,得到域名的CNAME 记录,指向CDN 网络属下缓存服务器的域名,如cache.cdn.com ,CDN 网络的全局负载均衡DNS ,需要把CNAME 记录根据策略解析出IP 地址,一般是给出就近访问的Cache 地址。
Bind 9的基本功能可以根据不同的源IP 地址段解析对应的IP ,实现根据地域就近访问的负载均衡,一般可以通过Bind 9的sortlist 选项实现根据用户端IP 地址返回最近的节点IP 地址,具体的过程为:
1) 为cache.cdn.com 设置多个A 记录,/var/named/cdn.com 的内容如下:
$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中的内容为:
options {
directory "/var/named";
sortlist {
#这一段表示当在本地执行查询时
#将按照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是最靠近查询地点的节点
{ 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";
};
三。设内外DNS
外部DNS 就是一般的设置,关键在于内部的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; }; //转向到外部的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 { }; //除了内部的本域解析,其余都放到外部的DNS 上 };
四。利用bind9的view 功能
options {
directory "/var/named";
};
acl "fx_subnet" {192.253.254/24; };
view "internal" { //我们区的内部视图
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" { //相应于世界的其余部分,我们区的视图
match-clients { any; }; //隐式地
rescursion no; //我们的子网外面,它们不应该请求递归查询
zone "fx.movie.edu" {
type master;
file "db.fx.movie.edu.external"; //外部区数据文件
};
zone "254.254.192.in.arpa" {
type master;
file "db.192.253.254.external";//外部区数据文件
};
};
总结:方法一:过于复杂,并且不能解决MX 纪录的问题
方法二:实际上用别的思想来解决内外DNS 解析的问题
方法三:实际已经运用过,还可以用ACL 来做进一步的限制,就是和方法四比较起来,机器用的多了一点
方法四:感觉最好了。