使用tcpdump和wireshark,我发现在设置连接时正在进行的DNS查找中存在问题:
例
当我跑:
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,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
我的服务器的hosts文件如下所示:
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.conf搜索列表用于构造第二个查找的名称,当resolv.conf手册页显示它仅用于查找主机名(无点)时:
“Resolver queries having fewer than ndots dots (default is 1) in them
will be attempted using each component of the search path in turn
until a match is found.”
我的印象是,第二次查找是错误的,根本不应该执行…
如果我从resolv.conf中删除域和搜索行,则不再进行第二次查找,并且我的延迟消失了.
(另外,如果我强制wget只处理IPv4,AAAA查找没有完成,因此延迟消失):
wget --inet4-only www.site1.com
IPv6是首选 – 因此首先确定AAAA术语中的资源状态. NXDOMAIN响应返回 – 因此客户端认为需要附加搜索路径.
请注意,您所做的ndots评论是正确的 – 但不是整个故事.如果ndots数字高于要查询的名称(如果它是单个标签名称,在这种情况下),则查询行为的唯一区别是附加后缀的查询将在尝试原始名称之前发生.由于您已经超过了ndots阈值,因此首先尝试使用该名称.请参见手册页:
The default for n is 1,meaning that if there are any dots in a name,the name will be tried first as an absolute name before any search list elements are appended to it.
该查询失败,因此必须使用搜索列表.请注意wget http:// site1 /的查询行为的差异.
你所看到的是预期的行为 – 我认为你需要解决的是导致这种缓慢查找的因素的汇合.
>修复您的DNS服务器,或修复它正在递归的上游.递归者应该在尝试查找不存在的TLD时轻松缓存从根获取的NXDOMAIN.由于关闭IPv6修复它,您可能在路径中有一个DNS服务器,当涉及AAAA查找时,该服务器在缓存时失败.尝试将解析器更改为8.8.8.8以进行验证.>停止为您显然无法进行查找的DNS区域添加搜索路径.如果您的DNS服务器对该区域具有权威性(这是该搜索设置有用的必要条件,因为它不是公共层次结构中的有效名称),它将立即响应.您可能不需要该搜索配置 – 但将其设置为将要解析的内容,以便它不会尝试从计算机的主机名中猜出它.搜索com应该做得很好.