вторник, 1 мая 2018 г.

Как я могу узнать свой внешний IP-адрес

Для идентификации компьютеров сети используются адреса. На уровне данных используются MAC-адреса, каждый MAC-адрес является уникальным и устанавливается производителем на этапе производства. Формат MAC-адреса представляет собой набор из шести октетов в шестнадцатиричном формате, примером MAC-адреса является 20:89:84:59:0B:6A

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

Для идентификации адресов на более высоких уровнях используются IP-адреса, долгое время стандартом является протокол IP версии 4, на смену которому приходит протокол версии 6.

У каждого компьютера может существовать несколько IP-адресов, чаще всего это адрес 127.0.0.1, который используется для работы сети в пределах одного устройства (localhost). Внутренний IP-адрес может иметь вид 192.168.0.2 или 10.0.0.2, как правило такие адреса необходимы для взаимодействия в пределах внутренней сети (intranet). И напоследок внешний IP-адрес, например 8.8.8.8, который доступен всем во внешней сети.

К сожалению количество адресов IPv4 очень ограничено и подходит к концу, поэтому для экономии внешних адресов используются такие технологии как NAT, которые позволяют использовать множество внутренних немаршрутизируемых для интернета адресов для одного внешнего адреса. То есть получается ситуация при которой, множество компьютеров внутренней сети могут выходить в сеть, но компьютеры из интернета не могут получить доступ к внутренней сети без специальных настроек на маршрутизаторе, таких как Port Forwarding например.

В Linux существует утилита ip, для управления сетевыми интерфейсами.
Посмотрим адрес loopback-интерфейса (lo):
$ ip a show lo | grep "inet "
inet 127.0.0.1/8 scope host lo


И адрес компьютера во внутренней сети (компьютер находится за маршрутизатором):
$ ip a show eth0 | grep "inet "
inet 192.168.0.103/24 brd 192.168.0.255 scope global dynamic eth0


Но как узнать свой внешний IP-адрес, тот самый адрес, с помощью которого мы можем идентифицироваться в сети?
В некоторых случаях это необходимо для того чтобы получить доступ к серверу через интернет, например через SSH, или для того чтобы добавить корректные записи DNS.

Существует множество способов узнать свой внешний IP-адрес, в случае сложной топологии сети, например когда вы используете NAT. С помощью таких сервисов как myexternalip.com или showip.net можно узнать свой внешний адрес через браузер, однако если нужно узнать адрес в автоматическом режиме, то каждый раз ходить по ссылкам в браузере неудобно.

Для этого можно воспользоваться специальными сервисами, которые передают данные по HTTP(S), FTP, Telnet либо с помощью DNS.
Узнаем внешний адрес с помощью DNS:
$ dig +short myip.opendns.com @resolver1.opendns.com
83.143.203.86

$ nslookup . ifcfg.me | grep "Address: "
Address: 83.143.203.86


FTP / Telnet:
$ echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'
$ nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4
$ telnet 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4
$ netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1


HTTP(S):
$ curl http://canhazip.com
$ curl http://whatismyip.akamai.com/
$ curl https://4.ifcfg.me/
$ curl http://checkip.amazonaws.com
$ curl -s http://whatismijnip.nl | awk '{print $5}'
$ curl -s icanhazip.com
$ curl ident.me
$ curl ipecho.net/plain
$ curl wgetip.com
$ curl ip.tyk.nu
$ curl bot.whatismyipaddress.com
$ wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'


Использование подобных конструкций может пригодиться в скриптах или в повседневной работе, в случае если данный адрес является динамическим.

Можно создать алиас, с помощью которого можно узнать свой внешний адрес, не прописывая длинных команд:
$ alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'
$ echo "alias wanip='dig +short myip.opendns.com @resolver1.opendns.com'" | tee -a ~/.bashrc
$ wanip
83.143.203.86

Комментариев нет: