Linux/Fedora17上DHCP和DNS服务器的配置方法和问题分析

上周可能是由于某同事的误操作,把实验室内网(针对192.168.22.0)的DHCP服务器暴露到公司普通网络(10.22.0.0)中了,导致一些本来该获取到10.22.x.x IP的服务器都得到了192.168.22.0这个实验室内的网络IP。所以,我就去看了一下这个问题(后来确认是一条网线被插错到了一个连接外网的交换机上)。但当我想去看实验室中那个DHCP和DNS(它们公用一个服务器)服务器时,发现那服务器也磁盘系统几乎崩溃,重新启动就再也进不了系统了,所以我又不得不重新搭建一套DHCP和DNS服务器。算是第一次从头开始搭建DHCP和DNS服务器,搭建过程并不是很顺利,遇到各种问题,原本以为一两个小时可以搞定的事情,花了我整整一天的时间。这里简单记一下搭建过程、配置文件和遇到的各种问题吧。

0. DHCP和DNS软件配置之前的各种问题
最初那台破机器还是Intel奔腾时代的产物(估计是2003或2004年被加入到该实验室的),我安装了RHEL6.3后还不能启动,换了硬盘后,也遇到各种问题,后来换装Fedora 17 操作系统,基本正常是用了。不过后来,还是找老板拿了台稍微新一点强大一点的机器(Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz)。

1. DHCP的安装与配置
安装dhcp软件包:dhcp-4.2.4-16.P2.fc17.x86_64
DHCP服务器的配置文件为:/etc/dhcp/dhcpd.conf (如果是IPv6,则为dhcpd6.conf)
启动dhcp服务器的命令很简单就是: dhcpd
关键是其配置文件 dhcpd.conf 的配置,我的示例如下:

另外,dhcpd.leases 文件(Fedora中默认为/var/lib/dhcpd/dhcpd.leases)记录着那些被分配了的IP地址的记录。

2. DNS服务器(BIND)的安装与配置
DNS服务器软件:bind 软件包 和 bind-utils软件包。 bin-utils提供了dig、nslookup等DNS查询的命令行工具。
BIND (Berkeley Internet Name Domain), the DNS server included in Fedora.
配置文件:/etc/named.conf (主配置文件) 和 /etc/named/ 目录中的文件。
我的主配置文件 named.conf 示例如下:

我的 /var/named/jay.org 域名解析的文件如下所示:

配置主配置文件named.conf文件(/etc/named.conf),需要主要以下的内容:
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
Fedora 17中,默认仅仅在回环地址127.0.0.1和::1(IPV6的回环地址)上打开53端口,如果希望在所有地址上都打开53端口,则应该修改成:
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
(否则其他机器不能正常连接到该DNS服务器)

allow-query { localhost; };
Fedora 17 中的DNS服务器默认只允许127.0.0.1这个客户端(即本机)发起查询,一般我们需要允许所有人查询,则因该修改成:
allow-query { any; };

转发功能的配置:(在区域zone的配置文件中找不到DNS记录时,DNS服务器可以向另外一些DNS服务器转发该查询请求,然后将结果返回给用户。)
forward first; //如果这里配置为 only,则是只提供转发功能,自身域名解析记录,这可用于公司内部作为外部DNS的缓存。
forwarders { 10.22.2.5; 10.23.27.228;};

3. rndc工具(域名服务器管理工具 name server control utility)

遇到的问题:
1. 运行 rndc status 命令时,出现如下错误
rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
rndc: get key: not found
其原因是:/etc/rndc.key 文件不存在。
简单的解决方案是:Simple solution
用“rndc-confgen -a”命令重新生成 /etc/rndc.key文件,注意:这里生成的rndc.key文件,需要拷贝到named.conf的key这一项中,需要匹配差能够用rndc工具管理named服务器。
Default behavior
Utility rndc uses /etc/rndc.key automatically if /etc/rndc.conf is not provided.

2. 在 /var/log/messages 中看到如下错误:
Dec 8 12:35:28 mydns dhcpd: DHCPREQUEST for 192.168.22.128 from 00:1b:21:61:b1:63 (snb10) via em1
Dec 8 12:35:28 mydns dhcpd: DHCPACK on 192.168.22.128 to 00:1b:21:61:b1:63 (snb10) via em1
Dec 8 12:35:28 mydns dhcpd: Unable to add forward map from snb10.jay.org to 192.168.22.128: SERVFAIL
原因:/var/named 目录需要对运行 named 的用户的具有可写权限(通常采用named用户用于运行named服务)。
Make sure this user has write permission on the directory /var/named and all the files in it.
解决方案:修改 /var/named 的权限
chown root:named /var/named -R
chmod g+w /var/named -R
drwxrwx---. 5 root named 4096 Dec 8 15:33 named

