有没有办法在命令行上获取我的公共 (WAN) IP 地址?我在路由器 (LAN 网络) 后面,有一个由我的 ISP 分配的动态 IP 地址。
我见过使用外部 web 服务(例如ifconfig.me
)的解决方案,但我想知道是否可以在没有外部服务的情况下做到这一点。
答案1
假设您的系统有 2 个以太网设备,eth0
并且连接到您的 LAN,假设 IP 为 192.168.1.X,并且您的设备已连接到您的 ISP(WAN) eth1
,您将需要使用以下命令来获取 WAN 端的 IP。eth0
eth1
ifconfig
笔记:前两种方法假设您在一台有 2 个以太网设备的计算机上运行它们,并且其中一个连接到您的 ISP(电缆调制解调器和/或 DSL 调制解调器)。在这种情况下,以太网设备 (eth1) 将配置您在互联网上的 IP 地址 (WAN IP)。
第一种方式
+------------------------+
+--------+ 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
第三种方式
如果您无法通过 SSH 进入具有 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
更多信息请访问此处:如何:从命令行检查外部 IP 地址
答案2
当您位于具有 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
答案3
有一个 Web 服务,当你 curl 它时它会提供你的 IP 地址:
curl ifconfig.me
答案4
通过 ssh 或 curl 从您的路由器获取信息。
我使用 curl 向 dyndns 询问我的公共 IP,但是这样的命令似乎不适用于你,对吗?
curl http://checkip.dyndns.org 2> /dev/null| perl -pe 's,.*Address: (\d+\.\d+\.\d+\.\d+).*,$1,'