DNS服务是linux下最常用的一个服务,其一般是CDN 架设前的基础。在centos6下默认使用的DNS服务包软件是bind。本地DNS缓存的作用是将根DNS或远程DNS查询的 结果在本地主机上进行缓存,加快DNS查询的速度。同时对于内网中假设只有一台主机可以上外网的情况下,也可以通过将内网主机的DNS指向能上外网的主机,从而解析出外网域名和IP的对应关系。

一、相关包与环境

其相关软件包有如下三个:

1bind-libs.x86_64      #提供库文件
2bind-utils.x86_64     #提供工具包
3bind.x86_64           #提供主程序包
4bind-chroot           #安全套件,本篇不涉及

实验环境:

  • 192.168.0.103 DNS服务器
  • 192.168.0.109 DNS测试服务器

二、安装与主配置文件

1、安装bind程序包

1# yum -y install bind bind-libs bind-utils

2、named.conf配置文件

bind DNS服务的主配置文件是/etc/named.conf,默认情况下是已经启用了本地缓存功能。不过为了加快查询速度和解决一些报错,通常情况下我们还需要一些调整 。先看下named.conf配置文件,如下:

bind-dns

其中listen与query项出于安全考虑,也可以将any设置为192.168.1.0/24这样的格式;

dump-file项需要注意的是默认情况下dns本地缓存数据都是存放在内存中,只有在使用rndc dumpdb -all 时才会将内存中的数据保存在本地盘中,保存的路径就是 该项配置的名称;

启用forwarders查询会减少本地流量的浪费,直接从转发的服务器上查询的结果返回;

默认dnssec功能是yes的,启用在日志中会出现报错,后面会提到;

named.conf最终的配置如下:

 1# cat /etc/named.conf |grep -v '//'
 2options {
 3        listen-on port 53 { any; };
 4        directory       "/var/named";
 5        dump-file       "/var/named/data/cache_dump.db";
 6        statistics-file "/var/named/data/named_stats.txt";
 7        memstatistics-file "/var/named/data/named_mem_stats.txt";
 8        allow-query     { any; };
 9        recursion yes;
10    forwarders { 114.114.114.114; 8.8.8.8;  };
11        dnssec-enable no;
12        dnssec-validation no;
13        dnssec-lookaside auto;
14        /* Path to ISC DLV key */
15        bindkeys-file "/etc/named.iscdlv.key";
16        managed-keys-directory "/var/named/dynamic";
17};
18logging {
19        channel default_debug {
20                file "data/named.run";
21                severity dynamic;
22        };
23};
24zone "." IN {
25        type hint;
26        file "named.ca";
27};
28include "/etc/named.rfc1912.zones";
29include "/etc/named.root.key";

3、根配置named.ca

在named.ca中配置有十三个根域 ,具体如下:

 1# cat /var/named/named.ca |grep -v '^;'
 2.                       518400  IN      NS      a.root-servers.net.
 3.                       518400  IN      NS      b.root-servers.net.
 4.                       518400  IN      NS      c.root-servers.net.
 5.                       518400  IN      NS      d.root-servers.net.
 6.                       518400  IN      NS      e.root-servers.net.
 7.                       518400  IN      NS      f.root-servers.net.
 8.                       518400  IN      NS      g.root-servers.net.
 9.                       518400  IN      NS      h.root-servers.net.
10.                       518400  IN      NS      i.root-servers.net.
11.                       518400  IN      NS      j.root-servers.net.
12.                       518400  IN      NS      k.root-servers.net.
13.                       518400  IN      NS      l.root-servers.net.
14.                       518400  IN      NS      m.root-servers.net.
15a.root-servers.net.     518400  IN      A       198.41.0.4
16b.root-servers.net.     518400  IN      A       192.228.79.201
17c.root-servers.net.     518400  IN      A       192.33.4.12
18d.root-servers.net.     518400  IN      A       199.7.91.13
19e.root-servers.net.     518400  IN      A       192.203.230.10
20f.root-servers.net.     518400  IN      A       192.5.5.241
21g.root-servers.net.     518400  IN      A       192.112.36.4
22h.root-servers.net.     518400  IN      A       128.63.2.53
23i.root-servers.net.     518400  IN      A       192.36.148.17
24j.root-servers.net.     518400  IN      A       192.58.128.30
25k.root-servers.net.     518400  IN      A       193.0.14.129
26l.root-servers.net.     518400  IN      A       199.7.83.42
27m.root-servers.net.     518400  IN      A       202.12.27.33
28a.root-servers.net.     518400  IN      AAAA    2001:503:ba3e::2:30
29c.root-servers.net.     518400  IN      AAAA    2001:500:2::c
30d.root-servers.net.     518400  IN      AAAA    2001:500:2d::d
31f.root-servers.net.     518400  IN      AAAA    2001:500:2f::f
32h.root-servers.net.     518400  IN      AAAA    2001:500:1::803f:235
33i.root-servers.net.     518400  IN      AAAA    2001:7fe::53
34j.root-servers.net.     518400  IN      AAAA    2001:503:c27::2:30
35k.root-servers.net.     518400  IN      AAAA    2001:7fd::1
36l.root-servers.net.     518400  IN      AAAA    2001:500:3::42
37m.root-servers.net.     518400  IN      AAAA    2001:dc3::35

