我们在 Linux wrt Java DNS 查找上遇到了一个非常奇怪的行为(更新:Mac OS X 上也发生了——我错了)。
我们将 Google 公共 DNS 服务器 8.8.8.8 设置为 JVM DNS 服务器。然而,系统 (/etc/resolv.conf) 服务器仍然是标准服务器 ghost.di.unimi.it。
当使用 InetAddress.getAllByName() 或 DNSJava 的 Addess.getAllByName() 查找地址时,一切都按预期工作(特别是,这是 DNSJava):
01:39:11.832438 IP nexus.law.di.unimi.it.33195 > google-public-dns-a.google.com.domain: 46509+ A? www.uffa.com。(30) 01:39:11.832820 IP nexus.law.di.unimi.it.52782 > ghost.di.unimi.it.domain: 42740+ PTR?8.8.8.8.in-addr.arpa。(38) 01:39:11.833510 IP ghost.di.unimi.it.domain > nexus.law.di.unimi.it.52782: 42740 1/2/0 PTR google-public-dns-a.google.com。(128) 01:39:11.865165 IP google-public-dns-a.google.com.domain > nexus.law.di.unimi.it.33195: 46509 1/0/0 A 208.87.35.103 (46)
如您所见,我们解析 www.uffa.com,然后出于身份验证目的进行 8.8.8.8 的反向查找(在第一次查找时仅发生一次)。此时,www.uffa.com 的 IP 地址已被缓存,如果我们在 TTL 内再次调用,则不会发生任何查找。
尽管如此,当我们实际尝试使用 Apache HTTP 组件的 DefaultHttpClient 在 www.uffa.com 上打开一个套接字时,我们会看到:
01:40:06.892383 IP nexus.law.di.unimi.it.53977 > ghost.di.unimi.it.domain: 22255+ PTR?103.35.87.208.in-addr.arpa。(44) 01:40:07.204359 IP ghost.di.unimi.it.domain > nexus.law.di.unimi.it.53977:22255 1/2/2 PTR 208-87-35-103.securehost.com。(154)
也就是说,Java(或机器上的其他东西)正在将 www.uffa.com 的地址反向查找到我们的系统服务器,而不是谷歌的服务器。使用 URL.openConnection().getContent() 也会发生同样的情况。
我们使用 BTrace 来检测 InetAddress/Address 代码,并且没有执行可能暗示反向 DNS 查找的调用。
坦率地说,我们甚至不知道要寻找什么。
我们的大问题是我们正在编写一个高性能爬虫,虽然我们尝试仔细调整 DNS 查找的速度,但我们无法调整这种反向查找的速度,因为它们是在打开套接字时执行的,这发生在抓取数以千计的线程。
附加信息,wget 也执行反向 DNS 查找,但端口 80 上的 nc(当然没有提供任何信息)没有。
像往常一样,任何帮助表示赞赏。