如果我在路由器后面,如何从命令行获取我的公共 IP 地址?

如果我在路由器后面,如何从命令行获取我的公共 IP 地址?

有没有办法在命令行上获取我的公共 (WAN) IP 地址?我在路由器 (LAN 网络) 后面,有一个由我的 ISP 分配的动态 IP 地址。

我见过使用外部 web 服务(例如ifconfig.me)的解决方案,但我想知道是否可以在没有外部服务的情况下做到这一点。

答案1

假设您的系统有 2 个以太网设备,eth0并且连接到您的 LAN,假设 IP 为 192.168.1.X,并且您的设备已连接到您的 ISP(WAN) eth1,您将需要使用以下命令来获取 WAN 端的 IP。eth0eth1ifconfig

笔记:前两种方法假设您在一台有 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,'

相关内容