且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

更新时间:2022-09-22 08:16:42

本节书摘来自异步社区《DNS与BIND(第5版)》一书中的第4章,第4.7节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。

4.7 运行一个Primary名称服务器

现在已经创建了区域数据文件,并准备好开始运行几个名称服务器了。需要建立两个名称服务器:primary名称服务器和slave名称服务器。在启动名称服务器之前,请确保syslog守护进程(daemon)已经在运行了。如果名称服务器在读取配置文件和区域数据文件时发现了错误,那么它就会向syslog守护进程发送日志消息。如果错误很严重,则名称服务器就会退出。如果使用BIND 9的named-checkconf和named-checkzone进行了检查,那么应该已经准备就绪了。但为了安全起见,***再检查下syslog中的错误。

4.7.1 启动名称服务器
在这里,假设正在运行的机器上安装的是BIND名称服务器,并且支持工具nslookup也已安装好。检查一下named的使用手册,以找到名称服务器的可执行程序所存放的目录,并核实它们确实存在于系统内。在BSD系统上,名称服务器的可执行程序一般存放在/etc目录下,但有时也会被移动到/usr/sbin目录。其他可以找到named的地方包括/usr/etc/in.named以及/usr/sbin/in.named。以下描述会假设名称服务器存放在/usr/sbin目录中。

要启动名称服务器,必须成为超级用户(root)。名称服务器会在一个保留的端口上监听查询,所以它需要root权限。第一次应以命令行方式启动名称服务器,以测试它是否运行正常。随后,将介绍如何在系统启动时自动运行名称服务器。

下面的命令将启动名称服务器。在主机toystory.movie.edu上执行以下命令:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/5ed1f3706db9574888c8320d9844410ee362f6f9.png" >

该命令会假设配置文件的名称是/etc/named.conf。当然也可以把配置文件放在其他地方,但是必须使用-c命令行选项来告诉名称服务器配置文件在何处:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

4.7.2 检查Syslog错误
名称服务器启动后,要做的第一件事就是检查syslog文件,看看是否有错误消息。如果对syslog还不熟悉,可以查看syslog.conf的使用手册中对syslog配置文件的介绍,或是查看syslogd的使用手册中对syslog守护进程的介绍。名称服务器会以named为名利用daemon设备将这些消息记录到日志中。因此,只要在/etc/syslog.conf中查找daemon设备,便可知道syslog消息被记录在何处。


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

在这台主机上,名称服务器的syslog消息会被记录到/var/adm/messages文件中,syslog只保存严重级别(severity)为LOG_NOTICE或更高的消息。某些有用的消息是以LOG_INFO的严重级别被发送的;可能也会希望看到这些信息。在阅读完本书第7章对于syslog消息更加详细的介绍后,就能决定是否要改变记录的等级了。

当名称服务器启动时,它会记录一条启动消息:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

启动消息并不是一条错误消息,但是与之一起的其他消息可能是错误消息。最常见的错误是出现在区域数据文件或配置文件中的语法错误。例如,如果在地址记录中忘了指定资源记录类型:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

那么就会看到如下syslog错误消息:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

或者,如果在/etc/named.conf中把“zone”拼写错了:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

那么就会看到如下syslog错误消息:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

如果BIND发现某个名称未遵循RFC 952规范,那么就会看到如下syslog错误消息:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/3cb61395a4ef7879379be2e1c505899f2255f614.png" >

如果出现了一个语法错误,那么可以检查syslog错误消息中提到的行号,看看能否找到问题。既然已经知道区域数据文件的大致模样了,也应该能找出大部分常见的语法错误。否则,就不得不到附录A中去查看所有资源记录的语法细节。如果能够修正该语法错误,那就修正它,然后通过ndc(BIND 8)或rndc(BIND 9)去重载(reload)名称服务器——这里的ndc代表name daemon controller。


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/c795b6787f6cbb4673ba4e7435f7619d435033d7.png" >

这样,名称服务器就会重新读取区域数据文件1。在本书第7章,将会介绍更多使用ndc和rndc控制名称服务器的内容。

4.7.3 用nslookup来测试设置
如果已经正确地建立了本地区域,并且已经连接到Internet,那么就应该能够查询到本地以及远程的域名。现在将一步一步地介绍如何通过nslookup进行查找。虽然本书专门用了一整章(第12章)来介绍nslookup,但是在这里也将介绍足够的细节以进行基本的名称服务器测试。

1.设置本地域名

在运行nslookup之前,必须先设置主机的本地域名。设置好以后,就能够直接使用carrie进行查询,而不必拼写出完整的carrie.movie.edu;因为系统会自动在末尾添加上域名movie.edu。

设置本地域名有两种方式:hostname(1)或者/etc/resolv.conf。有些人会说,在实际操作中大多数的站点都使用/etc/resolv.conf来设置本地域名。但是使用两种方式中的任何一种都可以。在本书中,假定本地域名来自于hostname(1)。

创建一个称作/etc/resolv.conf的文件,将下面这行放在第一列(用你的本地域名来替换movie.edu):


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

或者,将hostname(1)设置为一个域名。在主机toystory上,将hostname(1)设置为toystory.movie.edu。请勿在该名称结尾加上“.”。

2.查找一个本地域名

nslookup可以用来查找任何类型的资源记录,也可以用来直接查询任意名称服务器。在默认情况下,nslookup会使用resolv.conf文件中所指定的第一个名称服务器来查询A(地址)记录(如果resolv.conf文件中未指定名称服务器,则解析器将默认查询本地名称服务器)。要用nslookup来查询主机的地址,需要运行nslookup,并用主机的域名作为唯一的参数。查询本地域名应该会立即得到回应。

运行nslookup来查找carrie:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/7cf8137a5271071edc51980c06e426aebd3377f7.png" >

如果查找某个本地域名成功,则意味着对于正向解析区域而言,本地名称服务器的配置是正确的。如果查找失败了,那么将会看到如下消息:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/3ea24017f99986dbb9d6c23b23090cdb98b74fcf.png" >

这意味着区域数据中没有carrie。这时要检查一下区域数据文件;可能的原因包括没有在hostname(1)中设置本地域名,或是名称服务器出现了错误(当检查syslog消息时,应该会找到这些错误)。

3.查找一个本地地址

当把某个地址提供给nslookup进行查找时,它知道要进行PTR查询而不是地址查询。下面运行nslookup来查找carrie的地址:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/83f07efea4ed519c7e69d3b7dbf8d988bd025ebd.png" >

如果查找某个地址成功,则意味着对于in-addr.arpa(逆向解析)区域而言,本地名称服务器的配置是正确的。如果查找失败了,那么将看到和查找域名失败同样的错误消息。

4.查找一个远程域名

下一步就是尝试使用本地名称服务器去查找远程域名了,例如ftp.rs.internic.net或者其他已知的在Internet上的系统。这个命令可能不会像查找本地域名那样迅速得到回应。如果nslookup未能从名称服务器上得到响应,在放弃前,它还将等待超过一分钟的时间:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/259ff9cb4f8b4932f7edec03a7f56186e3a78155.png" >

如果查找成功,则意味着名称服务器知道root名称服务器的位置,并且知道如何联系它们以寻找自己区域以外的其他区域的域名信息。如果查找失败,要么是忘了配置root提示文件(syslog中会显示一条消息),要么是网络在某处发生了故障,导致无法访问远程区域的名称服务器。这个时候就换个远程域名试试吧。

如果前面这些查找都成功了,那么祝贺你!已经建立起了一个可运行的primary名称服务器。此时,应该准备好开始配置slave名称服务器了。

5.再进行一项测试

除了上述测试,还可以再进行一项测试。检查父区域的名称服务器是否已经对这个域进行了正确授权。如果父区域规定在有两台运行起来的名称服务器之后,才能对区域进行授权,那么请直接跳到下一节。

这项测试需要两个步骤。首先,需要找到一个父区域名称服务器的IP地址。其次,需要查询父区域的名称服务器以检查自己区域的NS记录(授权信息)。

第一步:找到父区域名称服务器的IP地址。要做到这一点,需要查询自己的名称服务器来找到父区域的NS记录。这里会再次用到nslookup,但需要加上-type=ns选项,以告诉nslookup程序查询的是名称服务器记录。

下面的例子会假设正在建立hp.com区域,并且需要找到com(其父区域)的名称服务器。


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/7e37ef740a6b934b4413c0b17cfab7e1eb8ef55a.png" >

第二步:需要查询父区域的一个名称服务器,以得到本区域的NS记录。这次同样要为nslookup加上-type=ns选项,并且还要加上-norecurse选项,这样nslookup才不会要求名称服务器以递归的方式来查询数据。另外,还需要直接查询父区域的名称服务器,而不是查询本地名称服务器。(本地名称服务器也拥有本区域的NS记录,但那不是本次测试所要检查的部分。)要查询父区域的名称服务器(而不是自己的),需要在nslookup语句的最后加上父区域名称服务器的名称。下面的例子中,将会查询com的名称服务器b.gtld-servers.net,以获取hp.com的NS记录:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/35fa83bee4342e6ae7d1e458ea7b7d9e92c21fa3.png" >

正如预期的那样,hp.com已经正确完成所有的设置工作。

如果名称服务器能成功查找到ftp.rs.internic.net,并且能查找到父域的名称服务器,这表明名称服务器已被正确建立起来,并且可以连接Internet了。如果父区域的名称服务器上没有本区域的NS记录,那么就说明本区域没有在父区域的名称服务器上注册。这不是个大问题,因为在区域内部的系统仍然可以查找区域内部及外部的其他系统的域名。还能够访问到本地及远程系统的Web和FTP服务。但是没有被注册很快将会成为一个问题,因为在区域外部的主机无法查找区域内部的域名;也就是说可能无法给身处远程区域的朋友发送电子邮件,而且肯定得不到任何回应。要解决这个问题,就得与父区域的管理员取得联系,并请他们检查本区域的授权情况。

4.7.4 编辑启动文件
一旦证实了名称服务器运行正常并且现在就可以使用,接下来就需要把它配置成自动启动,并在系统的启动文件中为hostname(1)设置一个域名(或者在/etc/resolv.conf文件中设置域名)。检查一下系统厂商是否已经将名称服务器设置成了自动启动。还可能需要移除启动行中的注释字符,否则启动文件可能会测试/etc/named.conf是否存在。要查找自动启动行,可以使用:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/54ec5202735b795c20fbf0b528d3e0bd547dea76.png" >

或者,如果使用的是System V样式的rc文件,则可以使用:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器

如果什么都没有找到,那么可以先用ifconfig命令初始化网络接口,然后将如下语句添加到适当的启动文件中:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/20fcc6312e4549465d4b0b016066fffbd7ded650.png" >

或许想等到默认路由配置之后,或者路由守护进程(routed或gated)启动之后,再启动名称服务器,而这取决于这些服务是否需要使用名称服务器,还是使用/etc/hosts就够了。

找到初始化主机名称的启动文件并把hostname(1)改成一个域名。例如,将


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/5f87a584aa592d1aebed77348fe3b629b172978c.png" >

改为:


《DNS与BIND(第5版)》——4.7 运行一个Primary名称服务器https://yqfile.alicdn.com/76e0ce99b7e619da14d19e9f5068f179b2fa9768.png" >