- Вопрос или проблема
- Поиск внешнего IP с использованием внешних сервисов
- Быстрый (возможно, самый быстрый) метод с использованием dig с OpenDNS в качестве разрешателя:
- Поиск внешнего IP без обращения к внешним сервисам
- Использование stunclient
- Используя bash
- Эти команды выведут локальные IP:
- Это должно вывести внешний IP
- Ответ или решение
- Метод 1: Использование curl
- Метод 2: Использование wget
- Метод 3: Использование dig
- Метод 4: Использование ip
- Заключение
Вопрос или проблема
Если я проверю с помощью google, я смогу увидеть свой публичный 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 и др.) обычно удается пережить гораздо дольше, они более стабильны, масштабируемы и, как правило, лучше поддерживаются, чем какой-либо новый ужасный сервис http whatismyip.com, который популярен сегодня.
- (для тех гиков, кто интересуется микрооптимизацией), этот метод должен быть по сути быстрее (хотя бы на несколько микросекунд).
Используя dig с OpenDNS в качестве разрешателя:
$ dig +short myip.opendns.com @resolver1.opendns.com
111.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.1
ppp0: 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
Я запускаю собственный сервис, который предназначен для простоты, ident.me.
Его API и реализация задокументированы на https://api.ident.me/
Примеры из терминала (добавьте https://
для безопасности за счет скорости):
curl ident.me
curl v4.ident.me
curl v6.ident.me
Вы можете использовать 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 🙂
Для этого был изобретён STUN. Как клиент, вы можете отправить запрос на общедоступный STUN-сервер и получить от него IP-адрес, который он видит. Это что-то вроде низкоуровневого whatismyip.com, так как он не использует HTTP и не полагается на тщательно созданные DNS-серверы, а использует молниеносно быстрый протокол STUN.
Использование stunclient
Если у вас установлен stunclient
(apt-get install stuntman-client
на debian/ubuntu), вы можете просто сделать:
$stunclient stun.services.mozilla.com
Binding test: успех
Local address: A.B.C.D:42541
Mapped 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
STUN-запрос может быть создан вручную, отправлен на внешний STUN-сервер с помощью 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/'
Эхо определяет двоичный STUN-запрос (0x0001 указывает на Binding Request), имеющий длину 8 (0x0008) с куки 0xc00cee и некоторым вставленным элементом из wireshark. Из ответа берутся только 4 байта, представляющие внешний IP, очищаются и выводятся.
Работает, но не рекомендуется для производственного использования 🙂
P.S. Многие STUN-серверы доступны, так как это ключевая технология для SIP и WebRTC. Использование сервера от Mozilla должно быть безопасным с точки зрения конфиденциальности, но вы также можете использовать другой: Список STUN-серверов
Введите это точно, нажмите Enter там, где указано:
telnet ipecho.net 80
Enter
GET /plain HTTP/1.1
Enter
HOST: ipecho.net
Enter
BROWSER: web-kit
Enter
Enter
Это вручную отправляет HTTP-запрос, который вернёт ваш IP внизу HTTP/1.1 200 OK
ответа
Пример вывода:
$ telnet ipecho.net 80
Trying 146.255.36.1...
Connected to ipecho.net.
Escape character is '^]'.
GET /plain HTTP/1.1
HOST: ipecho.net
BROWSER: web-kit
HTTP/1.1 200 OK
Date: Tue, 02 Jul 2013 07:11:42 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache
Pragma: no-cache
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html
f
111.222.333.444
0
Еще один быстрый способ (возможно, самый быстрый, относительно)
curl ipecho.net/plain
Вы можете прочитать веб-страницу, используя только bash, без curl
или wget
:
$ exec 3<> /dev/tcp/icanhazip.com/80 && # открыть соединение
echo 'GET /' >&3 && # отправить http 0.9 запрос
read -u 3 && echo $REPLY && # прочитать ответ
exec 3>&- # закрыть fd
У меня есть простой сервис для этого с помощью telnet. Что-то вроде этого:
telnet myip.gelma.net
Ваш IPv4: xxx.xxx.xxx.xxx
Ваш IPv6: ::ffff:xxxx:xxxx
Не стесняйтесь использовать его.
Эти команды выведут локальные IP:
ifconfig
или для более короткого вывода:
ifconfig | grep inet
также
ip addr show
и, вероятно:
hostname -I
Это должно вывести внешний IP
wget http://smart-ip.net/myip -O - -q ; echo
N.B. Если вас не беспокоит установка curl
, то также:
curl http://smart-ip.net/myip
Для тех из нас, у кого есть доступ к настройкам роутера, использование скрипта для запроса роутера о его WAN IP-адресе является наиболее эффективным способом определения внешнего IP-адреса. Например, следующий скрипт на python выводит внешний IP для моего роутера Medialink MWN-WAPR300N:
import urllib, urllib2, cookielib
import re
from subprocess import check_output as co
cookie_jar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
urllib2.install_opener(opener)
def get(url, values=None):
data = None
if values: data = urllib.urlencode(values)
req = urllib2.Request(url, data)
rsp = urllib2.urlopen(req)
return rsp.read()
router = co(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
url = "http://" + router
get(url+"/index.asp")
get(url+"/LoginCheck", dict(checkEn='0', Username="admin", Password='admin'))
page = get(url+"/system_status.asp")
for line in page.split("\n"):
if line.startswith("wanIP = "):
print line.split('"')[1]
exit(1)
Обратите внимание, что это не очень безопасно (как это бывает с паролями в открытом виде и входом в большинство роутеров), и, конечно, не переносимо (нужно изменить для каждого роутера). Однако это очень быстро и вполне разумное решение в физически безопасной домашней сети.
Для настройки скрипта для другого роутера я рекомендую использовать дополнение tamperdata в firefox, чтобы определить, какие HTTP-запросы сделать.
Многие домашние роутеры могут быть опрошены по UPnP:
curl "http://fritz.box:49000/igdupnp/control/WANIPConn1" -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" -d "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>" -s
Затем используйте grep, чтобы извлечь IP-адрес из ответа.
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'
Если вы используете DD-WRT, то это работает для меня:
curl -s 192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'
или
curl -s -u your_ddwrt_username:your_ddwrt_password http://192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'
-
Где 192.168.1.1 — это IP-адрес шлюза/роутера LAN для роутера DD-WRT.
-
Компонент -s означает тихий режим (т.е., не показывать информацию о прогрессе curl).
- О, я должен упомянуть, что я использую вышеуказанное с “DD-WRT v24-sp2 (01/04/15) std”.
Если вы установили lynx в Ubuntu, введите
lynx bot.whatismyipaddress.com
Используйте ip
!
ip addr show
Затем ищите соответствующий адаптер (не lo
, и обычно eth0
), и находите IP-адрес рядом с inet
.
Может быть, я немного запоздал, но inxi может сделать это довольно легко.
Установите inxi
sudo apt install inxi
Затем выполните следующую команду
inxi -i
Пример с заблокированными моими данными с использованием опции z
для копирования и вставки на такие сайты:
~$ inxi -iz
Сеть: Карта: NVIDIA MCP77 Ethernet driver: forcedeth
IF: eth0 состояние: включено скорость: 1000 Mbps дуплекс: полный mac: <filter>
WAN IP: <filter>
IF: eth0 ip-v4: <filter> ip-v6-ссылка: Н/Д
Где указано <filter>
, там появится ваш WAN IP, IPv4, MAC-адрес и т.д.
Чтобы сделать это быстро, используйте stunclient
с таймаутом
“быстро” означает примерно в 2 раза быстрее, чем http-запрос
основано на ответе Виктора Клоса
#!/bin/sh
# whatismyip.sh
# получить мой публичный IP-адрес с сервера STUN
# основано на https://askubuntu.com/a/683488/877276
if false; then
# найти ближайшие STUN-серверы
serverlist_url=https://github.com/pradt2/always-online-stun/raw/master/valid_ipv4s.txt
sudo netselect -s 50 -t 10 $(curl -s -L $serverlist_url) |
awk '{ print $2 }' |
xargs sudo netselect -s 10 -t 100 |
awk '{ print $2 }'
fi
# TODO обновить список серверов для вашего региона
stun_server_list="$(cat <<EOF
5.9.87.18:3478
74.125.250.129:19302
212.18.0.14:3478
109.68.96.189:3478
EOF
)"
for stun_server in $stun_server_list; do
IFS=: read host port <<<"$stun_server"
res="$(
# быстрый ответ: 0.05 секунды
# медленный ответ: 5 секунд
# TODO может увеличить таймаут
#time \
timeout 0.2 \
stunclient $host $port
)"
if [ $? = 0 ]; then
# получить "Mapped address"
addr=$(echo "$res" | tail -n1)
addr=${addr:16}
addr=${addr%:*}
echo $addr
exit
#else echo "server failed: $stun_server" >&2 # debug
fi
done
exit 1 # все серверы не ответили
Просто выполните трассировку для любого веб-сайта или сервиса..
sudo traceroute -I google.com
2-я строка всегда кажется моим публичным IP-адресом, когда проходит через мой роутер.
user@user-PC ~ $ sudo traceroute -I google.com
traceroute to google.com (173.194.46.104), 30 hops max, 60 byte packets
1 25.0.8.1 (25.0.8.1) 230.739 ms 231.416 ms 237.819 ms
2 199.21.149.1 (199.21.149.1) 249.136 ms 250.754 ms 253.994 ms**
Так что, сделайте bash-команду.
sudo traceroute -I google.com | awk -F '[ ]' '{ if ( $2 ="2" ) { print $5 } }'
И вывод…
(199.21.149.1)
Я не думаю, что полагаться на PHP-скрипты и прочее — это хорошая практика.
Команда без зависимостей, кроме 8.8.8.8, как GOogle DNS:
echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')
Ответ или решение
Чтобы определить ваш публичный IP-адрес с помощью командной строки в Ubuntu, можно использовать несколько методов. Если ваш компьютер подключен к Интернету напрямую, вы можете использовать команду ifconfig
для получения вашего IP-адреса. Однако, если вы находитесь за маршрутизатором (что наиболее распространено), ваш компьютер не сможет предоставить свой публичный IP-адрес, так как он скрыт за NAT (преобразованием сетевых адресов).
Для получения вашего публичного IP-адреса вы можете воспользоваться внешними веб-сервисами. Ниже приведены основные способы, как это сделать с помощью команд curl
и wget
.
Метод 1: Использование curl
- Если у вас установлен
curl
, просто введите одну из следующих команд:
curl ifconfig.me
или
curl icanhazip.com
или
curl ipecho.net/plain
Эти команды вернут ваш публичный IP-адрес без лишней информации.
Метод 2: Использование wget
Если вы предпочитаете wget
, можете использовать следующую команду:
wget -qO- icanhazip.com
или
wget -qO- http://ipecho.net/plain ; echo
Метод 3: Использование dig
Ещё одним способом является использование утилиты dig
, которая делает DNS-запросы. Выполните следующую команду:
dig +short myip.opendns.com @resolver1.opendns.com
Метод 4: Использование ip
Для получения локального IP-адреса (если вы не находитесь за маршрутизатором) используйте:
ip addr show
или
hostname -I
Заключение
Выбор метода получения публичного IP-адреса зависит от ваших предпочтений, но использование curl
или wget
является наиболее простым и удобным способом. Если у вас нет установленных утилит curl
или wget
, вы можете установить одну из них с помощью следующей команды:
sudo apt install curl
или
sudo apt install wget
Теперь вы можете легко определить ваш публичный IP-адрес из терминала Ubuntu.