其中AAAA(4A)项为IPv6项,不过目前大多数企业的网络环境中还没有用到ipv6。

4、防火墙配置

在/etc/sysconfig/iptables中增加如下配置,并重启iptables服务:

1-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
2-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT

三、优化与排错

通过上面的配置启用后虽然可以正常使用,不过在/var/log/message 和 /var/named/data/named.run 日志中会出现相关报错。

1、ipv6相关报错

在客户端上ping www.baidu.com或其他域名时,查看上面的两个日志,会在日志中发现类似如下的报错:

1error (network unreachable) resolving 'com/DNSKEY/IN': 2001:503:231d::2:30#53
2error (network unreachable) resolving 'com/DNSKEY/IN': 2001:503:a83e::2:30#53

该报错是由于启用了ipv6的原因导致的,虽然我们在/etc/named.conf中将listen项的IPv6配置已禁用,但是在named.ca配置中还有13台根域的ipv6配置。所以还需 要如下两种方法中的任一种来关闭ipv6的使用。

方法1:修改/etc/sysconfig/named配置

直接编辑配置文件/etc/sysconfig/named:

1OPTIONS="whatever" 改为  OPTIONS="-4"
2# 注意OPTIONS选项的值可以是:whatever、-4、-6中的一个

方法2:完全禁用IPv6

这部分可以参看我的博文 centos关闭ipv6 --- 这里有提供一些老版本的关闭方法。这里也提下在centos6下的关闭方法:

配置文件/etc/sysconfig/network,然后 将NETWORKING_IPV6=YES改为NETWORKING=no;关闭ip6tables这个服务;向/etc/modprobe.conf文件中,添加如下内容:

1alias ipv6 off
2alias net-pf-10 off

完了还需要重启主机。如果不想重启主机,可以参看我上面链接的博文。

2、dnssec报错

默认情况下未使用forwards转发,为了优化查询速度,我这里开启了转发 。不过不论是否开启转发,在默认启用dnsec的情况下,还会在日志中收到如下报错(虽然有报错,但不影响使用):

1error (insecurity proof failed) resolving './NS/IN': 114.114.114.114#53
2error (no valid RRSIG) resolving 'arpa/DS/IN': 114.114.114.114#53
3error (no valid RRSIG) resolving 'in-addr.arpa/DS/IN': 114.114.114.114#53
4validating @0x7ffb78470420: . NS: got insecure response; parent indicates it should be secure

访报错是由于每次验证的时候会对dns进行安全验证,验证失败时会出现上面的报错。禁用dnssec 功能即可。

四、rndc管理工具

rndc是bind为dns管理提供的一个工具,该工具参数如下:

 1reload                                 重新装入配置文件和区域
 2reload zone [class [view]]      重新装入单个区域
 3refresh zone [class [view]]     安排区域的立即维护
 4reconfig                              仅重新装入配置文件和新区域
 5stats                                   将服务器统计信息写入统计文件中
 6querylog                              切换查询日志
 7dumpdb                              将高速缓存转储到转储文件 (named_dump.db)
 8stop                                   将暂挂更新保存到主文件并停止服务器
 9halt                                    停止服务器,但不保存暂挂更新
10trace                                  将调试级别增加一级
11trace level                           更改调试级别
12notrace                              将调试级别设置为 0
13flush                                  刷新服务器的所有高速缓存
14flush [view]                        为某一视图刷新服务器的高速缓存
15status                                显示服务器的状态
16restart                               重新启动服务器(尚未实现)

上面的参数主机常用的有rndc dumpdb -all 将内存中划存的数据存放到文件,可以了解缓存了哪些域名;rndc  refresh zone 重刷某个区域(即域名);flush 清除当前缓存;stats 这个主要结合监控有用 ,和这个相关的还有rndc status 。

五、测试

配置测试主机192.168.0.109的/etc/resolv.conf文件,增加:nameserver 192.168.0.103 ,使用ping 其他域名进行测试或使用dig或nslookup进行测试,如下:

 1# dig -t NS baidu.com
 2; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> -t NS baidu.com
 3;; global options: +cmd
 4;; Got answer:
 5;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6532
 6;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
 7;; OPT PSEUDOSECTION:
 8; EDNS: version: 0, flags:; udp: 4096
 9;; QUESTION SECTION:
10;baidu.com.                     IN      NS
11;; ANSWER SECTION:
12baidu.com.              12320   IN      NS      ns7.baidu.com.
13baidu.com.              12320   IN      NS      ns2.baidu.com.
14baidu.com.              12320   IN      NS      ns3.baidu.com.
15baidu.com.              12320   IN      NS      ns4.baidu.com.
16baidu.com.              12320   IN      NS      dns.baidu.com.
17;; Query time: 158 msec
18;; SERVER: 192.168.0.103#53(192.168.0.103)  //这里就是DNS服务器的地址
19;; WHEN: Tue Nov 10 23:45:10 CST 2015
20;; MSG SIZE  rcvd: 128

参考页面:

oracle bind 相关手册

chinaunix forwards相关介绍