DNS服务是linux下最常用的一个服务,其一般是CDN 架设前的基础。在centos6下默认使用的DNS服务包软件是bind。本地DNS缓存的作用是将根DNS或远程DNS查询的结果在本地主机上进行缓存,加快DNS查询的速度。同时对于内网中假设只有一台主机可以上外网的情况下,也可以通过将内网主机的DNS指向能上外网的主机,从而解析出外网域名和IP的对应关系。
一、相关包与环境
其相关软件包有如下三个:
bind-libs.x86_64 #提供库文件 bind-utils.x86_64 #提供工具包 bind.x86_64 #提供主程序包 bind-chroot #安全套件,本篇不涉及
实验环境:
192.168.0.103 DNS服务器
192.168.0.109 DNS测试服务器
二、安装与主配置文件
1、安装bind程序包
# yum -y install bind bind-libs bind-utils
2、named.conf配置文件
bind DNS服务的主配置文件是/etc/named.conf,默认情况下是已经启用了本地缓存功能。不过为了加快查询速度和解决一些报错,通常情况下我们还需要一些调整。先看下named.conf配置文件,如下:
其中listen与query项出于安全考虑,也可以将any设置为192.168.1.0/24这样的格式;
dump-file项需要注意的是默认情况下dns本地缓存数据都是存放在内存中,只有在使用rndc dumpdb -all 时才会将内存中的数据保存在本地盘中,保存的路径就是该项配置的名称;
启用forwarders查询会减少本地流量的浪费,直接从转发的服务器上查询的结果返回;
默认dnssec功能是yes的,启用在日志中会出现报错,后面会提到;
named.conf最终的配置如下:
# cat /etc/named.conf |grep -v '//' options { listen-on port 53 { any; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; recursion yes; forwarders { 114.114.114.114; 8.8.8.8; }; dnssec-enable no; dnssec-validation no; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
3、根配置named.ca
在named.ca中配置有十三个根域 ,具体如下:
# cat /var/named/named.ca |grep -v '^;' . 518400 IN NS a.root-servers.net. . 518400 IN NS b.root-servers.net. . 518400 IN NS c.root-servers.net. . 518400 IN NS d.root-servers.net. . 518400 IN NS e.root-servers.net. . 518400 IN NS f.root-servers.net. . 518400 IN NS g.root-servers.net. . 518400 IN NS h.root-servers.net. . 518400 IN NS i.root-servers.net. . 518400 IN NS j.root-servers.net. . 518400 IN NS k.root-servers.net. . 518400 IN NS l.root-servers.net. . 518400 IN NS m.root-servers.net. a.root-servers.net. 518400 IN A 198.41.0.4 b.root-servers.net. 518400 IN A 192.228.79.201 c.root-servers.net. 518400 IN A 192.33.4.12 d.root-servers.net. 518400 IN A 199.7.91.13 e.root-servers.net. 518400 IN A 192.203.230.10 f.root-servers.net. 518400 IN A 192.5.5.241 g.root-servers.net. 518400 IN A 192.112.36.4 h.root-servers.net. 518400 IN A 128.63.2.53 i.root-servers.net. 518400 IN A 192.36.148.17 j.root-servers.net. 518400 IN A 192.58.128.30 k.root-servers.net. 518400 IN A 193.0.14.129 l.root-servers.net. 518400 IN A 199.7.83.42 m.root-servers.net. 518400 IN A 202.12.27.33 a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30 c.root-servers.net. 518400 IN AAAA 2001:500:2::c d.root-servers.net. 518400 IN AAAA 2001:500:2d::d f.root-servers.net. 518400 IN AAAA 2001:500:2f::f h.root-servers.net. 518400 IN AAAA 2001:500:1::803f:235 i.root-servers.net. 518400 IN AAAA 2001:7fe::53 j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30 k.root-servers.net. 518400 IN AAAA 2001:7fd::1 l.root-servers.net. 518400 IN AAAA 2001:500:3::42 m.root-servers.net. 518400 IN AAAA 2001:dc3::35
其中AAAA(4A)项为IPv6项,不过目前大多数企业的网络环境中还没有用到ipv6。
4、防火墙配置
在/etc/sysconfig/iptables中增加如下配置,并重启iptables服务:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -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或其他域名时,查看上面的两个日志,会在日志中发现类似如下的报错:
error (network unreachable) resolving 'com/DNSKEY/IN': 2001:503:231d::2:30#53 error (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:
OPTIONS="whatever" 改为 OPTIONS="-4" # 注意OPTIONS选项的值可以是:whatever、-4、-6中的一个
方法2:完全禁用IPv6
这部分可以参看我的博文 centos关闭ipv6 --- 这里有提供一些老版本的关闭方法。这里也提下在centos6下的关闭方法:
配置文件/etc/sysconfig/network,然后 将NETWORKING_IPV6=YES改为NETWORKING=no;关闭ip6tables这个服务;向/etc/modprobe.conf文件中,添加如下内容:
alias ipv6 off alias net-pf-10 off
完了还需要重启主机。如果不想重启主机,可以参看我上面链接的博文。
2、dnssec报错
默认情况下未使用forwards转发,为了优化查询速度,我这里开启了转发 。不过不论是否开启转发,在默认启用dnsec的情况下,还会在日志中收到如下报错(虽然有报错,但不影响使用):
error (insecurity proof failed) resolving './NS/IN': 114.114.114.114#53 error (no valid RRSIG) resolving 'arpa/DS/IN': 114.114.114.114#53 error (no valid RRSIG) resolving 'in-addr.arpa/DS/IN': 114.114.114.114#53 validating @0x7ffb78470420: . NS: got insecure response; parent indicates it should be secure
访报错是由于每次验证的时候会对dns进行安全验证,验证失败时会出现上面的报错。禁用dnssec 功能即可。
四、rndc管理工具
rndc是bind为dns管理提供的一个工具,该工具参数如下:
reload 重新装入配置文件和区域 reload zone [class [view]] 重新装入单个区域 refresh zone [class [view]] 安排区域的立即维护 reconfig 仅重新装入配置文件和新区域 stats 将服务器统计信息写入统计文件中 querylog 切换查询日志 dumpdb 将高速缓存转储到转储文件 (named_dump.db) stop 将暂挂更新保存到主文件并停止服务器 halt 停止服务器,但不保存暂挂更新 trace 将调试级别增加一级 trace level 更改调试级别 notrace 将调试级别设置为 0 flush 刷新服务器的所有高速缓存 flush [view] 为某一视图刷新服务器的高速缓存 status 显示服务器的状态 restart 重新启动服务器(尚未实现)
上面的参数主机常用的有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进行测试,如下:
# dig -t NS baidu.com ; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7 <<>> -t NS baidu.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6532 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;baidu.com. IN NS ;; ANSWER SECTION: baidu.com. 12320 IN NS ns7.baidu.com. baidu.com. 12320 IN NS ns2.baidu.com. baidu.com. 12320 IN NS ns3.baidu.com. baidu.com. 12320 IN NS ns4.baidu.com. baidu.com. 12320 IN NS dns.baidu.com. ;; Query time: 158 msec ;; SERVER: 192.168.0.103#53(192.168.0.103) //这里就是DNS服务器的地址 ;; WHEN: Tue Nov 10 23:45:10 CST 2015 ;; MSG SIZE rcvd: 128
参考页面:
《centos6下BIND配置DNS缓存服务》有1条评论