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


37

我可以通过命令行获取我的公共(WAN)IP地址吗?我在路由器(LAN网络)后面,该路由器具有由ISP分配的动态IP地址。

我已经看到了使用外部Web服务(例如ifconfig.me)的解决方案,但是我想知道是否可以在没有外部服务的情况下进行操作。


您能否添加有关网络设置的更多详细信息?你是一个路由器/交换机后面这DOES访问互联网,你要确定WAN IP地址,该路由器/交换机从您的ISP获得?
slm 2012年

@slm我在路由器和蚂蚁后面,找出由ISP分配给路由器的ip
user61954

请参阅我刚刚添加到答案中的第三种方法。您将要查看是否有办法从路由器获取WAN IP。路由器的品牌/型号是什么?
slm 2012年

您必须查询某种外部服务。一般来说,一台计算机不知道其他计算机将从哪个IP地址看到其连接。
大卫·史瓦兹

Answers:


27

假设你的系统有2台以太网设备,eth0eth1eth0连接到您的网络,说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地址


我的系统连接到路由器,并且连接到内部网
user61954

5
因为他说他没有直接连接,所以所有eth*设备都没有WAN IP。除非他的路由器支持ssh,否则他将具有访问权限,而ifconfig则无法使用。不能投票,但是任何尝试这样做的人都可以知道。
AaronLS

重新阅读他的问题。他说他拥有局域网访问权限,但没有互联网访问权限,这是第一项。第2项表示他正在从ISP获得动态IP,我假设他或者在他的仅LAN连接和Internet上有另一个系统,或者他在他和Internet 上有了家用路由器/交换机。
slm 2012年

不赞成投票的人,请尝试发表评论,这个答案是迄今为止最完整的,但是人们对此表示反对。@ user61954甚至在评论中说他在路由器后面,因此我所描述的方法之一将起作用。
slm 2012年

我投票了。但是第一种和第二种方法不起作用,它仅返回localip地址。谢谢!
Jared Burrows

12

如果您的系统已安装curl(大多数情况下),则可以使用

curl ifconfig.me

嘿,谢谢,这对我有帮助,只是一个问题,什么是“ ifconfig.me”,我知道它是ifconfig函数,但是我通常不这样做。请给我一个链接以阅读或解释它。-更新-没有读到这个问题。ups
Aby W

ifconfig.me是一个为您提供IP的网站。
罗里

ifconfig.me不支持https,因此可能被欺骗。使用它来检查您的VPN是否已启动不是一个好主意。
Dan Dascalescu

9

当您在带有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

5

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

例如,使用dig具有OpenDNS的作为分解器:

dig +short myip.opendns.com @resolver1.opendns.com

+1,但最后一天的使用curl ident.me与我们依赖的特定服务相同(在myip.opendns,com特殊情况下,通过DNS服务器进行特殊处理)
nhed

4

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

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

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


2

不幸的是,没有办法检测不涉及联系远程服务的NAT之类的机制。除了服务中断外,NAT本质上对用户完全透明,并且没有用于NAT发现的标准协议。

但就外部服务而言,我必须建议我编写的快速,简单的服务ident.me,您可以将其用于IPv4和IPv6。您可以使用最简单的形式curl ident.me,完整的API记录在http://api.ident.me/


1

如果您的路由器支持NAT PMP(端口映射协议),则可以使用natpmp检索公共IP。

linux natpmp库有一个命令行界面,称为natpmpc。在ubuntu上,它位于natpmp-utils软件包中。我的路由器似乎不支持natpmp,因此我不确定natpmpc实用程序将返回您的公共IP。


0

您要查找的linux命令ifconfig假设您已直接连接到Internet。

如果不是,并且通过代理或特殊路由进行访问,则最简便的方法(正如其他人指出的那样)是登录/访问另一台主机,然后从那里进行检查。

另外,您可能想与友善的邻里系统管理员讨论此问题。


ifconfig不推荐使用。
BatchyX

“ traceroute命令,但它给出了局域网的本地IP,192.168.1.1”。所以我猜有一个局域网。因此,某处必须有某种路由器/网关/ nat。然后,由于op的comp没有直接连接到Internet,ifconfig将不会提供公共IP地址。

@BatchyX。您正在运行什么操作系统?我正在运行的每个系统都有ifconfig。Fedora,CentOS,Ubuntu等
slm

2
@batchx:那您从哪里得到这些信息?我不同意你的看法。
mdpc

1
@sim:因为存在命令并不意味着它不被弃用。只要看看ifconfig最新的发行日期即可。现在查看ìproute2最新版本。至于来源,请参阅lartc.org/howto/lartc.iproute2.html#LARTC.IPROUTE2.WHY
BatchyX 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.