如何找出我的外部 IP 地址是啥?
Posted
技术标签:
【中文标题】如何找出我的外部 IP 地址是啥?【英文标题】:How do I find out what my external IP address is?如何找出我的外部 IP 地址是什么? 【发布时间】:2010-11-11 20:48:13 【问题描述】:我的计算机位于路由器/防火墙后面。如何以编程方式找出我的外部 IP 地址是什么。我可以使用 http://www.whatsmyip.org/ 进行临时查询,但 TOS 不允许自动检查。
有什么想法吗?
【问题讨论】:
+1 尊重 TOS! 如果您不拥有正在使用的服务器,您需要确保在真正投入项目之前,您可以访问网络外部的主机。 你不能,因为通常一台计算机可能有几个 IP(或者没有,如果你的HTTP请求通过代理) 【参考方案1】:http://ipecho.net/plain 似乎是一个 可行的替代方案,因为 whatismyip.com 现在需要会员资格 他们的自动链接。他们看起来很友善 offering此服务免费, 所以请不要滥用它。
【讨论】:
有关为什么这是首选方式的更多信息:whatismyip.com/automation whatismyip 现在对这项服务收费。您可以通过whatismyip.com/membership-options了解更多信息【参考方案2】:不幸的是,没有简单的方法来做到这一点。
我会使用像 www.whatsmyip.org 这样的网站并解析输出。
checkip.dyndns.com 返回一个非常简单的 html 文件,如下所示:
<html> <head> <title>Current IP Check</title> </head> <body> Current IP Address: 84.151.156.163 </body> </html>
这应该很容易解析。 此外,该网站已存在约十年。 有希望它会存在一段时间。
【讨论】:
很遗憾,DynDns 服务只能在您使用他们的服务时使用 (dyn.com/support/developers/checkip-tool)。 我确实用过这个。在大多数语言中很容易解析——在 Python 中,只需一行代码即可删除所有额外的代码行(filebuffer[before:-after] 其中 before 和 after 是之前和之后的字符数,并且是常量.) @IvanMesic,您无需使用他们的任何服务即可使用本网站。【参考方案3】:如果您可以使用 modphp 访问网络服务器,您可以自己滚动:
<?php print $_SERVER['REMOTE_ADDR']; ?>
如果您不希望它被滥用,则必须对其保密或添加请求限制。
多年来,我一直在我的服务器上使用一个。
明确:
在您网站的 public_html 文件夹中创建一个名为 whatismyip.php 的文件。它可以被称为任何东西,并且可以在您的 webroot 中的任何位置。
添加上面的行,然后查询你的服务器:
curl http://example.com/whatismyip.php
例如。
【讨论】:
几年前我在我的服务器上添加了一个这样的脚本,它非常有用。其他一切都是奇怪的矫枉过正。 但是我们很懒惰,这就是为什么我们正在寻找一些快速的东西!【参考方案4】:不幸的是,从 2013 年开始,whatismyip.com 对该服务收费。
http://www.icanhazip.com 3 年后依然强劲。只是将 IP 输出为文本,没有别的。
http://checkip.dyndns.org 仍然有效。
如果您想确保它不会出现故障,您也可以使用 Google,但它仍然可以阻止您违反 TOS。
https://www.google.ie/search?q=whats+is+my+ip
但即使他们阻止了我,他们仍然会在错误消息中告诉我我的客户端 IP 地址。
【讨论】:
【参考方案5】:curl ifconfig.me
或
curl ifconfig.me/ip
如果你没有安装 curl,
wget ifconfig.me/ip 2>/dev/null && cat ip
希望这会有所帮助。
【讨论】:
【参考方案6】:如果您后面的路由器使用 UPnP,您可以随时使用 UPnP 库来为您开发的任何语言查询路由器的外部 IP。
【讨论】:
【参考方案7】:http://myexternalip.com 提供此类信息。到 检索您的 IP 您有很多选择:
http://myexternalip.com/ - 浏览器 + 大量使用示例 http://myexternalip.com/raw - 纯文本答案,只有你的 ip,没有其他废话 http://myexternalip.com/json - 为 json-parsers 准备的响应,也支持 jsonp HEAD http://myexternalip.com - 仅发送 HEAD 请求并获得答案【讨论】:
【参考方案8】:自从不久前有人问过这个问题以来,现在有一个免费提供的网络服务,专门用于让您以编程方式确定您的 IP 地址,称为ipify。
$ curl 'https://api.ipify.org?format=json'
结果
"ip": "1.2.3.4" /* your public IP */
【讨论】:
【参考方案9】:另一种方法是,如果您可以访问云电子邮件(雅虎、谷歌、hotmail),请给自己发送电子邮件。然后查看标头,您应该会在其中看到您的 IP 地址。
我会查找确切的区域,但标题可能因每个实施而异,查找接收者并按照该区域进行操作,直到找到类似于发送者的内容
编辑:这回答了如何找到 IP 地址,而不是通过 PROGRAMMATIC 方法
【讨论】:
这是一个效率极低的想法。 可能效率低下,但如果您在锁定的工作站上并且无法访问外部设备,则可以使用另一种方法。【参考方案10】:我的 WRT54G 路由器通过其本地路由器访问功能(http(s) 管理界面)告诉我,我想类似的事情可以用许多其他设备完成。在这种情况下,入口页面在包含以下短语的四行中给出了 IPv4 地址的八位字节:
class=num maxLength=3 size=3 value='i' name='wan_ipaddr_N' id='wan_ipaddr_N'
i 是八位字节值,N 是八位字节数。这段顺口溜为我提取并解析它,由 cygwin 提供:
#! /usr/bin/env perl
use strict;
use warnings 'all';
my( $account, $password ) = @ARGV;
open QUERY,
"curl --sslv3 --user '$account:$password' https://Linksys/ --silent |"
or die "Failed to connect to router";
my @ipaddr = ('x','x','x','x');
while( <QUERY> )
$ipaddr[$2] = $1 if /value='(\d+)' name='wan_ipaddr_([0-3])/;
close QUERY;
print join('.', @ipaddr);
不保证这适用于所有版本的路由器固件。
如果您的路由器设置为此接口使用 http,请删除 --sslv3 curl 选项,您可以使用点分十进制表示法来寻址路由器。要将 https 与上面的 curl 选项一起使用,我也这样做了:
使用浏览器获取路由器的自签名证书(保存为 Linksys.crt)。
将它添加到我的 CA 包中:
openssl x509 -in Linksys.crt -text >> /usr/ssl/certs/ca-bundle.crt
在我的主机文件(我的 Win8 机器上的 C:\Windows\System32\Drivers\etc\HOSTS)中添加了“Linksys”,作为路由器地址的别名。如果 curl 使用点分十进制表示法而不是此别名,则会由于证书使用者名称不匹配而拒绝连接。
或者,您可以只使用 --insecure 选项绕过证书验证,这在这种情况下可能更有意义。
【讨论】:
【参考方案11】:whatismyip.com 或 ipchicken.com 非常容易解析。
如果您有虚拟主机或 vps,您也可以确定它,而不必担心它会随机关闭而让您卡住。
【讨论】:
【参考方案12】:ifcfg.me 允许查找通过
nslookup 远程登录 ftp 和http
甚至适用于 IPv6
【讨论】:
【参考方案13】:这种用法简单但不优雅。我使用以下代码创建了一个 VBS 文件,以将结果拖放到保管箱和谷歌驱动器......尽管出于某种原因,必须删除该文件以供新文件同步。
这在我家的 PC 上运行。我的电脑设置为在停电时恢复,并且计划每天运行一次此任务(请注意,如果您经常运行它,该站点将阻止您的请求)。
现在我可以在路上获取我的 IP 地址并观看人们窃取我的东西 :-)
get_html "http://ipecho.net/plain", "C:\Users\joe\Google Drive\IP.html"
get_html "http://ipecho.net/plain", "C:\Users\joe\Dropbox\IP.html"
sub get_html (up_http, down_http)
dim xmlhttp : set xmlhttp = createobject("msxml2.xmlhttp.3.0")
xmlhttp.open "get", up_http, false
xmlhttp.send
dim fso : set fso = createobject ("scripting.filesystemobject")
dim newfile : set newfile = fso.createtextfile(down_http, true)
newfile.write (xmlhttp.responseText)
newfile.close
set newfile = nothing
set xmlhttp = nothing
end sub
【讨论】:
以上是关于如何找出我的外部 IP 地址是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 STUN 请求中获取我的外部 IP 地址和外部端口号?