7.3 整理文件
当首次设置区域时,整理文件很简单:将它们全部放到一个目录中即可。这些文件中包含了一个配置文件和数个区域数据文件。然而,随着时间的推移,任务会越来越艰巨。有更多的网络加入,相应地就有更多in-addr.arpa区域。或许已经授权了一些子域,也已经开始为其他站点备份区域。一段时间后,当使用ls查看名称服务器的目录时,会发现一屏都无法列出所有内容。是时候重新整理这些文件了。BIND提供了一些功能用来帮助进行文件的整理。
BIND名称服务器支持一个叫做include的配置文件语句,它允许将一个文件的内容插入到当前的配置文件中。这个功能可以将一个非常大的配置文件分成多个较小的文件。
区域数据文件(适用于所有BIND版本)支持2条1控制语句:$ORIGIN和$INCLUDE。$ORIGIN语句可以改变一个区域数据文件的来源(origin),而$INCLUDE语句可以在当前的区域数据文件中插入新的文件。这两条控制语句并非资源记录;它们用来帮助维护DNS数据。特别是,它们让区域划分成子域的工作变得更简单:可以将每个子域的数据存放在不同的文件中。
7.3.1 使用多个目录
整理区域数据文件的方法之一,就是将其存放到不同的目录中。如果名称服务器是多个站点所在区域(正向和逆向解析)的primary,则可以将每个站点的区域数据文件分别存放到各自的目录中。另一种方法是将所有primary区域的数据文件存放到一个目录中,而将所有备份区域的数据文件存放到另一个目录中。如果选择将primary和slave区域分开的方式,那么配置文件看起来可能会像下面这个样子:
https://yqfile.alicdn.com/0853014d52eb38fbff8da697d05dd34a5261e608.png" >
这种划分方法的另一种变化,就是将配置文件分成三个文件:主文件,包含所有primary条目的文件,以及包含所有secondary条目的文件。主配置文件的内容如下所示:
https://yqfile.alicdn.com/d0d2a0b7a14bbe43d4f59429aba3adc9cc912cd6.png" >
named.conf.primary文件的内容如下所示:
https://yqfile.alicdn.com/57959b781781b84ce7b7594fca9a508e6c64a17b.png" >
named.conf.slave文件的内容如下所示:
https://yqfile.alicdn.com/fa40bcadbddb0c2535847eab54cb7064bdd13683.png" >
可能会觉得下面这种整理文件的方法会更好:将包含primary字样的配置文件放入primary子目录中,通过增加一个新的directory指令切换到此目录,并且删除每个文件名中的primary/(因为名称服务器现在就运行在该目录中)。然后对包含secondary字样的配置文件做类似的改变。遗憾的是,这种方法不起作用。BIND只允许定义一个工作目录。当名称服务器在不同目录间不断切换时,事情会变得相当混乱:例如,备份区域数据文件最终会在名称服务器切换到的上一个目录中。
**
7.3.2 改变区域数据文件的来源**
在BIND中,区域数据文件的来源(origin),默认是named.conf文件中zone语句的第二个字段。来源是一个域名,会自动附加到区域数据文件中所有不以“.”结尾的名称上。在区域数据文件中,可以使用$ORIGIN控制语句来修改来源,$ORIGIN后面跟着一个域名。(如果使用完整的域名,则不要忘记结尾的“.”!)此后,凡是不以“.”结尾的名称就会附加上新的来源。如果区域(例如movie.edu)中包含数个子域,可以使用$ORIGIN语句重新设置来源,并简化区域数据文件。例如:
https://yqfile.alicdn.com/823f88e6a68228b1f07e1ef02143f7d6e0c58b8e.png" >
本书第9章会深入讨论如何创建子域。
7.3.3 引入其他区域数据文件
一旦将区域划分成子域,就会发现,将每个子域的记录分别放在不同的文件中会比较方便。$INCLUDE控制语句可以帮助完成此项工作:
https://yqfile.alicdn.com/3881db745d3dbc9a3080efd9e0a314b4ec3d083e.png" >
要想进一步简化该文件,可以在引入文件时,在同一行指定新的来源:
https://yqfile.alicdn.com/829566561f855e4d82ccd613b0ed47f52c4d13ff.png" >
当在同一行指定来源和引入文件时,该来源只会作用于所引入的特定文件。例如,comedy.movie.edu这个来源只作用于db.comedy.movie.edu中的名称。在引入db.comedy.__movie.edu文件后,即使db.comedy.movie.edu中也有$ORIGIN控制语句,来源还是会变回$INCLUDE之前的设置。