我有一个运行 Debian Wheezy 的虚拟机,即使解析器立即回复,某些主机名查找也需要几秒钟才能完成。奇怪的是,查找getaddrinfo()会受到影响,但gethostbyname()不会。
我已经切换到 Google 解析器以排除本地解析器损坏的可能性,所以我/etc/resolv.conf看起来像:
search my-domain.com
nameserver 8.8.4.4
nameserver 8.8.8.8
Run Code Online (Sandbox Code Playgroud)
我nsswitch.conf的线路:
hosts: files dns
Run Code Online (Sandbox Code Playgroud)
而我的/etc/hosts不包含任何异常。
如果我尝试telnet webserver 80,它会在获得名称解析之前挂起几秒钟。的ltrace输出[1]示出了悬挂在一个getaddrinfo()呼叫:
getaddrinfo("ifconfig.me", "telnet", { AI_CANONNAME, 0, SOCK_STREAM, 0, 0, NULL, '\000', NULL }, 0x7fffb4ffc160) = 0 <5.020621>
Run Code Online (Sandbox Code Playgroud)
然而,tcpdump显示名称服务器立即回复,并且只有在第二次回复时才telnet解锁。回复看起来相同:
05:52:58.609731 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:52:58.609786 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:52:58.612188 IP 8.8.4.4.53 > …Run Code Online (Sandbox Code Playgroud)