Если я проверю с гугл, я могу видеть свой публичный 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
Вежливость:
- https://hawknotes .blogspot.in/2010/06/finding-your-external-ip-address.html
- https://ipecho.net/plain
Вы также могли бы использовать lynx
(браузер) или curl
на месте wget
с небольшими изменениями приведенной выше команды, чтобы найти ваш внешний ip-адрес.
С помощью curl
чтобы найти ip-адрес:
$ curl https://ipecho.net/plain
Для лучшего форматирования выходных данных используйте:
$ curl https://ipecho.net/plain ; echo
Более быстрый (возможно, самый быстрый) метод, использующий dig
с OpenDNS
как решающий:
Все остальные ответы здесь передаются по протоколу HTTP на удаленный сервер. Некоторые из них требуют синтаксического анализа выходных данных или полагаются на заголовок User-Agent, чтобы сервер отвечал простым текстом. Они также довольно часто меняются (опускаются, меняют свое название, размещают рекламу, могут изменить формат вывода и т.д.).
- Протокол ответа DNS стандартизирован (формат останется совместимым).
- Исторически сложилось так, что службы DNS (OpenDNS, Google Public DNS, ..), как правило, существуют гораздо дольше и являются более стабильными, масштабируемыми и в целом обслуживаемыми, чем любые новые hip whatismyip.com HTTP-сервис сегодня очень популярен.
- (для тех фанатов, которые заботятся о микрооптимизации), этот метод должен быть изначально быстрее (пусть всего на несколько микросекунд).
Использование 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/
ОБНОВЛЕНИЕ
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 80
EnterGET /plain HTTP/1.1
EnterHOST: ipecho.net
EnterBROWSER: web-kit
Enter
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`, чтобы также показать имена каждого адаптера.