以编程方式发现公共IP

has*_*sen 26 python tcp ip-address

我在路由器后面,我需要一个简单的命令来发现我的公共IP(而不是谷歌搜索我的IP和点击结果)

这有什么标准协议吗?我听说过STUN,但我不知道怎么用它?

PS我打算写一个简短的python脚本来做

Car*_*rra 23

这可能是最简单的方法.解析以下命令的输出:

  1. 运行traceroute以查找距离您的计算机少于3跳的路由器.
  2. 使用选项运行ping以记录源路由并解析输出.记录路线中的第一个IP地址是您的公共IP地址.

例如,我在Windows机器上,但同样的想法也应该来自unix.

> tracert -d www.yahoo.com

Tracing route to www-real.wa1.b.yahoo.com [69.147.76.15]
over a maximum of 30 hops:

  1    <1 ms    <1 ms    <1 ms  192.168.14.203
  2     *        *        *     Request timed out.
  3     8 ms     8 ms     9 ms  68.85.228.121
  4     8 ms     8 ms     9 ms  68.86.165.234
  5    10 ms     9 ms     9 ms  68.86.165.237
  6    11 ms    10 ms    10 ms  68.86.165.242
Run Code Online (Sandbox Code Playgroud)

68.85.228.121是Comcast(我的提供商)路由器.我们可以说:

> ping -r 9 68.85.228.121 -n 1

Pinging 68.85.228.121 with 32 bytes of data:

Reply from 68.85.228.121: bytes=32 time=10ms TTL=253
    Route: 66.176.38.51 ->
           68.85.228.121 ->
           68.85.228.121 ->
           192.168.14.203
Run Code Online (Sandbox Code Playgroud)

瞧!66.176.38.51是我的公共IP.

  • 但请注意"许多主机忽略或丢弃RECORD_ROUTE选项." 见man ping. (3认同)
  • +1:也许不是最简单的方法,但看到一种不依赖某些网站的方式是很好的. (2认同)

Tim*_*ews 17

我已经创建了一个连接到http://automation.whatismyip.com/n09230945.asp的程序, 它是用D写的,让其他人告诉你他们看到你的ip,这可能是最可靠的方式:

/*
    Get my IP address
*/


import tango.net.http.HttpGet;
import tango.io.Stdout;

void main()
{
      try
      {
          auto page = new HttpGet ("http://automation.whatismyip.com/n09230945.asp");
          Stdout(cast(char[])page.read);
      }
      catch(Exception ex)
      {
          Stdout("An exception occurred");
      }
}
Run Code Online (Sandbox Code Playgroud)

编辑python代码应该像:

from urllib import urlopen
print urlopen('http://automation.whatismyip.com/n09230945.asp').read()
Run Code Online (Sandbox Code Playgroud)


mcr*_*mcr 11

瞄准www.whatsmyip.org很粗鲁.他们请求不要在页面上这样做.

只有与目标处于同一NAT级别的系统才会看到相同的IP.例如,您的应用程序可能落后于多层NAT(当您离开美国时,这种情况会更多,因为美国的IP过剩).

STUN确实是最好的方法.通常,您应该计划在应用程序可以询问的某个地方运行(STUN)服务器:不要硬编码其他人的服务器.您必须编写代码以发送一些特定的消息,如rfc5389中所述.

我建议阅读和相关链接. http://www.ietf.org/html.charters/behave-charter.html

您可能更愿意查看IPv6和Teredo以确保始终具有IPv6访问权限.(微软Vista让这很容易,我被告知)

  • 我在whatismyip.org上看不到这样的请求.你在说什么页面? (3认同)

rye*_*guy 8

无论什么时候我想这样做,我都会抓住whatismyip.org.当您访问该网站时,它会为您提供纯文本公共IP.干净利落.

只需让您的脚本访问该站点并阅读IP即可.

我不知道您是否在帖子中暗示这一点,但是无法从您自己的计算机上获取您的公共IP.它必须来自外部来源.

2013编辑:此网站现在返回图像而不是文本,因此它没有用于此目的.


Daw*_*žan 8

我喜欢ipify.org:

  • 它可以免费使用(甚至可以编程,甚至是繁重的流量)
  • 响应只包含没有任何垃圾的IP地址(不需要解析)
  • 您也可以在JSON中请求响应
  • 适用于IPv4和IPv6
  • 它托管在云端
  • 它是开源的
$ curl api.ipify.org
167.220.196.42

$ curl "api.ipify.org?format=json"
{"ip":"167.220.196.42"}
Run Code Online (Sandbox Code Playgroud)

  • 它工作得很好。如果您怀疑某些网络无法正常工作,请先尝试一些服务,例如 http://downforeveryoneorjustme.com/ipify.org。 (2认同)

the*_*lfe 7

编辑:curlmyip.com不再可用.(感谢maxywb)

原帖:

撰写本文时,curlmyip.com有效.从命令行:

curl curlmyip.com
Run Code Online (Sandbox Code Playgroud)

这是一个第三方网站,可能会在未来几年内提供或不提供.但就目前而言,这看起来非常简单.

  • 另一个服务:“ curl icanhazip.com” (2认同)

bor*_*yer 5

正如几个人所提到的,STUN确实是正确的解决方案.