3. 在 /var/log/messages 中看到如下错误:
Dec 8 12:35:28 dns named[15429]: client 192.168.22.3#26525/key mykey: signer "mykey" approved
Dec 8 12:35:28 dns named[15429]: client 192.168.22.3#26525/key mykey: updating zone 'jay.org/IN': adding an RR at 'vt-snb10.jay.org' A
Dec 8 12:35:28 dns named[15429]: client 192.168.22.3#26525/key mykey: updating zone 'jay/IN': adding an RR at 'snb10.jay.org' TXT
Dec 8 12:35:28 dns named[15429]: /var/named/jay.org.jnl: create: permission denied
Dec 8 12:35:28 dns named[15429]: client 192.168.22.3#26525/key mykey: updating zone 'jay.org/IN': error: journal open failed: unexpected error
原因:DHCP配置文件(dhcpd.conf)中的key 和 DNS配置文件(named.conf)中的 key 不一致。
我在 named.conf 中配置了 jay.org 域的更新权限需要的key为:allow-update { key mykey; }; 而 dhcpd.conf 的值配错了,与它不一致。
解决方案:将 dhcpd.conf 中的 key值 与 named.conf中的对应key值改为相同的即可;就像本文中前面示例配置文件中的那样。

4. DNS的转发(forward)没成功:如"jay-linux.smile.org"这个域名并非jay.org域中的,若本地DNS服务器中zone中没有该记录,它是应该向配置的转发DNS服务器请求结果的,但是它却没有这么做成功。 /var/log/messges 文件中的错误信息如下:
Dec 8 12:38:32 mydns named[15429]: error (no valid RRSIG) resolving 'com/DS/IN': 10.23.27.228#53
Dec 8 12:38:32 mydns named[15429]: error (no valid RRSIG) resolving 'com/DS/IN': 10.22.2.5#53
原因:由于最初Fedora 17的默认配置了一些DNS安全验证的参数,所以它拒绝返回给用户一个未经验证的回答(non-validated answer)。
The problem was enabled DNSSEC on the local BIND server. It refused to return non-validated answers. In order to switch it off, modify /etc/named.conf to use these lines:
解决方案:修改 /etc/named.conf 配置文件的如下郎航,取消一些安全验证的设置(设置为 no )即可。
dnssec-enable no;
dnssec-validation no;

5. 用 “nslookup 192.168.22.3”命令来反向查询该IP的域名,看到如下错误提示:
** server can't find 3.22.168.192.in-addr.arpa.: NXDOMAIN
原因是: DNS服务器没有配置反向解析功能
解决方案:修改 named.conf 文件,添加如下反向解析相关的配置:

当然还要配置这里提到的 /var/named/22.168.192 文件,其示例如下:

DNS域名解析服务的基本工作过程如下:
1、客户端需要访问www.smilejay.cn网站,首先查找本地dns缓存是否存在www.smilejay.cn的IP记录。
2、如果本地缓存没有记录,则向本地首选DNS服务器发送www.smilejay.cn的DNS查询请求。
3、本地首选的DNS服务器接收查询请求后,首先在本服务器管理的区域(zone)的记录中查找,如果找到相应的记录,则利用此记录进行解析。如果没有区域zone信息可以满足查询请求,服务器就在本地的缓存中查找,如果找到相应的记录则查询过程结束。如果在本地缓存中找不到记录,则向其named.conf配置的转发DNS服务器转发查询请求,如果从转发服务器中查询到了该记录,则本地DNS服务器把该记录缓存到本地的缓存中,然后向请求DNS查询的用户返回查询到的结果。如果到配置的转发服务器中也不能查询到该记录,则向根DNS服务器发送DNS解析请求。
4、根DNS服务器向本地DNS服务器返回可以拥有此域名记录的DNS服务器的记录(即此域名的DNS服务器)。
5、本地DNS服务器向此域名的DNS服务器发送DNS解析请求。
6、此域名的DNS服务器查找此域名的IP地址,并返回给本地DNS服务器。
7、本地DNS服务器对此记录进行缓存,并返回给客户端此域名的DNS解析结果。

本文参考过如下资料:
http://docs.fedoraproject.org/en-US/Fedora/17/html-single/System_Administrators_Guide/index.html
http://spectlog.com/content/BIND_rndc:_neither_/etc/rndc.conf_nor_/etc/rndc.key_was_found
http://hi.baidu.com/glc400/item/be4bf953d13fda908d12ed30
http://dreamfire.blog.51cto.com/418026/165730
http://en.wikipedia.org/wiki/List_of_DNS_record_types
http://www.centos.bz/2012/08/dns-working-principle/ (还配有动画讲解)
http://shitou118.blog.51cto.com/715507/239958/

master

Stay hungry, stay foolish.

发表评论

邮箱地址不会被公开。 必填项已用*标注

*