RedHat搭建DNS服务器的方法
由于人类对于数字远远不如文字来得敏感,偏偏计算机的世界中仅认识0,1而已。为了将两者结合起来,于是就有了主机名称与IP的对应,这个对应的协议就是DNS。
DNS的作用就是正向将ip地址解析为域名,人们记忆起来会比较方便。本篇文章将会介绍如何在linux下部署dns服务器。
以下是部署dns的过程:
基本场景
某单位需要配置两台 DNS 服务器来实现域名解析。
wKioL1P-9Y3hX4dFAAA-zgRxBuI282.gif
您的实验环境的 IP 地址
ns1.abc.local ns2.abc.local
192.168.1.241 192.168.1.242
需要完成以下域名的解析:
- ftp.abc.local
- 10.0.0.1
- mailsrv1.abc.local 10.0.0.2
- smtp.abc.local
- 10.0.0.2
- pop3.abc.local
- 10.0.0.2
- www.abc.local
- 10.0.0.3、10.0.0.4(两个主机,以平衡负荷)
smtp 及 pop3 需要使用 CNAME 来进行解析。同时,需要实现反向地址解析。
2. 实验环境
2.1. 服务器安装
- # cat /etc/redhat-release
- Red Hat Enterprise Linux Server release 6.4 (Santiago)
- # uname -a
- Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29
- 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
2.2. 服务器基本配置
ns1.abc.local 的配置。
修改IP地址。 (注意:根据您的实现环境进行配置)
- # vi /etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- TYPE=Ethernet
- ONBOOT=yes
- NM_CONTROLLED=yes
- BOOTPROTO=static
- IPADDR=192.168.1.241
- NETMASK=255.255.255.0
- GATEWAY=192.168.1.1
修改主机名
- # vi /etc/sysconfig/network
- NETWORKING=yes
- #HOSTNAME=localhost.localdomain
- HOSTNAME=ns1.abc.local
重新启动以便主机名更改生效
# reboot
为了方便实验,将防火墙关闭
# service iptables stop
# chkconfig iptables off
同时关闭 selinux (这时十分重要的,不然很多都是实现不了)
- # vi /etc/sysconfig/selinux
- # This file controls the state of SELinux on the system.
- # SELINUX= can take one of these three values:
- # enforcing - SELinux security policy is enforced.
- # permissive - SELinux prints warnings instead of enforcing.
- # disabled - No SELinux policy is loaded.
- #SELINUX=enforcing
- SELINUX=disabled
- # SELINUXTYPE= can take one of these two values:
- # targeted - Targeted processes are protected,
- # mls - Multi Level Security protection.
- SELINUXTYPE=targeted
与此类似,修改 ns2.abc.local 的配置。
3. DNS 客户机配置
修改/etc/resolv.conf 将 DNS 服务器配置
- # vi /etc/resolv.conf
- nameserver 192.168.1.241
- nameserver 192.168.1.242
测试解析域名 www.xiaoxiongboke.com
# nslookup www.xiaoxiongboke.com
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached
问题:为什么无法解析?
回答:本机 DNS 服务器没有启动,通过以下命令检查 named 是否启动
# ps aux | grep named
root 1776 0.0 0.0 103236 860 pts/0 S+ 20:15 0:00 grep named
切换 DNS 服务器,再重新进行尝试
- # nslookup
- > server 202.102.224.68 (指向另一台服务器,外网)
- Default server: 202.102.224.68
- Address: 202.102.224.68#53
- > www.xiaoxiongboke.com
- Server: 202.102.224.68
- Address: 202.102.224.68#53
Non-authoritative answer: (非权威应答,意思是从别的dns服务器那里得到的答案,这个提示是正常的,因为总是有人会误以为是错误的)
- www.xiaoxiongboke.com canonical name = jupiter.xiaoxiongboke.com.
- jupiter.xiaoxiongboke.com canonical name = polaris.xiaoxiongboke.com.
- Name: polaris.sina.com.cn
- Address: 202.108.33.60
- > exit
问题:为什么这样可以解析?
回答:切换了 DNS 服务器,而且本机可以访问 Internet
4. DNS 服务器组件安装
4.1. 通过 rpm 来进行安装
- # mkdir /mnt/cdrom
- # mount /dev/cdrom /mnt/cdrom/
- mount: block device /dev/sr0 is write-protected, mounting read-only
- # cd /mnt/cdrom/Packages/
- # ls bind*
- bind-9.8.2-0.17.rc1.el6.x86_64.rpm
- bind-dyndb-ldap-2.3-2.el6.x86_64.rpm
- bind-libs-9.8.2-0.17.rc1.el6.x86_64.rpm
- bind-chroot-9.8.2-0.17.rc1.el6.x86_64.rpm
- bind-libs-9.8.2-0.17.rc1.el6.i686.rpm
- bind-utils-9.8.2-0.17.rc1.el6.x86_64.rpm
- # rpm -Uvh bind-9.8.2-0.17.rc1.el6.x86_64.rpm
- error: Failed dependencies:
- portreserve is needed by bind-32:9.8.2-0.17.rc1.el6.x86_64
- # rpm -Uvh bind-9.8.2-0.17.rc1.el6.x86_64.rpm \
- portreserve-0.0.4-9.el6.x86_64.rpm
- Preparing... ########################################### [100%]
- 1:portreserve ########################################### [ 50%]
- 2:bind ######################### [100%]
4.2. 通过 yum 来进行安装
还可以通过 yum 来进行安装,前提条件是配置过 yum 的 repositories
还有如果你的虚拟机是可以联网的,就不用再配置yum库了,直接用下面的命令从网上下载资源安装
# yum -y install bind
4.3. 基本配置
查看配置文件
- # rpm -qc bind
- /etc/logrotate.d/named
- /etc/named.conf
- /etc/named.iscdlv.key
- /etc/named.rfc1912.zones
- /etc/named.root.key
- /etc/rndc.conf
- /etc/rndc.key
- /etc/sysconfig/named
- /var/named/named.ca
- /var/named/named.empty
- /var/named/named.localhost
- /var/named/named.loopback
其中,/etc/named.conf 为主配置文件。
新开一个会话,通过 tail -f 命令观察日志:
# tail -f /var/log/messages
启动服务
# service named start
Generating /etc/rndc.key:
第一次生成 key 会慢一些。
[ OK ]
Starting named: [ OK ]
生成 key 慢,这是一个已知的问题。以后就不会出现此问题了。
# service named restart
Stopping named: . [ OK ]
Starting named: [ OK ]
速度很快
# ps aux | grep named
named 1862 0.0 0.5 159204 11048 ? Ssl 20:33 0:00 /usr/sbin/named -u named
root 1870 0.0 0.0 103236 860 pts/0 S+ 20:35 0:00 grep named
修改配置文件。
在修改之前,先进行备份,这是一个好习惯
- # cp /etc/named.conf /etc/named.conf.original
- # netstat -an | grep :53
- tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
- tcp 0 0 ::1:53 :::* LISTEN
- udp 0 0 127.0.0.1:53 0.0.0.0:*
- udp 0 0 ::1:53
- # vi /etc/named.conf
注意配置文件中的分号
建议:先将原有配置注释,再写新的配置,如下所示
- options {
- //listen-on port 53 { 127.0.0.1; };
- listen-on port 53 { any; };
将 dnssec 设置"yes"修改为 no,示例如下:
- //dnssec-enable yes;
- dnssec-enable no;
- //dnssec-validation yes;
- dnssec-validation no;
- dnssec-lookaside auto;
将 allow-query 设置修改为 any,示例如下:
- //allow-query { localhost; };
- allow-query { any; };
重新启动服务
- # service named restart
- Stopping named: . [ OK ]
- Starting named: [ OK ]
- # netstat -an | grep :53
- tcp 0 0 192.168.1.241:53 0.0.0.0:* LISTEN
- tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
- tcp 0 0 ::1:53 :::* LISTEN
- udp 0 0 192.168.1.241:53 0.0.0.0:*
- udp 0 0 127.0.0.1:53 0.0.0.0:*
- udp 0 0 ::1:53
- # chkconfig named on
- # chkconfig --list named
- named 0:off 1:off 2:on 3:on 4:on 5:on 6:off
此时的 DNS 服务器是 cache only 服务器,只有 root 域的记录。
5. 主 DNS 服务器配置
5.1. 创建正向 ZONE
# vi /etc/named.conf
会看到 directory "/var/named";
配置文件的目录中/var/named
在配置文件的后面添加如下信息
- zone "abc.local" IN {
- type master;
- file "abc.local.zone";
- };
- # cd /var/named/
- # ls
- data dynamic named.ca named.empty named.localhost named.loopback slaves
使用空白模板来进行创建新的 zone 文件
- # cp named.empty abc.local.zone
- # vi abc.local.zone
- $TTL 3H
- @ IN SOA ns1.abc.local. admin.abc.local. (
- 0 ; seria 序列号
- 1D ; refresh 辅助域名服务器多少时间更新数据
- 1H ; retry 若辅助域名服务器更新数据失败,多少时间再试
- 1W ; expire 若辅助域名服务器无法从主服务器上更新数据,原有数据有效期
- 3H ) ; minimum 若资源记录没有设定 TTL,则以此 TTL 为准
- NS ns1.abc.local.
- ns1 A 192.168.1.241
- ftp A 10.0.0.1
- mailsrv1 A 10.0.0.2
- www A 10.0.0.3
- www A 10.0.0.4
- smtp CNAME mailsrv1.abc.local.
- pop3 CNAME mailsrv1.abc.local.
修改新创建配置文件的属主。
# chown root:named /var/named/abc.local.zone
# rndc status
修改配置之后,有两种方法以修改生效
方法 1:重新启动服务
- # service named restart
- Stopping named: [ OK ]
- Starting named: [ OK ]
方法 2:使用 rndc
# rndc reload
server reload successful
测试一下:
- # nslookup ns1.abc.local
- # nslookup mailsrv1.abc.local
- # nslookup smtp.abc.local
- # nslookup pop3.abc.local
- # nslookup www.abc.local
- # nslookup www.abc.local
注意观察,两次对 www.abc.local 解析的结果的不同
- Server: 192.168.1.241
- Address: 192.168.1.241#53
- # rndc status
- version: 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6
- CPUs found: 1
- worker threads: 1
- number of zones: 20
增加了一个 zone
- debug level: 0
- xfers running: 0
- xfers deferred: 0
- soa queries in progress: 0
- query logging is OFF
- recursive clients: 0/0/1000
- tcp clients: 0/100
- server is up and running
5.2. 创建反向 ZONE
# vi /etc/named.conf
在配置文件的后面添加如下信息,这里一定要写反向的地址
- zone "0.0.10.in-addr.arpa" IN {
- type master;
- file "10.0.0.zone";
- };
- # cd /var/named/
- # cp abc.local.zone 10.0.0.zone
- # vi 10.0.0.zone
修改配置文件,内容如下:
- $TTL 3H
- @ IN SOA ns1.abc.local. admin.abc.local. (
- 0 ; serial
- 1D ; refresh
- 1H ; retry
- 1W ; expire
- 3H ) ; minimum
- NS ns1.abc.local.
- 1 PTR ftp.abc.local.
- 2 PTR mailsrv1.abc.local.
- 3 PTR www.abc.local.
- 4 PTR WWW.abc.local.
- ~
修改新创建配置文件的属主。
- # chown root:named /var/named/10.0.0.zone
- # rndc reload
- server reload successful
查看日志文件中是否有错误信息
- # rndc status
- version: 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6
- CPUs found: 1
- worker threads: 1
- number of zones: 21
增加了一个 zone
- debug level: 0
- xfers running: 0
- xfers deferred: 0
- soa queries in progress: 0
- query logging is OFF
- recursive clients: 0/0/1000
- tcp clients: 0/100
- server is up and running
验证一下:
- # nslookup 10.0.0.1
- Server: 192.168.1.241
- Address: 192.168.1.241#53
- 1.0.0.10.in-addr.arpa name = ftp.abc.local.
- # nslookup 10.0.0.2
- Server: 192.168.1.241
- Address: 192.168.1.241#53
- 2.0.0.10.in-addr.arpa name = mailsrv1.abc.local.
- # nslookup 10.0.0.3
- Server: 192.168.1.241
- Address: 192.168.1.241#53
- 3.0.0.10.in-addr.arpa name = www.abc.local.
- # nslookup 10.0.0.4
- Server: 192.168.1.241
- Address: 192.168.1.241#53
- 4.0.0.10.in-addr.arpa name = WWW.abc.local.
6.配置转发器
场景:
缺省情况下, DNS 服务器为会为不在本机所管理的域信息通过迭代的方式从根服务器查起。由于多数根服务器主要在国外,速度比较慢。现在希望通过配置转发器,将查询发给本地 ISP 的 DNS 服务器以提高效率。 以郑州为例,可以使用:
网通:202.102.224.68、202.102.227.68
电信:219.150.150.150
操作:
修改 DNS 主配置文件
# vi /etc/named.conf
在全局配置语句 option 中添加 forwarders 配置,注意分号
- options {
- ……
- forwarders {202.102.224.68; 202.102.227.68; 219.150.150.150; };
- };
需要重新启动 DNS 服务
# service named restart
我们可以通过 tcpdump 等抓包工具来查看是否进行了转发。
# tcpdump -n port 53
再打开一个会话,运行以下命令使用# nslookup www.msn.com 命令触发一个解析请求。 观察 tcpdump 的输出结果
- tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
- 11:39:25.862065 IP 192.168.1.241.60113 > 202.102.227.68.domain: 58544+% [1au] A?
- www.msn.com. (40)
- 11:39:25.862190 IP 192.168.1.241.62826 > 202.102.227.68.domain: 57413+ [1au] NS? . (28)
- 11:39:26.108518 IP 202.102.227.68.domain > 192.168.1.241.60113: 58544 2/0/1 CNAME
- us.co1.cb3.glbdns2.microsoft.com., A 131.253.13.140 (99)
- 11:39:26.108755 IP 202.102.227.68.domain > 192.168.1.241.62826: 57413 13/0/11 NS
- e.root-servers.net., NS j.root-servers.net., NS m.root-servers.net., NS g.root-servers.net., NS
- b.root-servers.net., NS h.root-servers.net., NS f.root-servers.net., NS a.root-servers.net., NS
- k.root-servers.net., NS c.root-servers.net., NS l.root-servers.net., NS i.root-servers.net., NS
- d.root-servers.net. (423)
- 11:39:26.109540 IP 192.168.1.241.25836 > 202.102.224.68.domain: 61158+% [1au] A?
- us.co1.cb3.glbdns2.microsoft.com. (61)
- 11:39:26.110633 IP 202.102.224.68.domain > 192.168.1.241.25836: 61158 1/0/1 A
- 131.253.13.140 (77)
可以看到,随机的转发到202.102.227.68上,查询到结果,解析出了www.msn.com
7. 辅助 DNS 服务器配置
场景:
为了提高域名服务可靠性,防止单点失败,企业新添加一个 DNS 服务器。由它作为abc.local 的辅助 DNS 服务器。
辅助名称服务主机为 ns2,IP 地址为 192.168.1.242
7.1. DNS 组件安装
与主 DNS 安装类似.
- # mount /dev/cdrom /mnt/cdrom/
- # cd /mnt/cdrom/Packages/
- # rpm -ivh bind-9.8.2-0.17.rc1.el6.x86_64.rpm \
- bind-libs-9.8.2-0.17.rc1.el6.x86_64.rpm \
- portreserve-0.0.4-9.el6.x86_64.rpm
7.2. 配置 Zone 传递
在 NS1 上修改配置主配置文件,添加 ns2 的 NS 及 AY 记录。
- [root@ns1 ~]# vi /var/named/abc.local.zone
- $TTL 3H
- @ IN SOA ns1.abc.local. admin.abc.local. (
- 0 ; serial
- 1D ; refresh
- 1H ; retry
- 1W ; expire
- 3H ) ; minimum
- NS ns1.abc.local.
- NS ns2.abc.local.