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

use*_*954 41 internet dynamic-ip command-line ip

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

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

slm*_*slm 29

假设你的系统有2台以太网设备,eth0eth1eth0连接到您的网络,说IP地址192.168.1.X,你的eth1设备连接到您的ISP(WAN),你会想用下面的ifconfig命令来获得你的IP为广域网侧。

注意:第一种 2 种方法假设您在具有 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
Run Code Online (Sandbox Code Playgroud)

您也可以使用该ip命令。

% ip addr show eth1 | awk '/inet/ {print $2}' | sed 's#/.*##'
54.234.1.33
Run Code Online (Sandbox Code Playgroud)

第二种方式

如果您需要从仅位于 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
Run Code Online (Sandbox Code Playgroud)

第三种方式

如果您无法通过 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
Run Code Online (Sandbox Code Playgroud)

注意:此方法高度依赖于您拥有的路由器/交换机,无论是 Linksys、Netgear 等品牌。每个人都有自己独特的页面,上面有 WAN IP。

第四种方式

向外部 Internet 站点发送查询,该站点将报告您的 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
Run Code Online (Sandbox Code Playgroud)

此处提供了其他信息:HOWTO:从命令行检查您的外部 IP 地址

  • 由于他声明他没有直接连接,因此所有“eth*”设备都不会拥有 WAN IP。除非他的路由器支持 ssh,否则他有访问权限,如果没有配置,这是行不通的。不是投反对票,而是让任何试图这样做的人都知道。 (5认同)

Ror*_*ory 12

如果您的系统安装了 curl(大多数都安装了),您可以使用

curl ifconfig.me
Run Code Online (Sandbox Code Playgroud)


小智 12

当您在带有 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-
Run Code Online (Sandbox Code Playgroud)

您可以在脚本中使用它,例如用于 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
Run Code Online (Sandbox Code Playgroud)


Per*_*ses 6

最有可能的是,如果不应该或不能使用外部服务,路由器必须提供一种获取外部 IP 的方法(正如其他一些答案已经指出的那样)。对于外部服务,在大多数其他答案中,使用了 Web 服务。Unix SE 上的这个答案建议改用 DNS。

例如,使用digOpenDNS的作为分解器:

dig +short myip.opendns.com @resolver1.opendns.com
Run Code Online (Sandbox Code Playgroud)


小智 5

通过 ssh 或 curl 从路由器获取信息。

我使用 curl 向 dyndns 询问我的公共 IP,但这样的命令似乎不适用于您,对吗?

curl http://checkip.dyndns.org 2> /dev/null| perl -pe 's,.*Address: (\d+\.\d+\.\d+\.\d+).*,$1,'