Команда для определения моего общедоступного IP-адреса?

Если я проверю с гугл, я могу видеть свой публичный IP-адрес. Есть ли что-то в командной строке Ubuntu, что даст мне тот же ответ?

Если вы не находитесь за маршрутизатором, вы можете узнать это с помощью ifconfig.

Если вы находитесь за маршрутизатором, то ваш компьютер не будет знать об общедоступном IP-адресе, поскольку маршрутизатор выполняет преобразование сетевого адреса. Вы могли бы спросить какой-нибудь веб-сайт, какой ваш общедоступный IP-адрес использует curl или wget и извлеките из него нужную вам информацию:

curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'  

или короче

curl https://ipinfo.io/ip

Для поиска внешнего IP-адреса вы можете либо использовать внешние веб-сервисы, либо использовать системные методы. Проще всего использовать внешнюю службу, а также ifconfig основанные решения будут работать в вашей системе только в том случае, если вы не стоите за NAT. эти два метода были подробно рассмотрены ниже.

Поиск внешнего IP-адреса с помощью внешних служб

Самый простой способ - использовать внешнюю службу через браузер командной строки или средство загрузки. С wget доступен по умолчанию в Ubuntu, мы можем использовать это.
Чтобы найти свой ip-адрес, используйте-

$ wget -qO- https://ipecho.net/plain ; echo

Вежливость:

Вы также могли бы использовать lynx(браузер) или curl на месте wget с небольшими изменениями приведенной выше команды, чтобы найти ваш внешний ip-адрес.

С помощью curl чтобы найти ip-адрес:

$ curl https://ipecho.net/plain

Для лучшего форматирования выходных данных используйте:

$ curl https://ipecho.net/plain ; echo

Более быстрый (возможно, самый быстрый) метод, использующий dig с OpenDNS как решающий:

Все остальные ответы здесь передаются по протоколу HTTP на удаленный сервер. Некоторые из них требуют синтаксического анализа выходных данных или полагаются на заголовок User-Agent, чтобы сервер отвечал простым текстом. Они также довольно часто меняются (опускаются, меняют свое название, размещают рекламу, могут изменить формат вывода и т.д.).

  1. Протокол ответа DNS стандартизирован (формат останется совместимым).
  2. Исторически сложилось так, что службы DNS (OpenDNS, Google Public DNS, ..), как правило, существуют гораздо дольше и являются более стабильными, масштабируемыми и в целом обслуживаемыми, чем любые новые hip whatismyip.com HTTP-сервис сегодня очень популярен.
  3. (для тех фанатов, которые заботятся о микрооптимизации), этот метод должен быть изначально быстрее (пусть всего на несколько микросекунд).

Использование dig с OpenDNS в качестве распознавателя:

$ dig +short myip.opendns.com @resolver1.opendns.com111.222.333.444

Скопировано с: https://unix.stackexchange.com/a/81699/14497

Поиск внешнего IP-адреса без использования внешних служб

  • Если вы знаете имя своего сетевого интерфейса

Введите следующее в своем терминале:

$ LANG=c ifconfig <interface_name> | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

В приведенном выше примере замените <interface_name> с именем вашего фактического интерфейса, например: eth0, eth1, pp0 и т.д...

Пример Использования:

$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'111.222.333.444
  • Если вы не знаете имя своего сетевого интерфейса

Введите следующее в своем терминале (при этом будут получены имя и IP-адрес каждого сетевого интерфейса в вашей системе).:

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'

Пример Использования:

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'lo: 127.0.0.1ppp0: 111.222.333.444

N.B: Результаты являются ориентировочными, а не реальными.

Вежливость: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/

ОБНОВЛЕНИЕ

  1. LANG=c был добавлен в ifconfig основанный на обычаях, так что он всегда выдает вывод на английском языке, независимо от настройки локали.

Моим любимым всегда было :

curl ifconfig.me

простой, легко набираемый текст.

Сначала вам придется установить curl ;)

Если ifconfig.me находится внизу, попробуйте icanhazip.com и или ipecho.net

curl icanhazip.com

или

curl ipecho.net

icanhazip.com это мое любимое блюдо.

curl icanhazip.com

Вы можете явно запросить IPv4:

curl ipv4.icanhazip.com

Если у вас нет curl Вы можете использовать wget вместо:

wget -qO- icanhazip.com

Я обнаружил, что все это раздражает и замедляет, поэтому я написал свой собственный. Это просто и быстро.

Его API находится на http://api.ident.me/

Примеры:

curl ident.mecurl v4.ident.mecurl v6.ident.me

Технический дизайн: в DNS, ident.me имеет записи как A, так и AAAA, v4.ident.me имеет только запись A, и v6.ident.me имеет только запись AAAA. Порты 443 и 80 на этих IP-адресах обслуживаются nginx с использованием SSL с использованием сертификатов, предоставленных letsencrypt.org через certbot и со следующей конфигурацией (выдержка):

server {  […]  server_name .ident.me;  location / {    default_type text/plain;    return 200 $remote_addr;    add_header Access-Control-Allow-Origin "*";    add_header Cache-Control "no-cache, no-store, must-revalidate";  }}

Вы могли бы использовать DNS-запрос вместо HTTP-запроса, чтобы узнать свой общедоступный IP-адрес:

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

