本节书摘来自异步社区《DNS与BIND(第5版)》一书中的第10章,第10.8节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。
10.8 名称服务器地址排序
有时,轮询调度和其他任何配置顺序都不符合要求。当与一台具有多个网络接口、并且因此具有多个IP地址的主机(也称为multihomed host,多宿主主机)联系时,根据主机地址选择特定的网络接口可能会有更好的性能。这不是rrset-order子语句能做到的。
如果这台多宿主主机在本地,并且和某台主机共享一个网络或子网,则多宿主主机的一个地址会距这台主机比较“近”。如果多宿主主机在远程网络中,可能使用其中一个网络接口会有更好的性能。不过,通常这和使用哪个地址没有多大关系。从前,10网段(也就是以前的ARPAnet骨干网),总会比其他的远程地址都要“近”些。现在的Internet发展迅猛,因此通过不同的网络访问远程的多宿主主机,大概都不会有明显的差别,但是本节仍会予以介绍。
在介绍名称服务器地址排序之前,应该先看看由解析器进行的地址排序是否更符合需求。(参阅本书节“sortlist指令”。)由于解析器和名称服务器可能位于不同的网络,所以让解析器来优化地址排序对本地主机更为理想。在名称服务器上进行地址排序也没问题,但是在BIND 8的早期版本中,名称服务器的地址排序功能被移除了,主要因为开发者认为该功能没有用。BIND 8.2恢复并增强了该功能。BIND 9.1.0是BIND 9中第一个支持地址排序功能的版本。
地址排序的关键在于一个称为sortlist的options子语句。sortlist子语句以地址匹配列表作为参数。然而,和作为访问控制列表使用的地址匹配列表不同,sortlist对地址匹配列表有非常特别的解释。地址匹配列表中的每个条目,本身就是具有一个或两个元素的地址匹配列表。
如果某个条目只有一个元素,那么它会被用来核对查询者的IP地址。如果查询者的地址匹配,则名称服务器会对发送给查询者的应答进行排序,以使任何匹配该元素的地址都被放在最前面。令人费解吧?下面有一个例子:
这个排序列表中只有一条包含一个元素的条目。该列表会将位于网络192.249.249/24的地址排在应答的最前面,并发送给同样位于该网络的查询者。因此,如果位于192.249.249.101的客户端查询一个拥有两个地址(192.249.249.87和192.253.253.87)的域名,那么名称服务器将会把192.249.249.87排在应答的最前面。
如果一个条目包含两个元素,则第一个元素被用来匹配查询者的IP地址。如果查询者的地址匹配,名称服务器会对发送给查询者的应答进行排序,以使任何匹配第二个元素的地址都被放在最前面。第二个元素实际上可以是一个包含许多元素的地址匹配列表,在这种情况下,应答中的第一个地址就是第一个匹配该列表的地址。下面是一个简单的例子:
这个排序列表会作用在位于192.249.249/24的查询者上,并且发送给它们的应答会将它们自己的网络地址排在最前面,接着才是位于192.253.253/24的地址。
排序列表中的元素,可以是简单的子网甚至是单独的主机。