利用 BIND 9的新增功能View实现策略DNS bind9 智能DNS

kevin.Zhu 发布于:2013-1-16 0:17 分类:Bind  有 12 人浏览,获得评论 0 条  

最 初的bind是不支持通过来源选择不同的ip的,因此只能通过iptables的辅助来实现智能DNS,方法也很简单,在DNS服务器上面启动两份 bind,都不要用默认的端口,两份分别解析不同的线路,然后再用iptables将默认端口的DNS请求根据来源IP发送到不同的bind实例
这种方法缺点很明显,需要多个bind实例,如果需要更多的线路解释那就还要再开bind实例,另外iptables对来源的解释也会导致iptables太多规则

现在的bind支持了根据来源选择的功能,我不确定是不是bind9的新特性,不过bind9是重写过的,相比漏洞百出的bind8来说,稳定和安全很多,以下的配置以bind9为基础

我使用的是CentOS,由于bind服务没有其他服务(比如apache,squid)要求那么高,所以也没有必要自己编译一份,我是用过yum安装的,版本不是最新的稳定版

装好之后,可以用过/etc/init.d/named start成功启动服务
有一个文件named.conf出现在/etc下,就是bind的主config文件,我们只要改动他
(我只说明智能DNS实现部分,其他的bind设置自行修改,呵呵)
另外一个小技巧,可以通过/usr/sbin/named -g -u named来启动bind,可以立刻看到输出信息,方便调试

我们是通过bind9的view功能来分离判断的
首先,我们需要一份网通的IP列表


acl “CNC” {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16; 

}


如果觉得有哪些部分不是很准确的话,可以自行修改

由于这个部分太长了,所以写在一个专门的文件然后include进named.conf比较容易维护
例如,我们把上面这段配置保存为cnc_acl.conf
然后在named.conf写入

include “/data/named/cnc_acl.conf”;

即可


接下来就是view的配置,假设域名是xyz.com,呵呵

view “view_cnc” {

    match-clients { "CNC"; };

    recursion yes;        //表示查询方式允许递归查询Zone 

    zone “xyz.com” {

        type master;

        file “/data/named/cnc_xyz”;

    };

};


view “view_any” {

    match-clients { any; };

    recursion no;

    zone “xyz.com” {

        type master;

        file “/data/named/any_xyz”;

    };

};


所有的zone都要包含在view内 


就这样就足够了

然后我们需要cnc\_xyz和any_xyz两个具体的zone file
两个文件基本是一模一样的,就是指向不同的ip

$TTL 2h
xyz.com. IN SOA ns.xyz.com. root.xyz.com. (
20071022
2h
40m
1w
2h
)

this6.com. IN NS ns.xyz.com.
this6.com. IN MX 1 mail.xyz.com.
ns IN A 1.1.1.1
mail IN A 1.1.1.1

www IN A 1.1.1.1

根据不同的线路把www指向不同的IP即可
这样,我们就实现了自己的智能DNS