上周可能是由于某同事的误操作,把实验室内网(针对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 的配置,我的示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
authoritative; ddns-update-style interim; ddns-updates on; ddns-domainname "jay.org"; ignore client-updates; #make network booting the SystemImager autoinstall client possible allow booting; allow bootp; default-lease-time 9600; max-lease-time 43200; #what to get to boot the autoinstall client # For most OSD, use avfmaster : pxelinux.bin filename "pxelinux.bin"; # This has to be the same key as is used in named.conf key "mykey" { algorithm hmac-md5; secret "+dC8BmjE1QnpkvwAkOPlew=="; }; # this section describes what key to use in what zone zone jay.org. { primary 192.168.22.3; key mykey; } # zone (from IP to domain name) zone 22.168.192. { primary 192.168.22.3; key mykey; } option routers 192.168.22.1; option domain-name-servers 10.22.2.5,10.23.27.228; option domain-name "jay.org smilejay.cn"; next-server 192.168.22.3; subnet 192.168.22.0 netmask 255.255.255.0 { # --- default gateway option routers 192.168.22.1; option subnet-mask 255.255.255.0; option domain-name "jay.org smilejay.cn"; option domain-name-servers 192.168.22.3,10.22.2.5,10.23.27.228; option time-offset -18000; # Eastern Standard Time range 192.168.22.100 192.168.22.240; option broadcast-address 192.168.22.255; default-lease-time 21600; max-lease-time 43200; } # 下面是一些根据MAC地址固定分配IP的一些配置 host gw{ hardware ethernet 00:0E:0C:32:30:E9; fixed-address 192.168.22.1; } host dns{ hardware ethernet 00:13:20:f5:f0:43; fixed-address 192.168.22.3; } |
另外,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 示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // key "mykey" { algorithm hmac-md5; secret "+dC8BmjE1QnpkvwAkOPlew=="; }; acl "jay.org" { 192.168.22.0/24; 127.0.0.1;}; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; 192.168.22.3; } keys { "mykey"; }; }; options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; 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 { localhost; }; recursion yes; forward first; forwarders { 10.22.2.5; 10.23.27.228; }; 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; }; }; // DNS 从域名解析为IP的区域(zone) zone "jay.org" IN { type master; file "/var/named/jay.org"; allow-transfer { 10.22.2.5; }; allow-update { key mykey; }; allow-query { any; }; }; // DNS 反向解析(从IP解析到域名) zone "22.168.192.in-addr.arpa" IN { type master; file "/var/named/22.168.192"; allow-update { key mykey; }; allow-query { any;}; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; |
我的 /var/named/jay.org 域名解析的文件如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ORIGIN . $TTL 86400 ; 1 day jay.org IN SOA jay.org. dns.jay.org. ( 705421 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS dns.jay.org. $ORIGIN jay.org. dns A 192.168.22.3 gw A 192.168.22.1 my-test A 192.168.22.20 |
配置主配置文件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 2 3 4 5 6 |
rndc reload 用于重新加载DNS配置文件和域(zone) rndc status 查看目前DNS服务器状态 rndc stop 停止DNS服务器 rndc restart 重新启动DNS服务器 rndc stats 生成DNS统计报表 rndc dumpdb 将所有缓存输入cache_dump.db文件 (默认为 /var/named/data/cache_dump.db ) |
遇到的问题:
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 文件,添加如下反向解析相关的配置:
1 2 3 4 5 6 7 |
// DNS 反向解析(从IP解析到域名) zone "22.168.192.in-addr.arpa" IN { type master; file "/var/named/22.168.192"; allow-update { key mykey; }; allow-query { any;}; }; |
当然还要配置这里提到的 /var/named/22.168.192 文件,其示例如下:
1 2 3 4 5 6 7 8 9 10 |
$TTL 86400 ; 1 day @ IN SOA jay.org. dns.jay.org. ( 1997022700 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS dns.jay.org. 3 IN PTR dns.jay.org. 1 IN PTR gw.jay.org. |
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/