我怎样才能以编程方式获取从 Internet 看到的我的网络的 IP 地址?它显然是我的路由器在连接到 ISP 时可以访问的属性。有没有办法使用标准协议从路由器获取此信息。我唯一的其他选择是找到一个返回我的 IP 地址的 WS(非常难以做到),或者只是去whatismyip.com之类的东西并删除所有 HTML(非常脏且容易更改)。有没有别的办法???
4 回答
不要抓取 whatismyip.com,请参阅此处了解如何调用他们的 API,该 API 只返回您的地址。
如果你不使用它,你必须自己写一些类似的东西,即你的路由器之外的主机,它可以报告你的明显地址。
请注意,网络服务器可能看不到您的真实 WAN IP 地址,因为:
您的 ISP 可能正在透明地代理 HTTP 流量,并且服务器会看到代理的 IP。在这种情况下,您通常需要查找并解析 X-Forwarded-For标头。
或者,正如 Olaf 所指出的,您和广泛开放的 Internet 之间可能存在另一个 NAT 路由器,换句话说,您的路由器的 WAN 地址位于专用网络上。您从 whatismyip.com 之类的服务中获得的最佳结果是最外层 NAT 路由器的 IP。
我投票赞成 Paul Dixons 的回答,因为它看起来很完整,但还有一个方面:
- 您的 ISP 可能会为您提供私有地址 -某些 ISP确实会发生这种情况。根据您的期望,您可能需要一个您没有的可路由地址
- 如果您自己有代理,Paul 提到的代理信息(HTTP-Header X-Forwarded-For)可能是不可路由的地址
- 基于混合所有这些方面(从您的 ISP 获取不可路由的地址并自己拥有代理),您可能会得到奇怪的结果。
这些方面不是典型的日常情况,但根据您的需要,您可能需要考虑这些方面。
如果您的路由器支持 snmp,您可以使用它来询问它的外部 ip。在这里可以找到一个小例子:
我没有看到语言规范,但我在 python 中做到了:在 Python 中查找面向公众的 IP 地址?
如果不依赖外部服务器,基本上没有办法做到这一点,在这种情况下,我使用http://www.whatismyip.com/automation/n09230945.asp,它只提供 IP 地址。或者,您可以使用自己的脚本,在 PHP 中如下所示:
<?php
echo $_SERVER['REMOTE_ADDR'];
?>