Как я могу получить свой публичный IP-адрес из командной строки, если я за маршрутизатором?

37

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

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

user61954
источник
Можете ли вы добавить более подробную информацию о вашей сети? Вы за маршрутизатором / коммутатором , который делает доступ к Интернету , и вы пытаетесь установить WAN IP - адрес, маршрутизатор / коммутатор , получая от провайдера?
СЛМ
@slm Я за роутером и муравьем, чтобы узнать ip, назначенный роутеру интернет-провайдером
user61954 22.12.12
Смотрите третий способ, который я только что добавил в свой ответ. Вы захотите узнать, есть ли способ получить ваш WAN IP от вашего роутера. Какой маркой / моделью является роутер?
SLM
Вы должны запросить какой-то внешний сервис. Вообще говоря, компьютер не знает, с какого IP-адреса другие компьютеры будут видеть его соединения.
Дэвид Шварц

Ответы:

27

Если предположить , что система имеет 2 локальных сетей устройств, eth0а eth1и eth0подключен к локальной сети, скажем , IP - адреса 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 к коробке с доступом к WAN и используете домашний маршрутизатор / коммутатор, такой как 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-адрес из командной строки

ОДС
источник
У меня есть что-то вроде моей системы подключается к маршрутизатору, и он подключен к внутренней сети
user61954
5
Поскольку он заявил, что не подключен напрямую, ни одно из eth*устройств не будет иметь WAN IP. Если его маршрутизатор не поддерживает ssh, у него есть доступ, и если он настроен, это не сработает. Не понижение голоса, но любой, кто пытается это сделать, знает об этом.
AaronLS
Перечитайте его вопрос. Он говорит, что у него есть доступ к локальной сети, но нет доступа к Интернету, пункт № 1. Пункт # 2 говорит , что он получает динамический IP - адрес от своего провайдера, я предполагаю , что он либо получил другую систему в ч / б его только по локальной сети связи и сети Интернет или у него есть домашний маршрутизатор / коммутатор / б его и в Интернете.
СЛМ
Downvoters, попробуйте оставить комментарий, этот ответ является наиболее полным, и все же люди не голосуют. @ user61954 даже сказал в своих комментариях, что он за роутером, поэтому один из описанных мною методов будет работать.
СЛМ
Я проголосовал. Но первый и второй способ не работают, он возвращает только адрес localip. Благодарность!
Джаред Берроуз
12

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

curl ifconfig.me
Рори
источник
Эй, спасибо, это помогает мне, только один вопрос. Что такое "ifconfig.me"? Я знаю функцию ifconfig, но я обычно не с этим. Пожалуйста, дайте мне ссылку, чтобы прочитать об этом или объяснить. - Обновление-- не читал вопрос. ups
Aby W
ifconfig.me это веб-сайт, который дает вам ваш IP.
Рори
ifconfig.me не поддерживает https, поэтому он может быть подделан. Не очень хорошая идея использовать его для проверки работоспособности вашего VPN.
Дан Даскалеску
9

Когда вы находитесь за 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
daeme
источник
5

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

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

dig +short myip.opendns.com @resolver1.opendns.com
Персиваль Улисс
источник
+1, но в конце дня O F находит его же , как с использованием , curl ident.meкак мы полагаемся ОСАМИ конкретной услуги (в myip.opendns,comэтом специальном обсаженных Theat 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,'

rhasti
источник
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предполагает, что вы напрямую подключены к Интернету.

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

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

Якорь,
источник
ifconfigне рекомендуется.
BatchyX
msgstr "команда traceroute, но она выдает локальный ip локальной сети, 192.168.1.1". Так что я думаю, что есть LAN. Поэтому где-то должен быть какой-то маршрутизатор / шлюз / nat. Тогда ifconfig не будет выдавать публичный IP-адрес, так как комп оп напрямую не подключен к Интернету.
@BatchyX. Какую ОС вы используете? Каждая система, на которой я работаю, имеет ifconfig. Fedora, CentOS, Ubuntu и т.д.
SLM
2
@batchx: А где ты взял эту информацию? Я не согласен с вами по этому поводу.
mdpc 22.12.12
1
@sim: Поскольку команда присутствует, это не значит, что она не устарела. Просто посмотрите на ifconfigпоследнюю дату выпуска. Теперь посмотрите на ìproute2последний выпуск. Что касается источника, см. Lartc.org/howto/lartc.iproute2.html#LARTC.IPROUTE2.WHY
BatchyX
-1
curl checkip.dyndns.org

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

Уильям Энтрикен
источник
2
curl icanhazip.com
paradroid