首先,还是在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
phoenix.com.
1
604800
86400
2419200
604800 )
;
phoenix.com.
phoenix.com.
dns.phoenix.com.
www.phoenix.com.
ftp.phoenix.com.
mail.phoenix.com.
提一下泛域名解析,其实很简单,就两行,它把所有未指定的和未知的主机名解析到默认的地址上去:
phoenix.com.
*.phoenix.com.
然后是反向搜索域数据库文件,一样也没有@符号
$TTL
0.168.192.in-addr.arpa.
1
604800
86400
2419200
604800 )
;
0.168.192.in-addr.arpa.
0.168.192.in-addr.arpa.
254.0.168.192.in-addr.arpa.
254.0.168.192.in-addr.arpa.
254.0.168.192.in-addr.arpa.
254.0.168.192.in-addr.arpa.
反向泛域名解析(我怀疑有多少应用会检查这个)
254.0.168.192.in-addr.arpa.
看明白了么?说白了也就是注意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.
// 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 {
//
// };
auth-nxdomain no;
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" {};
view "default" {
match-clients { default; };
// be authoritative for the localhost forward and reverse zones, and for broadcast zones as per RFC 1912
};
然后我去回去改/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; };
};
view "nc" {
match-clients { nc_hosts; };