以缩略语句配置BIND9谁都会,但是缩写容易产生混淆,并且长时间使用缩写会忘记语句本身的含义,这里我用FQDN格式的语句举例,配置一台主DNS服务器。
首先,还是在named.conf里添加自定义域名和对应的数据库文件,一个正向搜索域一个反向搜索域,需要注意的是,反向搜索域的域名必须以rev_ip_addr.in-addr.arpa格式起名,但是对应的数据库文件名可以随便起:
zone "phoenix.com" {
type master;

file "/etc/bind/phoenix.com";

also-notify{ 192.168.1.254; };

};

zone "0.168.192.in-addr.arpa" {
type master;

file "/etc/bind/com.phoenix";

also-notify{ 192.168.1.254; };

};

然后是正向搜索域数据库文件,注意看,没有@符号喔~
$TTL    604800
phoenix.com.    IN    SOA    phoenix.com.    root.phoenix.com. (
       ; Serial
604800        ; Refresh
86400        ; Retry
2419200        ; Expire
604800 )    ; Negative Cache TTL
;
phoenix.com.        IN    NS    dns.phoenix.com.
phoenix.com.        IN    MX 01    mail.phoenix.com.
dns.phoenix.com.    IN      192.168.0.254
www.phoenix.com.    IN      192.168.0.254
ftp.phoenix.com.    IN      192.168.0.254   
mail.phoenix.com.    IN      192.168.0.254

提一下泛域名解析,其实很简单,就两行,它把所有未指定的和未知的主机名解析到默认的地址上去:
phoenix.com.    IN      192.168.0.254
*.phoenix.com.    IN      192.168.0.254

然后是反向搜索域数据库文件,一样也没有@符号
$TTL    604800
0.168.192.in-addr.arpa.    IN    SOA    0.168.192.in-addr.arpa.    root.phoenix.com. (
       ; Serial
604800        ; Refresh
86400        ; Retry
2419200        ; Expire
604800 )    ; Negative Cache TTL
;
0.168.192.in-addr.arpa.        IN    NS    dns.phoenix.com.
0.168.192.in-addr.arpa.        IN    MX 01    mail.phoenix.com.
254.0.168.192.in-addr.arpa.    IN    PTR    dns.phoenix.com.
254.0.168.192.in-addr.arpa.    IN    PTR    www.phoenix.com.
254.0.168.192.in-addr.arpa.    IN    PTR    ftp.phoenix.com.
254.0.168.192.in-addr.arpa.    IN    PTR    mail.phoenix.com.

反向泛域名解析(我怀疑有多少应用会检查这个)
254.0.168.192.in-addr.arpa.    IN    PTR    phoenix.com.

看明白了么?说白了也就是注意FQDN写法的每个FQDN末尾记得加“.”,SOA记录的授权者和授权域名要搞清楚。

下面说说如何让bind9运行在一个chroot jail里面,由于dns是至关重要的服务,所以针对bind的攻击也越发严重,例如缓冲区溢出攻击可以导致攻击者获得bind用户权限,得到发起拿到更高权限攻击的跳板,如果我们把bind限制在一个chroot jail里面,那么即使被攻破了dns,攻击者依旧不能从这个jail里面cd出来浏览其他敏感的系统配置文件。
在ubuntu/debian系统上,我们首先需要更改bind启动参数,配置文件是/etc/default/bind9:
先把bind停掉:/etc/init.d/bind9 stop
修改/etc/default/bind9,把最后一行:
OPTIONS="-u bind"
改为
OPTIONS="-u bind -t /var/lib/bind"
然后我们要去/var/lib/bind目录下创建一系列的目录树结构以模拟一个bind运行环境:
mkdir -p /var/lib/bind/dev
mknod /var/lib/bind/dev/null c 1 3
mknod /var/lib/bind/dev/random c 1 8
chmod 666 /var/lib/bind/dev/*


mkdir -p /var/lib/bind/var/cache/bind
mkdir -p /var/lib/bind/var/run/named
chown -R bind:bind /var/lib/bind/var

mkdir -p /var/lib/bind/etc
mv /etc/bind /var/lib/named/etc
chown -R root:bind /var/lib/bind/etc
ln -s /var/lib/bind/etc/bind /etc/bind然后让服务器自己做为自己的dns服务器:
echo "search phoenix.com" > /etc/resolv.conf
echo "nameserver 127.0.0.1" >> /etc/resolv.conf

启动服务器:/etc/init.d/bind9 start
如果没报错,尝试host自己一下吧,比如:
host dns.phoenix.com
host 192.168.0.254

最后说一下dns转发,acl,及主从服务器数据安全传输:
转发就是自己并不直接解析,而是把所有的解析请求转发给自己ISP的服务器,自己本身充当了一个传话筒的角色,在ubuntu/debian系统上,转发和访问控制列表(acl)都是在/etc/bind/named.conf.options配置的,打开该文件,你会看到类似如下的结构:
options {
directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk.  See http://www.kb.cert.org/vuls/id/800113

// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.

// forwarders {
//      0.0.0.0;
// };

auth-nxdomain no;    # conform to RFC1035
listen-on-v6 { any; };
};
看到forwarders结构没,其实结构已经有了,就是给注释掉了,没配置而已,我们在被注释掉的这几行下面添加上如下内容:
forwarders {
210.22.70.3;
210.22.70.227;
};
dnssec-enable yes;
allow-query {
127.0.0.1;
192.168.0.0/24;
192.168.1.0/24;
};
forwarders 是配置转发给上级服务器的地址,allow-query是限制允许向本机发起查询的子网段,即acl。

主从dns服务器数据库的安全传输,这里假设你的主服务器地址是192.168.0.254/16,从服务器地址是192.168.1.254/16:
首先你需要有两台逻辑独立的机器,物理机虚拟机皆可,都安装了bind9:
我们需要生成一个密匙用于加密传输:
dnssec-keygen -a hmac-md5 -b 128 -n host phoenix.com
然后我们需要新建个密匙文件,其格式如下:
key "transfer" {
algorithm hmac-md5;
secret "---HASHKEY---";
};
把---HASHKEY---部分替换成刚刚生成的密匙对中.private key里包含的hashkey字符串。把这个密匙文件复制到从服务器上(dnssec-keygen生成的密匙对可以删掉了,没有用);
在主服务器上修改/etc/bind/named.conf.local,在文件末尾添加:
include "/etc/bind/transfer";
server 192.168.1.254 {
keys { transfer; };
};
第一句话将刚刚生成的key文件包含进来,其后的结构指定了具有指定ip地址的服务器可以使用指定的key同步本(主)服务器的数据库。

看到本文开头配置主服务器中有also-notify没?那句话就是用来通知从服务器的。

现在我们只需要在从服务器上修改/etc/bind/named.conf.local,在文件末尾添加:
include "/etc/bind/transfer";
zone "phoenix.com" {
type slave;
file "/etc/bind/phoenix.com";
masters { 192.168.0.254; };
allow-notify { 192.168.0.254; };
};

zone "0.168.192.in-addr.arpa" {
type slave;
file "/etc/bind/com.phoenix";
masters { 192.168.0.254; };
allow-notify { 192.168.0.254; };
};
重启主从服务器,去从服务器上找找数据库传输过去没有吧。

双线解析:

很多服务器至少是有两块网卡的,很多企业也喜欢将两块网卡接到两个不同的ISP,这两块网卡所在的子网就不同,那如果我想就同一域名针对不同网卡给出不同的IP地址,这里我们需要用acl {}; 和 view {}; 语句:

注意,一旦你启用了view,bind将会要求你所有的子网都用view语句,包括默认的几个子网,比如127.0.0.0/8, 0.0.0.0/8和255.0.0.0/8 (0.0.0.0/8和255.0.0.0/8这两个子网是不存在的,有兴趣可以看看这两个反向搜索域对应的数据库文件,里面没主机记录,将这两个子网写在dns数据库里是为了防止对这两个子网的解析意外地传到根域服务器去,具体细节参考rfc1912),在debian/ubuntu系统上,我们需要先改/etc/bind/named.conf.default

acl "default" {
        127.0.0.0/8;
        0.0.0.0/8;
        255.0.0.0/8;
};

view "default" {
match-clients { default; };

        zone "." {
                type hint;
                file "/etc/bind/db.root";
        };

// be authoritative for the localhost forward and reverse zones, and for broadcast zones as per RFC 1912

        zone "localhost" {
                type master;
                file "/etc/bind/db.local";
        };

        zone "127.in-addr.arpa" {
                type master;
                file "/etc/bind/db.127";
        };

        zone "0.in-addr.arpa" {
                type master;
                file "/etc/bind/db.0";
        };

        zone "255.in-addr.arpa" {
                type master;
                file "/etc/bind/db.255";
        };

};

然后我去回去改/etc/bind/named.conf.local

先是acl{},你可以把不同ISP所拥有的所有子网分门别类放到不同的acl里面去,bind根据dns查询的源IP给不同的解析结果,因为我只有两块网卡,所以这里我只添加两个acl和两个view,事实上你可以添加任意多的acl和view。

acl "lab_hosts" {
192.168.0.0/24;
};

acl "nc_hosts" {
192.168.1.0/24;
};
然后是view{}:
view "lab" {
match-clients { lab_hosts; };

        zone "phoenix.com" {
                type master;
                file "/etc/bind/lab.phoenix.com";
                also-notify { 192.168.0.253; };
        };

        zone "0.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/com.phoenix.lab";
                also-notify { 192.168.0.253; };
        };

        include "/etc/bind/transfer";
        server 192.168.0.253 {
                keys { transfer; };
        };
};

view "nc" {
match-clients { nc_hosts; };

        zone "phoenix.com" {
                type master;
                file "/etc/bind/nc.phoenix.com";
                also-notify { 192.168.1.253; };
        };

        zone "1.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/com.phoenix.nc";
                also-notify { 192.168.1.253; };
        };

        include "/etc/bind/transfer";
        server 192.168.1.253 {
                keys { transfer; };
        };
};

对应数据库自己改,注意两个view针对同一域名的正向解析数据库名字是不一样的喔,你需要建两个单独的数据库文件,加上两个反向数据库文件,一共四个。

测试:

在主dns上就能测试,把/etc/resolv.conf里的nameserver改成不同网卡对应的IP,host DNS服务器自己的域名试试,不同的nameserver返回不同的IP地址,看到这个效果,恭喜你配置成功。

如果你有配slave DNS,针对单一子网的slave DNS服务器没有必要也用view语句配置,只有在需要做多个子网的slave的情况下,slave DNS才需要用view语句,并且你需要将slave接入所有它备份的子网。


一本完整的bind管理员手册(英语):

http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.html


--------------------------------------------------------------------------------------------------

欢迎关注我的微博 http://weibo.com/pco18   

                                                                       您的顶帖是我发帖的动力↘