2013-04-24 37 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

相关问题