2013-04-24 32 views
3

如果我要求gethostbyaddr()查找NAT生成的IP地址,例如192.168.0.4,我應該期望它工作嗎?gethostbyaddr()應該在NAT環境中工作嗎?

背景:我正在家中運行一些用於網絡環境的控制代碼的測試。有時,這段代碼會執行gethostbyaddr()調用來獲取發送消息的機器的詳細信息。地址通常是本地機器的地址,有時甚至變成當前機器本身的地址。通常情況下,這沒有問題。但是,我用Netgear路由器替換了舊的Netcomm ADSL路由器,並發現在本地NAT環境中調用一臺機器的gethostbyaddr()現在a)在30秒後超時,b)返回NULL以指示錯誤。實驗回到我的舊路由器,我發現相同的調用也失敗,返回NULL,但立即這樣做。代碼可以處理錯誤返回(這就是爲什麼我以前從未注意到這一點),但新的30秒超時是一個巨大的麻煩。顯然,有很多方法可以解決這個問題,但是大多數方法都會涉及到地址是192.168地址並避免gethostbyaddr()調用的情況。我的問題是,gethostbyaddr()調用在NAT環境中總是失敗,還是會出現這種情況? (在這種情況下,我不想最終避免它們)。還是僅僅是我沒有正確設置我的路由器?順便說一句,我在OS X上運行它,並在Snow Leopard和Lion上看到相同的行爲。

回答

1

除非您設置私人DNS或將它們添加到您的主機文件,否則它們將不起作用。 Sendmail中提供了這方面的一些好的文檔:

http://www.sendmail.com/sm/open_source/tips/private_dns/

是最終到達根域名服務器獲得經過黑洞的電話。

一些路由器可能已經提供了反向DNS。你不需要在那裏擁有每個主機,只需要對地址空間具有權威性,這樣請求就不會被轉發。

+0

謝謝。我發現sendmail鏈接非常有幫助。本質上,我的問題的答案似乎是_normally_ gethostbyaddr()不能在NAT地址上工作(並且可能很耗時),因此應該避免,但是_might_可能會被配置爲可以工作,我應該考慮到這種可能性。我想我會得到的代碼通常繞過192.168地址的呼叫,但提供一些覆蓋設置,將允許進行呼叫。這聽起來合理嗎? – KeithS 2013-04-24 05:35:16

+0

請注意,http://tools.ietf.org/html/rfc1918:10.0.0.0/8,172.16.0.0/12和192.168.0.0/16中定義了其他專用地址。該標準是提供一個選項來全局禁用gethostbyaddr並超時。有時公共地址查找也會掛起,30秒等待時間太長。 – 2013-04-24 05:55:03

+0

現在我假定192.168地址可能沒有反向DNS工作,但是更大的地址空間選項可能會有效。我會提供一些覆蓋選項。爲了我們的目的,我認爲這就夠了。我們的組織的10個網絡處理這個罰款,如果它也適用於家庭調制解調器,我會解決這個問題。無論如何,所有這些網絡代碼都將根據IPV6進行評估。感謝您的幫助,我正在回答這個問題。 – KeithS 2013-04-24 10:28:55

相關問題