在Linux上,Java在打开套接字时发出反向DNS查找。 为什么,我该如何阻止呢?

在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的。