在Linux上,我们遇到了一个相当奇怪的行为,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)
正如你所看到的,我们parsingwww.uffa.com,然后在8.8.8.8中进行反向查找(在第一次查找时只发生一次),以进行身份validation。 此时,www.uffa.com的IP地址被caching,如果我们在TTL内再次打电话,则不会发生查找。
尽pipe如此,当我们真正尝试使用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(或机器上的其他东西)正在对我们的系统服务器 (而不是Google服务器)执行www.uffa.com地址的反向查找。 使用URL.openConnection()。getContent()也会发生同样的情况。
我们使用BTrace来testingInetAddress / Address代码,并且不会执行可能意味着反向DNS查询的调用。
坦率地说,我们甚至不知道要找什么。
我们最大的问题是,我们正在编写一个高性能的爬虫,尽pipe我们试图仔细地调整DNS查找的速度,但是我们无法调整这个反向查找的速度,因为它们是在打开套接字时执行的,这发生在爬行线程的数量是成千上万。
还有一个额外的信息,wget也执行反向DNS查询,但是在端口80上的nc(当然不提供任何内容)不是。
像往常一样,任何帮助表示赞赏。
反向DNS查找由SecurityManager完成,您不能禁用它们。
最后,唯一真正的问题是我没有给tcpdump -n选项。 我观察到的反向查找只是tcpdump的。