36

Есть ли способ получить мой публичный (WAN) IP-адрес в командной строке? Я нахожусь за маршрутизатором (сеть LAN) с динамическим IP-адресом, назначенным моим провайдером.

Я видел решения, использующие внешний веб-сервис (например, ifconfig.me), но я хочу знать, смогу ли я сделать это без внешнего сервиса.

9 ответов9

25

Предполагая, что ваша система имеет 2 Ethernet-устройства, eth0 и eth1 и eth0 подключены к вашей локальной сети, скажем IPs 192.168.1.X и ваше устройство eth1 подключено к вашему провайдеру (WAN), вы захотите использовать следующую команду ifconfig чтобы получить свой IP для стороны WAN.

ПРИМЕЧАНИЕ. Первые 2 способа предполагают, что вы запускаете их на компьютере с двумя сетевыми устройствами и одно из них подключено к вашему провайдеру (кабельный модем и / или модем DSL). В этом случае устройство Ethernet (eth1) будет настроено с вашим IP-адресом в Интернете (WAN IP).

1-й путь

                          +------------------------+
  +--------+    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

2-й способ

Если вам нужно выяснить это из системы, которая находится только в локальной сети, вы можете установить ssh-ключ без пароля и добавить его к учетной записи на вашем компьютере локальной сети, чтобы он мог удаленно обращаться к системе с помощью доступа к глобальной сети, например, так.

                                                            +----------------+
  +--------+    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

3-й способ

Если вы не можете подключиться по ssh к блоку с доступом к глобальной сети и используете домашний маршрутизатор / коммутатор, например блок Linksys или Netgear. Вы можете получить IP-адрес с этого устройства через страницу состояния HTTP. Я делал это и раньше, что-то похожее на то, что описано в этом посте на форуме 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 и т.д. У каждого будет своя уникальная страница с IP-адресом WAN.

4-й способ

Отправка запроса на внешний интернет-сайт, который сообщит ваш 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-адрес из командной строки

11

Если в вашей системе установлен curl (большинство так и делают), вы можете использовать

curl ifconfig.me
8

Когда вы находитесь за NAT-маршрутизатором с UPNP, вы можете использовать miniupnpc для определения ненадежного 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
4

Скорее всего, маршрутизатор должен предоставить способ получения внешнего IP-адреса, если внешняя служба не может или не может использоваться (как уже указывалось в некоторых других ответах). Для внешних сервисов в большинстве других ответов используется веб-сервис. Этот ответ в Unix SE предлагает вместо этого использовать DNS.

Например, используя dig с OpenDNS в качестве резольвера:

dig +short myip.opendns.com @resolver1.opendns.com
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.

Но что касается внешних сервисов, я должен предложить быстрый и простой, который я написал, identif.me, который вы можете использовать как для IPv4, так и для IPv6; для простейшей формы вы можете использовать curl ident.me а полный API документирован на http://api.ident.me/

1

Если ваш маршрутизатор поддерживает NAT PMP (Port Mapping Protocol), вы можете получить ваш публичный IP-адрес с помощью natpmp.

Есть интерфейс командной строки для библиотеки linux natpmp под названием natpmpc. В Ubuntu он находится в пакете natpmp-utils . Мой роутер не поддерживает natpmp, поэтому я не уверен, что утилита natpmpc вернет ваш публичный IP-адрес.

0

Команда linux, которую вы ищете, - ifconfig предполагающая, что вы напрямую подключены к Интернету.

Если нет и доступ осуществляется через прокси или специальную маршрутизацию, самый простой способ (как указывают другие) - войти в систему / получить доступ к другому хосту и проверить его оттуда.

Кроме того, вы можете обсудить этот вопрос со своим дружественным администратором систем соседства.

-1
curl checkip.dyndns.org

Сед, что если вам нужно

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .