在resolv.conf中search和域名=在Ubuntu上慢速查找

我有一台机器运行Ubuntu 10.04服务器。 当使用curlwget等工具连接局网之外的某些站点时,我已经开始漫长(5-10秒)的延迟。

使用tcpdump和wireshark,我发现问题是在DNS查询中,正在build立连接:

当我运行:

 wget www.site1.com 

我看到以下行为:

 LOOKUP: AAAA www.site1.com # => fail, no delay, site1 doesn't have an IPv6 AAAA record LOOKUP: AAAA www.site1.com.mydomain.lan # => fail, BIG DELAY, crazy domain doesn't exist LOOKUP: A www.site1.com # => success, no delay, resolves as expected (site1 has IPv4 A record) CONNECTION PROCEEDS ... 

我的设置

我的服务器的resolv.conf如下所示:

 nameserver 192.168.0.1 # my router domain mydomain.lan # made up domain name, for my lan search mydomain.lan 

我的服务器的主机文件如下所示:

 127.0.0.1 localhost.localdomain localhost 192.168.0.10 server1.mydomain.lan server1 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 

决议?

为什么我的resolv.confsearch列表被用于构build第二次查找的名称,当resolv.conf手册页build议仅在查找主机名(无点)时使用它:

“parsing器查询中有less于ndots点(默认为1),将依次尝试使用searchpath的每个组件,直到find匹配。

我的印象是,第二次查找是错误的,不应该被执行…

如果我从resolv.conf中删除了domainsearch行,那么第二次查找就不会再执行了,我的延迟就会消失。

(另外,如果我强迫wget只处理IPv4,AAAA查找没有完成,所以延迟消失):

 wget --inet4-only www.site1.com 

此行为是devise使然。

IPv6是首选 – 所以首先确定AAAA条款中资源的状态。 NXDOMAIN响应返回 – 所以客户端需要附加searchpath。

请注意,你所做的ndots评论是正确的,但不是全部。 如果ndots数大于被查询的名称(如果是单个标签名称,在这种情况下),与查询行为唯一的区别是带有后缀的查询将尝试原始名称之前发生。 既然你已经超过了ndots门槛,那么就按照规定先试试这个名字。 请参阅手册页中的更多内容:

n的缺省值是1,这意味着如果名称中有任何点,则在将任何search列表元素附加到名称之前,名称将首先作为绝对名称尝试。

该查询失败,所以必须使用search列表。 请注意查询行为与wget http://site1/的区别。


你所看到的是预期的行为 – 我认为你需要解决的是造成这种缓慢查找的因素的汇合。

  • 修复你的DNS服务器,或者修复它正在recursion的上游。 当recurser尝试查找不存在的顶级域名(TLD)时,它应该轻松地caching从根获得的NXDOMAIN 。 由于closuresIPv6修复它,您可能有一个DNS服务器的path,当涉及到AAAA查找时,无法caching的caching。 尝试改变你的parsing器到8.8.8.8来validation。
  • 停止添加您显然无法查找的DNS区域的searchpath。 如果您的DNS服务器对该区域具有权威性(这是该search设置必须具有的用途,因为它不是公共层级中的有效名称),它将立即作出响应。 你可能不需要这个searchconfiguration,但是将其设置为可以parsing的东西,这样它就不会尝试从机器的主机名猜测它。 search com应该做得很好。

如果在shell提示符下,你说$ hostname并取回foo.bar.baz ,那么DNSparsing器就知道你的主机名是foo而你的域名是bar.baz 。 一般情况下,/etc/resolv.conf中的“domain”和“search”行只有在正确的情况下才会使用(或者如果你打算引起exception的行为)。

如果你的域名真的是bar.baz ,那么很可能你不应该在/etc/resolv.conf中指定“domain”或“search”这两行。 与其他地方经常出现的情况相反,在/etc/resolv.conf中通过重新指定已经从hostname获得的信息,通常会产生奇怪和不希望的行为(包括愚蠢的超时)。 在大型商业和小型家庭环境中都是如此。

(注意:每个应用程序都可能有不同的解释/etc/resolv.conf,所以理论上这可能不是普遍适用的。在大多数现代系统上,虽然99%的parsing器请求都通过GLIBC,但实际上,以上几乎总是如此。)