Он использует resolver1.opendns.com dns-сервер для разрешения магического myip.opendns.com имя хоста для твой ip-адрес.

Amazon AWS

curl https://checkip.amazonaws.com

Образец выходного сигнала:

123.123.123.123

Также работает в браузере: http://checkip.amazonaws.com

Мне это нравится, потому что:

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

Тот, который я использую, - это :

wget -O - -q icanhazip.com

Да, у вас может быть ip :-)

Введите это точно, нажмите Enter где указано:

telnet ipecho.net 80Enter
GET /plain HTTP/1.1Enter
HOST: ipecho.net Enter
BROWSER: web-kitEnter
Enter

Это вручную отправляет HTTP-запрос, который вернет ваш IP-адрес в нижней части HTTP/1.1 200 OK reply

Пример вывода:

$ telnet ipecho.net 80Trying 146.255.36.1...Connected to ipecho.net.Escape character is '^]'.GET /plain HTTP/1.1HOST: ipecho.netBROWSER: web-kitHTTP/1.1 200 OKDate: Tue, 02 Jul 2013 07:11:42 GMTServer: ApacheExpires: Mon, 26 Jul 1997 05:00:00 GMTCache-Control: no-cachePragma: no-cacheVary: Accept-EncodingTransfer-Encoding: chunkedContent-Type: text/htmlf111.222.333.4440

Для этого, оглушать был изобретен. Как клиент, вы можете отправить запрос на общедоступный сервер STUN и попросить его вернуть IP-адрес, который он видит. Что-то вроде низкого уровня whatismyip.com поскольку он не использует HTTP и никаких искусно созданных DNS-серверов, кроме невероятно быстрого протокола STUN.

С помощью stunclient

Если у вас есть stunclient установленный (apt-get install stuntman-client на debian / ubuntu) вы можете просто сделать:

$stunclient stun.services.mozilla.comBinding test: successLocal address: A.B.C.D:42541Mapped address: W.X.Y.Z:42541

где A.B.C.D является IP-адресом вашего компьютера в локальной сети и W.X.Y.Z это IP-адрес серверов, которые веб-сайты видят снаружи (и тот, который вы ищете). С помощью sed вы можете уменьшить вывод, приведенный выше, только до IP-адреса:

stunclient stun.services.mozilla.com |    sed -n -e "s/^Mapped address: \(.*\):.*$/\1/p"

Однако ваш вопрос заключался в том, как найти его с помощью командной строки, что может исключить использование клиента STUN. Так что я удивляюсь...

С помощью bash

Запрос на ОГЛУШЕНИЕ может быть обработан вручную и отправлен на внешний сервер ОГЛУШЕНИЯ с помощью netcat и подвергаться последующей обработке с использованием dd, hexdump и sed вот так:

$echo -en '\x00\x01\x00\x08\xc0\x0c\xee\x42\x7c\x20\x25\xa3\x3f\x0f\xa1\x7f\xfd\x7f\x00\x00\x00\x03\x00\x04\x00\x00\x00\x00' |    nc -u -w 2 stun.services.mozilla.com 3478 |    dd bs=1 count=4 skip=28 2>/dev/null |    hexdump -e '1/1 "%u."' |    sed 's/\.$/\n/'

Echo определяет двоичный запрос на отключение (0x0001 указывает на запрос привязки) длиной 8 (0x0008) с файлом cookie 0xc00cee и некоторыми вставленными данными из wireshark. Из ответа берутся только четыре байта, представляющих внешний IP-адрес, очищаются и печатаются.

Работает, но не рекомендуется для производственного использования :-)

P.S. Доступно множество серверов STUN, поскольку это основная технология для SIP и WebRTC. Использование одного из них от Mozilla должно быть безопасным с точки зрения конфиденциальности, но вы также можете использовать другой: Список серверов оглушения

“наличие динамического IP-адреса”, “SSH с использованием какой-либо другой системы через Интернет”, “команда, которая будет отображать текущий ОБЩЕДОСТУПНЫЙ IP-адрес”. Вы видите здесь проблему с курицей / яйцом? Как бы вы могли запускать команды на удаленном сервере, не зная его адреса? Возможно, вас больше заинтересуют такие услуги, как no-ip.com / DynDNS.org .

PS ip at DuckDuckGo (командной строки нет, но и старшего брата G тоже нет)

Возможно, это должен быть отдельный вопрос, но я хотел бы видеть предупреждение при изменении моего общедоступного IP-адреса. На данный момент я просто использую следующие ответы в crontab с помощью notify-send.

нельзя использовать SSH, не зная общедоступного IP-адреса, мой друг … DynDNS стоит дорого, а без IP-адреса сложно работать, но ситуация этого не позволяет … в любом случае, на вопрос уже дан ответ… спасибо за ваше предложение

Ни один из ответов не показывает правильного подхода. Поскольку у меня недостаточно репутации, чтобы опубликовать ответ, я опубликую комментарий о том, как его получить, не полагаясь на внешние сервисы. Просто запустите на терминале $ hostname --ip-адрес

отличные решения ниже. Для Centos используйте: ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).* инет *([^ ]+).*/\2/ p}" где eth1 - это сетевое устройство, которое вас интересует, вы можно опустить строку 'et1', чтобы отобразить все IP-адреса всех адаптеров. Вместо \ 2вы можете написать\ 1 \ 2`, чтобы также показать имена каждого адаптера.