本节书摘来自异步社区《DNS与BIND(第5版)》一书中的第4章,第4.5节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。
4.5 主机名称检查
如果名称服务器使用的是BIND 或者更新的版本(大部分都是这种情况),则必须特别注意主机是如何命名的。从BIND 4.9.4开始,BIND会检查主机名称是否符合RFC 952的规范要求。如果主机名称不符合该规范,那么BIND会将其当成一个语法错误。
不必恐慌,因为这项检查只针对那些被认为是主机名称的名称。请记住,资源记录拥有一个名称字段和一个数据字段,例如:
主机名称会被放在A(地址)和MX(第5章中会介绍)记录的名称(name)字段中。主机名称也会出现在SOA和NS记录的数据(data)字段中。CNAME无须遵从主机的命名规则,因为它所指向的名称可以是非主机名称。
现在来看看主机命名的规则吧。主机名称允许在每个标签(label)中包含字母和数字字符。下面都是有效的主机名称:
https://yqfile.alicdn.com/14e152fe652ae396cf57a2cdab8474e4a65d3824.png" >
如果连字符“-”出现在标签的中间,那么也是有效的:
提示
主机名称中不允许出现下划线“_”。
不用做主机名称的名称可以包含任何可打印的ASCII字符。
如果某个资源记录的数据字段需要一个邮件地址(就像SOA记录中的那样),那么其第一个标签可以包含任何可打印的字符,因为它不是一个主机名称,但是其余的标签都必须遵循上述主机名称的语法。例如,邮件地址应该使用下述的语法:
<ASCII-characters>.<hostname-characters>
例如,假设邮件地址是key_grip@movie.edu,那么即使其中有“ _ ”,也仍然可以在SOA记录中使用该地址。记住,在邮件地址中需要用“.”来代替“@”,就像下面这样:
https://yqfile.alicdn.com/9afcaafbd4847e1174a0e6d7b321371b41161fcd.png" >
从语法比较宽松的BIND版本升级到语法比较严格的BIND版本时,这层额外的检查可能会导致很大的问题,特别是那些已将含有“_”的主机名称标准化的站点。如果打算以后再更改这些名称(迟早还是要改的,不是吗?),那么可以将错误转变为警告消息,或者简单地把不合法的名称都忽略掉。下面的配置文件语句就把错误转变成了警告消息:
https://yqfile.alicdn.com/11a7c3bea13a31f8f42f277b2cb7b830cc5039c8.png" >
这些警告消息会被syslog记录,稍后会简要介绍。下面的配置文件语句可以用来直接忽视这些错误条目:
https://yqfile.alicdn.com/4fbebe9aa6272ade6c017262c8a4ddfb74d1351a.png" >
如果不符合规定的名称来自于备份的区域(即没有管理权限),那么就添加一条相似的语句,指定slave而不是master。
https://yqfile.alicdn.com/e3478089305d33ea9288bad59c9fc3d26637ae9d.png" >
如果这个名称来自对查询所作的响应,而不是区域传输,那么就在语句中指定response:
下面是BIND的默认设置:
https://yqfile.alicdn.com/c0cda6f434dcdd3498e90e99bc181ae6c6a341a9.png" >
名称检查也可以基于每个区域来加以指定,这样就可以为某个特定区域单独配置,以覆盖掉options语句中的名称检查行为:
提示
在options语句中,名称检查行包含三个字段(check-names master fail);而在zone语句中,名称检查行只包含两个字段(check-names fail)。这是因为zone语句中已经指定了类型(zone语句中所指定区域的类型)。