7.2 更新区域数据文件
网络总是在不断变化的——新的工作站加入,老的被淘汰或卖掉,或者将主机移至另一个网络。每次改变都意味着区域数据文件必须跟着修改。应该手动修改这些文件还是应该使用工具协助修改呢?
本节将首先讨论如何手动修改区域数据文件。然后再介绍一个协助修改的工具:h2n。事实上,本书推荐使用工具来创建区域数据文件;或者至少使用工具来增加序号。区域数据文件的语法很容易导致错误。因为它无法保证存放在不同文件中的地址和指针记录,能够保持彼此之间的一致性。不过,就算是使用工具,也还是必须知道更新文件会造成什么影响,所以本节会先介绍手动修改的方法。
7.2.1 增加和删除主机
在创建区域数据文件后,如果要增加新主机,显然需要修改原来的文件。下面会以举例说明的方式,将整个步骤介绍一遍。请按照这些步骤来修改primary名称服务器的区域数据文件。如果按照这些步骤来修改slave名称服务器所备份的区域数据文件,那么虽然slave的数据会发生改变,但是在下次区域传输时这些改变将会被覆盖。
更新db.DOMAIN文件中的序号。序号一般会在文件的开头,所以先更新它很容易,同时也能避免忘记对其进行修改。`
在db.DOMAIN文件中,为新增主机添加A(地址)、CNAME(别名)以及MX(邮件交换器)记录。当一台新主机(cujo)加入网络后,在db.movie.edu文件中增加如下资源记录:
为新增主机的每个IP地址所对应的db.ADDR文件增加PTR记录,并更新序号。由于cujo只有一个位于192.253.253/24网络上的IP地址,所以在db.192.253.253文件中增加如下PTR记录:
https://yqfile.alicdn.com/ebf6d45b253533ab52ad70dff7970f8ee6cd3f53.png" >
重新载入primary名称服务器;这会强制其加载新的信息:
https://yqfile.alicdn.com/b82b8b0205901f5fcf875d5d5d0f4d1d1ed0c7ad.png" >
如果使用的是BIND 9.1或其后续版本的名称服务器,可以仅重载有变更的区域:
这样,primary名称服务器就会载入新的区域数据。slave名称服务器则会在SOA记录中所设定的更新间隔时间内载入新的数据。如果使用的是第8或9版的primary和slave,那么slave会很快取得新的数据,因为primary会在数据修改后15分钟内通知slave。要删除一台主机,需要在db.DOMAIN文件和每个db.ADDR文件中,删除与该主机相关的资源记录。增加每个修改过的区域数据文件的序号,并重载primary名称服务器。
7.2.2 SOA的序号
每个区域数据文件都有一个序号(serial)。每当变更区域数据文件中的数据时,就必须增加该序号。如果没有增加该序号,区域的slave名称服务器就无法获取更新后的数据。
增加该序号很简单。如果原先的区域数据文件有如下SOA记录:
那么更新后的区域数据文件有如下SOA记录:
https://yqfile.alicdn.com/d003cf83dc762b08be64e778910d90f5420e91b6.png" >
这个简单的修改就是区域数据能够分发到所有slave名称服务器的关键。更新一个区域时,最常见的错误就是忘记增加序号。在最初几次更改区域数据文件时,因为过程新鲜而且注意力集中,可能不会忘记增加序号。不过习以为常之后,就可能草率行事,将增加序号的事情抛在脑后……从而导致任何slave都不会取得新的区域数据。这就是应该使用工具来协助增加序号的原因!可以使用h2n或是自己编写的程序,而且不论如何使用工具都是个好主意。
管理序号有几种好的方法。最常见的就是使用计数器:每次修改文件后就将序号加1。另一种方法是使用日期作为序号。例如,可以使用由YYYYMMDD所构成的8位数字作为序号。假设今天是2005年1月15日,那么序号就是20050115。不过这种方式仅允许每天更新一次,这样可能不够。可以再加上两位数字,表示这是今天第几次更新该文件。例如,2005年1月15日第一次修改就是2005011500。当天第二次修改后的序号就是2005011501。这种方式允许每天更新100次。这种方式还能知道上次增加区域数据文件序号的时间。如果执行h2n的同时使用了-y选项,便会产生日期格式的序号。但是无论选择哪种方式,序号必须是一个32位无符号整数。
7.2.3 重新设置一个新的序号
如果某个区域的序号突然变得非常大,并且想要将其改回一个更合理的值,应该怎么做?有一种方法适用于所有BIND版本,有一种方法适用于及其后续版本,还有一种方法适用于4.9及其后续版本。
适用于所有版本的方法就是删除slave上所有带有旧序号的文件。这样就可以从1(或者任何方便的数字)开始编号了。下面是具体方法:首先,在primary服务器上更改序号并重新启动;这样primary服务器就有了新的整数序号。其次,登录一个slave名称服务器的主机,使用rndc stop命令终止named进程。接下来,删除其备份的区域数据文件(即rm bak.movie.edu bak.192.249.249 bak.192.253.253)并重新启动slave名称服务器。由于备份文件都被删除了,该slave必须载入新版本的区域数据文件——从而取得新的序号。必须在每个slave服务器上重复该过程。如果有任何slave名称服务器不在控制之下,则必须联系其管理员完成相同的过程。
如果所有slave运行的BIND版本都在(希望使用的不是4.8.1)到8.2之间,则可以利用特殊的序号0。如果将区域的序号设置为0,则每个slave将在下一次检查序号时进行区域数据传输。实际上,此后每当slave检查时都会传输该区域的数据,因此一旦所有slave的序号都同步为0,请不要忘记增加序号。不过序号的增加范围是有限制的,请继续往下看。
另一种方法是使用固定序号(适用于4.9及其后续版本的slave),先来介绍一些背景知识,这样理解起来会更容易。DNS的序号是一个32位无符号整数,其取值范围从0到4 294 967 295。序号使用的是序列空间算法(sequence space arithmetic),这意味着对于任意序号,在数字空间中有一半的数字(2 147 483 647个数字)比该序号小,而另一半数字比该序号大。
下面举例说明序列空间数字(sequence space numbers)。假设序号是5。则从6到(5 + 2 147 483 647)的序号都比5大,而从(5 + 2 147 483 649)到4的序号则都比5小。注意,当序号达到4 294 967 295之后会回过头来到4。另请注意,此处没有包含数字(5 + 2 147 483 648),因为它刚好在数字空间的一半,所以它可能比5大也可能比5小,这取决于实现方式。为了安全起见,请不要使用它。
现在回到原来的问题。如果区域的序号是25 000,并且想再次从1开始编号,那么可以通过两步来加速穿过序号空间。第一步,将序号增加到所允许的最大值(25 000 + 2 147 483 647 = 2 147 508 647)。如果相加的结果大于4 294 967 295(最大的32位数值),则减去4 294 967 296之后便会回到数字空间的最前面。在改变序号后,必须等待所有slave都取得新的区域数据副本。第二步,将区域的序号改为目标值(即1),现在这个数字大于目前的序号(2 147 508 647)。在所有slave都取得新的区域数据副本后,工作就完成了。
7.2.4 其他区域数据文件条目
名称服务器运行一段时间以后,可能会想在名称服务器上增加一些数据,以便协助管理区域。当有人问起某台主机的位置时,是否曾经被难住?或许根本就记不得主机是什么类型的。现在的管理员必须管理越来越多的主机,所以很容易忘记这些信息。名称服务器可以帮助解决此问题。如果某台主机发生问题,而有人想从远端发出通知,则名称服务器可以协助其找到联系人。
到目前为止,本书已经介绍了SOA、NS、A、CNAME、PTR以及MX记录。这些记录是DNS日常操作的关键:名称服务器需要它们来进行操作,并且应用程序需要查询这些类型的数据。其实DNS定义了更多的记录类型。其中最常用的资源记录类型是TXT和RP;它们可以告知一台主机的位置和负责人。常见(和不常见)的资源记录列表请参阅附录A。
1.一般的文本信息
TXT就是TeXT(文本)。这些记录只是一个字符串列表,其长度最多不超过256个字符。
TXT记录可以用来做任何事情;描述主机的位置就是其中之一:
BIND对TXT记录的限制是2KB。在TXT记录中可以使用一个或多个字符串:
2.负责人
毫无疑问,域管理员与RP(Responsible Person,负责人)记录之间是一种又爱又恨的关系。RP记录可以被附加到任意域名(内部节点或叶子节点)上,用来指明谁是该区域或主机的负责人。例如,可以找出那些发送大量DNS查询的主机是由谁负责管理的。但是当你所管理的主机发生问题时,RP记录也能使别人找到你。
这个记录有两个参数作为其特定记录数据(record-specific data):第一个是域名格式的电子邮件地址,第二个是指向联系人附加数据的域名。电子邮件地址的格式与SOA记录所使用的一样:将“@”替换成了“.”。后面的参数是一个必须关联到相应TXT记录的域名。该TXT记录可以包含任意格式的联络信息,例如全名和电话号码。如果忽略任何一个参数,都必须使用root域(“.”)来作为一个占位符。
下面是一些RP(和与之关联的TXT)记录:
https://yqfile.alicdn.com/6a674cf718cbd9780bbeae3e8c75bc8ecf58906b.png" >
注意,不需要为root.movie.edu和snewman.movie.edu设置TXT记录,因为它们只是域名格式的电子邮件地址,而不是真正的域名。
7.2.5 从主机列表生成区域数据文件
本书第4章解释了将主机表信息转换成区域数据的过程。还使用Perl写了一个自动执行此过程的工具,称为h2n1。使用工具来生成数据有个很大的好处:不会出现语法错误,或者区域数据文件中不会出现不一致的问题——假设h2n程序没有问题的话!一般常见的不一致问题是:主机有A(地址)记录却没有与之对应的PTR(指针)记录,反之亦然。由于这些数据存在于不同的区域数据文件中,所以很容易出错。
那h2n可以做些什么呢?只要提供/etc/hosts文件以及一些命令行选项,h2n就可以创建区域数据文件。作为系统管理员,必须保持主机表是最新的。每次修改主机表,都需要再次执行h2n。h2n会重建每个区域数据文件,并为每个新文件分配更大的序号。h2n可以手动执行,或者通过cron每晚执行。如果使用了h2n,就永远不用担心忘记增加序号了。
首先,h2n需要知道正向解析区域的域名以及网络号。(h2n可以从网络号找出逆向解析区域的名称。这些内容直接对应为区域数据文件的名称:movie.edu的区域数据会放入db.movie文件中,而网络192.249.249/24的数据会放入db.192.249.249文件中。可以用-d和-n选项分别指定正向解析区域的域名和网络号。
-d domain name
正向解析区域的域名。
-n network number
所管理网络的网络号。如果要为多个网络生成文件,可以在命令行上使用多个-n选项。请省略网络号结尾的0以及网络掩码。
h2n命令要求使用-d选项和至少一个-n选项;这两个选项都没有默认值。例如,为movie.edu区域(包含两个网络)创建数据文件,可以使用以下命令:
为了进一步控制数据,还可以使用其他选项:
-s server
为NS记录指定名称服务器。与-n选项一样,如果有多个primary或slave名称服务器,则可以使用多个-s选项。BIND 8或9的服务器会在区域数据改变时通知列表中的服务器。该选项的默认值是运行h2n的主机。
-h host
为SOA记录的MNAME字段指定主机。host必须是primary名称服务器,以确保NOTIFY功能可以正常运行。该选项的默认值是运行h2n的主机。
-u user
设置区域数据负责人的邮件地址。该选项的默认值是运行h2n的主机上的root用户。
-o other
设置SOA记录的其他值(以冒号分隔的列表),不包括序号。该选项的默认值是10800:3600:604800:86400。
-f file
从文件名为file的文件中读取h2n的选项,而不是从命令行读取。如果有许多选项,那么可以将它们放入文件中。
-v 4|8
为BIND 4或8生成配置文件;该选项的默认值是8。由于BIND 9的配置文件基本上和BIND 8的一样,所以可以使用-v 8为BIND 9名称服务器生成配置文件。
-y
根据日期生成序号。
现在举个例子,使用了刚才提到的所有选项:
opts文件的内容如下:
https://yqfile.alicdn.com/fc65123c4cd5e8564e3ff9cc50be218cf9f5531d.png" >
如果某个选项要求一个主机名,则可以提供完整的域名(例如toystory.movie.edu),或仅提供主机的名称(例如toystory)。如果只提供主机名称,那么h2n会把-d选项所指定的域名添加其后,组成一个完整的域名。(如果结尾的“.”是必须的,h2n也会加上它。)
除了刚才介绍的,h2n还有更多的选项。完整的选项列表请查阅其手册。
当然,某些类型的资源记录不容易通过/etc/hosts来生成;因为必要的数据根本不在该文件中。这就需要手动添加这些记录。但是由于h2n每次运行都会重写区域数据文件,会不会将这些手动添加的记录覆盖掉呢?
还好,h2n为加入这类数据提供了一扇“后门”。将这些特殊的记录放入名为spcl.DOMAIN的文件中,其中DOMAIN就是区域域名的第一个标签。当h2n发现这个文件时,就会将以下语句:
https://yqfile.alicdn.com/c7d6d361b2887d8cea52aa2eb0a3e988c4493ae8.png" >
添加到db.DOMAIN文件的结尾。($INCLUDE控制语句将在本章稍后予以说明。)例如,movie.edu的管理员会将额外的MX记录加入spcl.movie文件,这样用户就能直接发邮件到movie.edu而不需要通过movie.edu中的其他主机。在找到该文件后,h2n会把以下语句:
https://yqfile.alicdn.com/1c8d83972571c6129c582d93f6a3b8e3d5307811.png" >
添加到区域数据文件db.movie的结尾。
7.2.6 保持Root提示文件是最新的
正如本书第4章的说明,root提示文件会告诉名称服务器,root区域的服务器位于何处。该文件必须定期更新。虽然root名称服务器不会经常变动,但是变动也是无法避免的。一个良好的习惯是每一到两个月检查root提示文件一次。在第4章中,本书介绍了如何FTP到ftp.rs.internic.net以取得root提示文件。而且这可能是将该文件保持最新的最佳方法。
如果有dig程序(该程序是一个包含在BIND发行套件中的查询工具,第12章会予以说明),则可以执行如下命令取得当前root名称服务器的列表: