我可以通过命令行获取我的公共(WAN)IP地址吗?我在路由器(LAN网络)后面,该路由器具有由ISP分配的动态IP地址。
我已经看到了使用外部Web服务(例如ifconfig.me
)的解决方案,但是我想知道是否可以在没有外部服务的情况下进行操作。
我可以通过命令行获取我的公共(WAN)IP地址吗?我在路由器(LAN网络)后面,该路由器具有由ISP分配的动态IP地址。
我已经看到了使用外部Web服务(例如ifconfig.me
)的解决方案,但是我想知道是否可以在没有外部服务的情况下进行操作。
Answers:
假设你的系统有2台以太网设备,eth0
并eth1
与eth0
连接到您的网络,说IP地址192.168.1.X,你的eth1
设备连接到您的ISP(WAN),你会想用下面的ifconfig
命令来获得你的IP为WAN端。
注意:第一种2种方式假定您正在具有2个以太网设备的计算机上运行它们,并且其中一个已连接到ISP(电缆调制解调器和/或DSL调制解调器)。在这种情况下,将使用您在Internet(WAN IP)上的IP地址来配置以太网设备(eth1)。
第一种方式
+------------------------+
+--------+ WAN IP | Computer that wants | LAN IP
|Internet|--------------| to know WAN IP |------------
+--------+ 54.234.1.33 | +------+ +------+ | 192.168.1.1
+-| eth1 |------| eth0 |-+
+------+ +------+
% ifconfig eth1 | awk '/inet / { print $2 }' | sed -e s/addr://
54.234.1.33
您也可以使用该ip
命令。
% ip addr show eth1 | awk '/inet/ {print $2}' | sed 's#/.*##'
54.234.1.33
第二路
如果您需要从仅位于LAN上的系统中找到此信息,则可以设置无密码的ssh密钥,并将其添加到LAN机器上的帐户中,以便它可以像这样通过WAN访问来远程访问系统。
+----------------+
+--------+ WAN IP +-------------+ LAN IP | Computer that |
|Internet|----------------|remote-server|-----------------| wants to know |
+--------+ 54.234.1.33 +----+-----+----+ 192.168.1.x +----+ WAN IP |
|eth1| |eth0| |eth0|------------+
+----+ +----+ +----+
% ssh ruser1@remote-server "ifconfig eth1 | awk '/inet / { print \$2 }' | sed -e s/addr://"
54.234.1.33
第三种方式
如果您无法进入具有WAN访问权限的盒子,并且正在使用家用路由器/交换机,例如Linksys或Netgear盒子。您可能可以通过HTTP状态页面从该设备获取IP。我过去也这样做过,类似于whatismyip.com论坛帖子中所描述的内容。
192.168.1.2
+----------------+
+--------+ WAN IP +-------------+ LAN IP | Computer that |
|Internet|----------------|router/switch|-----------------| wants to know |
+--------+ 54.234.1.33 +-------------+ 192.168.1.x +----+ WAN IP |
192.168.1.1 |eth0|------------+
+----+
# something like this....
% wget -q -O - http://<username>:<password>@192.168.1.1/Status_Router.asp | grep "ipaddress" | cut -d" " -f2
注意:此方法高度依赖于您拥有的路由器/交换机,无论它是Linksys,Netgear等品牌。每个人都有自己的独特页面,上面有WAN IP。
第四方式
向外部互联网站点发送查询,该查询将报告您的WAN IP地址。
注意:我知道原始问题提到他们正在寻找这种方法的替代方法,但我将其放在此处,以便此答案涵盖所有基础。
+---------------+
+-------------+ +--------+ +------+ LAN IP | Computer that |
|whatsmyip.com|---|Internet|---|router|---------------| wants to know |
+-------------+ +--------+ +------+ 192.168.1.x +----+ WAN IP |
you're 54.234.1.33 |eth0|-----------+
+----+
# 1st server
% wget -qO - ipv4bot.whatismyipaddress.com
54.234.1.33
# 2nd server
% curl 'https://api.ipify.org?format=json'
{"ip":"54.234.1.33"}
% curl 'https://api.ipify.org?format=txt'
54.234.1.33
# 3rd server
% curl -s checkip.dyndns.org | sed 's#.*Address: \(.*\)</b.*#\1#'
54.234.1.33
其他信息在这里:HOWTO:从命令行检查您的外部IP地址
eth*
设备都没有WAN IP。除非他的路由器支持ssh,否则他将具有访问权限,而ifconfig则无法使用。不能投票,但是任何尝试这样做的人都可以知道。
如果您的系统已安装curl(大多数情况下),则可以使用
curl ifconfig.me
当您在带有UPNP的NAT路由器后面时,可以使用miniupnpc来检测WAN IP地址:
# debian/ubuntu setup:
# sudo apt-get install miniupnpc
# get WAN IP address from UPNP router:
upnpc -s | grep ^ExternalIPAddress | cut -c21-
您可以在脚本中使用它,例如用于cron:
#!/bin/bash
#
# In this example, lynx is used as http client. you could also use something else
# like wget etc.
# debian/ubuntu lynx setup:
#
# apt-get install lynx
#
EXTIP=`upnpc -s | grep ^ExternalIPAddress | cut -c21-`
DDNSURL="http://your-ddns-service.com/update/my/ip/to/$EXTIP"
TFILE=/tmp/.WAN_IP
if [ -f $TFILE ]; then
OXTIP=`head -1 $TFILE`
else
touch $TFILE
OXTIP="NULL"
fi
if [ "$EXTIP" != "$OXTIP" ]; then
mv $TFILE "$TFILE~"
echo "$EXTIP" > $TFILE
lynx -source $DDNSURL > /dev/null
echo "================================"
date
echo "WAN_IP = $EXTIP"
fi
不幸的是,没有办法检测不涉及联系远程服务的NAT之类的机制。除了服务中断外,NAT本质上对用户完全透明,并且没有用于NAT发现的标准协议。
但就外部服务而言,我必须建议我编写的快速,简单的服务ident.me,您可以将其用于IPv4和IPv6。您可以使用最简单的形式curl ident.me
,完整的API记录在http://api.ident.me/
您要查找的linux命令ifconfig
假设您已直接连接到Internet。
如果不是,并且通过代理或特殊路由进行访问,则最简便的方法(正如其他人指出的那样)是登录/访问另一台主机,然后从那里进行检查。
另外,您可能想与友善的邻里系统管理员讨论此问题。
ifconfig
不推荐使用。
ifconfig
最新的发行日期即可。现在查看ìproute2
最新版本。至于来源,请参阅lartc.org/howto/lartc.iproute2.html#LARTC.IPROUTE2.WHY