我們在Linux w.r.t上遇到了一個相當奇怪的行爲。 Java DNS查找(更新:也發生在Mac OS X上 - 我錯了)。在Linux上,Java在打開套接字時發出反向DNS查找。爲什麼,我該如何阻止它?
我們將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的地址,而不是Google的服務器。使用URL.openConnection()。getContent()也會發生同樣的情況。
我們使用BTrace來測試InetAddress /地址碼,並且沒有可能暗示反向DNS查找的呼叫被執行。
坦率地說,我們甚至不知道要尋找什麼。
我們最大的問題是我們正在編寫一個高性能的抓取程序,雖然我們試圖仔細地調整DNS查找速度,但是我們無法對這種反向查找進行調整,因爲它們是在打開套接字時執行的,這發生在爬行線程的數量是成千上萬。
另一個信息,wget也執行反向DNS查詢,但端口80上的nc(當然不提供任何內容)不會。
像往常一樣,任何幫助表示讚賞。
閱讀Apache庫的來源,甚至是文檔。這可能是這裏的演員。 – bmargulies
正如我在下面回答的,它也使用URL.openConnection()。getContent(),所以它不能成爲Apache的問題。 – seba