我有以下resolv.conf
域名example1.com
。
search example1.com
nameserver x.x.x.1
nameserver x.x.x.2
现在,我想扩展我的resolv.conf
以包括example2.com
。我该如何编写我的resolv.conf
?
看完之后resolv.conf
手册我想到的是这个页面:
search example1.com example2.com
nameserver x.x.x.1
nameserver x.x.x.2
nameserver x.x.x.3 # for example2.com
nameserver x.x.x.4 # for example2.com
我知道将example2.com
首先在前两个名称服务器中查找并且会超时,但是当到达第三个名称服务器时它就可以工作了,不是吗?
有人可以解释一下这个问题吗?
答案1
解析器库的设计基于统一的 DNS 命名空间假设。多个名称服务器/etc/resolv.conf
仅用于冗余,以防某些名称服务器无法访问或不可用。
具体来说,如果第一个查询的名称服务器不知道域名,它不是超时但返回NXDOMAIN
,表示“该域名不存在”。因此,解析器将不是联系列表中的下一个名称服务器,希望得到不同的答案,但会接受该结果并将其传递给执行查询的应用程序。
此外,无法保证解析器库函数会按照 中给出的顺序查询名称服务器/etc/resolv.conf
。可以自由地重新排序,例如根据它们过去的响应速度。
最后,该search
语句并不像您想象的那样工作。它只是列出了应附加到无法解析的域名的域。
总之,你提议的resolv.conf
文件
search example1.com example2.com
nameserver x.x.x.1
nameserver x.x.x.2
nameserver x.x.x.3
nameserver x.x.x.4
当应用程序尝试解析名称时产生以下行为dst.host
:
- 从列表
x.x.x.1
、x.x.x.2
、x.x.x.3
中x.x.x.4
向任意名称服务器询问域名dst.host.
- 如果请求超时,则继续询问列表中的其他名称服务器,直到其中一个回复。如果没有回复,则向应用程序返回错误。
- 如果答复是不是NXDOMAIN,将找到的结果返回给应用程序。
- 如果答复是NXDOMAIN,重复步骤 1 至 3,这次询问域名
dst.host.example1.com.
- 如果答复再次是 NXDOMAIN,请重复步骤 1 至 3,这次询问域名
dst.host.example2.com.
- 如果答复再次是 NXDOMAIN,则将结果 NXDOMAIN(未找到)返回给应用程序。
如果您遇到分割水平的情况,需要为不同的域查询不同的名称服务器,那么您需要使用 DNS 代理,dnsmasq
它能够根据域将查询转发到不同的名称服务器。