设置双重DNS服务器

一、基本思想
   为了安全的原因我们需要在Linux系统上配置双重DNS服务器,其核心思想是:在DNS服务器上运行两个BIND,分别为来自内部网络和外部网络的域名请求提供解析,每个BIND具有不同的配置文件和域名数据库文件,并分别在不同的端口监听。DNS服务器在接到客户端请求时,根据客户的IP地址将请求重定向到不同的BIND服务端口,这样就可以根据客户端的IP地址将不同的解析结果返回给客户端,而整个过程对于客户端来说都是透明的。实现的关键在于运行两个BIND及运用iptables命令进行IP地址及端口改写操作。
  #1 二、具体配置
   步骤1: 配置内核
   Netfilter要求内核版本不低于2.3.5,在编译新内核时,要求选择和netfilter相关的项目,这些项目通常都是位于“Networking options”子项下。
   步骤2:配置BIND服务
   缺省的BIND服务监听在53端口,可以通过配置,让BIND运行在任意的端口上。实现这一点并不复杂,假设DNS服务器的IP地址是192.168.200.1,并且想区分局域网和非局域网的用户,这时必须运行两个BIND,并使用不同的配置文件,在使用非标准监听端口的BIND配置文件中用listen-on命令指定BIND监听的端口。
   在/etc目录下创建两个配置文件/etc/named.conf和/etc/named.cf,DNS服务器依据配置文件的内容来决定它的行为模式以及要维护的域名资料。两个配置文件如下,其中named.conf是完整的配置文件,named.cf只列出与named.conf不同的部分。
   named.conf——为局域网用户提供域名解析服务。
   options {
   directory "/var/named1";
   //域名数据库netpub1所在的目录
   //query-source address · port 53; 在DNS默认的53端口侦听请求
   };
   zone "." IN {
   type hint;
   file "named.ca";
   };
   zone "localhost" IN {
   type master;
   file "localhost.zone";
   allow-update {none};

};
   zone "0.0.127.in-addr.arpa" IN {
   type master;
   file "named.local";
   allow-update { none;};

};
   zone "netpub.com" IN {
   type master;
   file "net1"; //内网用户的域名数据库
   };
   named.cf——为外网用户提供域名解析服务
   options {
   directory "/var/named2"; //域名数据库netpub2所在的目录
   listen-on port 1028 {192.9.200.51;}; //在DNS的1028端口侦听请求
   };
   zone "netpub.com" IN {
   type master;
   file "net2"; //外网用户的域名数据库
   };
   写好配置文件后用命令named的-c 选项指定named读入不同的配置文件:
   /usr/sbin/named -u named -c /etc/named.conf
   /usr/sbin/named -u named -c /etc/named.cf
   执行命令ps -A | grep named,显示
   1488 ? 00:00:00 named
   1489 ? 00:00:00 named
   说明两个DNS都已成功激活。
   步骤3:配置重定向转发规则
   假设DNS服务器的IP地址为192.168.200.1,监听在标准端口的BIND服务器为局域网用户提供域名解析,监听在1028端口的BIND服务器为非局域网用户提供域名解析。下面就DNS服务器前面是否架设防火墙的两种情况说明如何用iptables命令配置规则。
   1.没有防火墙的情况:在DNS主机上设置如下脚本。
   假设局域网IP地址范围为192.168.200.0~24。
   #!/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
   #来自非局域网的DNS请求转发规则,将其重定向到本地1028端口
   /sbin/iptables -t nat -A PREROUTING -p udp -s ! 192.9.200.0/24 -dport 53 -i eth0 -j REDIRECT 1028
   #将返回给非局域网用户数据包的源端口1028伪装成53端口
   /sbin/iptables -t nat -A POSTROUTING -p udp --sport 1028 -o eth0 -j SNAT --to 192.168.200.51:53
   2.有防火墙的情况:在防火墙主机上设置脚本。
   假设局域网IP地址范围为192.168.200.0~24,防火墙有两个网卡,其中eth0是局域网IP地址,eth1是非局域网IP地址。非局域网的DNS请求由防火墙的eth1接收,再由eth0转发给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
   #来自外网的DNS请求转发规则,将其转发到DNS主机的1028端口
   /sbin/iptables -t nat -A PREROUTING -p udp -d 192.168.200.1 -dport 53 -i eth1 -j DNAT -to 192.168.200.1:1028
   配置好DNS服务器的两个BIND服务,再根据具体的网络结构编写相应的规则脚本。如果它们都能正常工作,则一个双重DNS服务器就可以投入使用了。