четверг, 31 мая 2012 г.

Узнать свой внешний IP-адрес за NAT с командной строки

Сегодня передо мной встала такая задача. Разрешить доступ по внешнему IP к одному серверу с удаленного сервака. Для этого достаточно прописать IP-адрес удаленного сервера в нужном месте. Загвоздка в том, что это linux-сервак, на который я могу посылать однострочные консольные команды, но при этом не имею полного доступа к серверу по SSH и уж тем более к его GUI. Он имеет локальный IP-адрес, по которому и осуществляется доступ к нему. В интернет же он ходит через NAT.

Для тех, кто не любит много читать, пишу сразу свое решение проблемы:
wget -q -O /tmp/getmyip.php http://php.kichrum.org.ua/getmyip.php; cat /tmp/getmyip.php; echo ""; rm /tmp/getmyip.php


А уже под катом я расскажу, как эта строчка работает, как я к этому пришел, и предложу альтернативный вариант, более удобный.

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

Если компьютер не за NAT, то узнать свой IP можно стандартными способами: поможет команда ifconfig в linux или ipconfig (Win+R => cmd) в Windows. Эти команды не способны показать больше информации, чем им нужно. А в случае с локальной сетью, где на несколько компьютеров положен один внешний IP, через который все и ходят в интернет, стандартные команды выдадут как раз тот самый внутренний (локальный) IP адрес. По нему к тебе можно достучаться только находясь внутри твоей локальной сети, а сервера в интернете видят тебя как совершенно другого человека. Или как "несколько" других человек, если быть точным.

Если компьютер имеет GUI, то решение ещё проще. Для этого даже командная строка не понадобится. Я обычно использую для этих целей сайтик myip.ru или 2ip.ru. Последний, кстати, позволяет не только твой адрес узнать, но и много других вещей, и даже потестить скорость интернета. GUI позволяет открыть их в твоем любимом браузере (даже в шестом IE) и просто посмотреть.

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

Решение проблемы



Ясно было, что без внешнего сервера не обойтись, ведь важно получить именно тот адрес, под каким меня видят "левые" сервера. В общем, предыстория на этом заканчивается.

Дальше я зашел на сервер сервер блога и создал файлик getmyip.php, который содержит только одну строчку:

<?php echo $_SERVER['REMOTE_ADDR']; ?>


Она просто и без всяких примочек выводит тот IP, с которого ты обратишься к страничке. А нужно ли больше (например, описание сервиса)? Конечно же нет, ведь мы будем получать результат скрипта в консоль (или в другие программы), а поэтому лучше при надобности написать что угодно самостоятельно уже в программе, которая эту страничку будет использовать. Не rest api конечно, но уже что-то.

Теперь нужно в консоле посмотреть, что выводит нам эта страничка. Долго думать не пришлось: почему бы не скачать результат скрипта просто в файл? Тут же выведу его в консоль и удалю. Ниже листинг того же самого, только с комментариями.

wget -q -O /tmp/getmyip.php http://php.kichrum.org.ua/getmyip.php # - скачиваем страничку во временный файл. В файле только одна строчка - в ней и есть наш IP-адрес. Параметр -q скрывает от нас ненужную информацию о процессе скачивании страницы, а -O позволяет задать адрес временного хранения файла
cat /tmp/getmyip.php # - выводим содержимое скачанного файла в консоль
echo "" # - ну красивей, если дальше будем работать с новой строки, разумеется =)
rm /tmp/getmyip.php # - удаляем скачанный файл, дабы не мусорить


Удобство скрипта в том, что я даже не знаю, на каких nix-системах с дефолтными настройками он не будет работать. Что уж говорить об Ubuntu, которая, если не ошибаюсь, одна из самых популярных. Но его можно сделать ещё удобнее. Запусти команду, которую я днем опубликовал в свой Twitter:

echo "alias myip='wget -q -O /tmp/getmyip.php http://php.kichrum.org.ua/getmyip.php; cat /tmp/getmyip.php; echo \"\"; rm /tmp/getmyip.php'" >> ~/.bashrc


То есть просто добавляем строчку создания алиаса в скрипт конфигурации консоли. Теперь после перезапуска терминала (или при повторном входе на сервер) достаточно будет воспользоваться командой myip, чтоб быстро получить свой внешний IP-адрес прямо в консоль, находясь за NAT (и не только). Больше не придется запоминать длинные конструкции, доменные имена, смотреть рекламу на сайтах. Достаточно просто воспользоваться короткой командой myip. Давай вместе делать жизнь проще.

И наконец предостережение. Лучше создай аналогичную php-страничку самостоятельно - вдруг внезапно рекламное место на моем сервере выкупят. Реклама в терминале - это же новый уровень! ;)

29 комментариев:

MrGALL комментирует...

А не простіше ось так: curl -s http://php.kichrum.org.ua/getmyip.php
Про вантузи не знаю, але curl є в будь-якому лінуксі та макос.

Kichrum комментирует...

MrGALL, ты как всегда чертовски прав! Признаться, я пробовал и этот вариант (пусть и позже wget'a), но на моем debian-5.0-x86 curl почему-то не был предустановлен и я решил не рисковать с "универсальностью". Но спасибо. Большинству читателей, думаю, понравится твой вариант больше - полностью оправдано =)

MrGALL комментирует...

Kichrum,
В моїй системі (OS X 10.7) все навпаки — curl є в комплекті а от wget треба доставляти (для прикладу, з портів).

Kichrum комментирует...

MrGALL, сейчас проверил на работе, на убунте оказывается тоже нету curl =) Поставить не сложно, но всё же. Выходит, твое решение прокатит как стандартное для OS X, а со статьи - для линукса ;)

Vladimir Smirnoff комментирует...

echo $(wget -qO- http://php.kichrum.org.ua/getmyip.php)

Kichrum комментирует...

Vladimir Smirnoff, вот о том, что вместо имени файла можно написать знак "-", дабы отправить поток сразу в stdout не знал, спасибо. Ну я еще только учу nix, всего пару месяцев знакомства, простишь? ;)

zerg868 комментирует...

Круто, раньше такого не знал! Работает, проверил!

Василий комментирует...

Действительно работает, спасибо за совет!

asdi комментирует...

большое спасибо.

Larisa комментирует...

Примите и от меня благодарность за статью.

олег комментирует...

отличная тема,обязательно применю.

Artskill комментирует...

А можт кто и под винду батничек напишет?))

Kichrum комментирует...

Artskill, для извращенцев:
> telnet kichrum.org.ua 80
GET /getmyip.php HTTP/1.0
Host: php.kichrum.org.ua

[enter][enter]
Но зачем в винде для этого юзать консоль? Лучше тогда уже зайти через ИЕ)) или делать нормальную прогу.

Андрей комментирует...

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

Николай комментирует...

Интересная статья, надо опробовать все способы. :)

ebay комментирует...

я обычно пользуюсь онлайн сервисами, так удобнее

Ангар комментирует...

Да, онлайн сервисами удобнее. Но идея красивая. Автору респект

Дмитрий комментирует...

Думаю,для моего хорошего друга данная информация пригодится,интересуется такого вида примочками.Скину этот адрес.А я уж не силен в этом.Извините!

Felix комментирует...

Оригиальная идея, хотя конечно это вариант для настоящих гурманов. Большинство всё равно пользуется сервисами

Маша комментирует...

Я так же нашла недавно вот эту страницу http://modern-lady.ru/ там есть еще несколько вариантов!

designix комментирует...

Мануал очень интересный. На мой взгляд, самая ценная информация – это та, которая основана на собственном опыте.

proponer комментирует...

Что-то не заработало. :( Надо будет ещё раз попробовать.

serega комментирует...

Все работает)) офигенно!)
сенкс))

Сергей комментирует...

Всё работает, спасибо

Фотограф комментирует...

спасибо за информацию

иван комментирует...

круто спасибо!

DareDevil47 комментирует...

Ммм, весьма, весьма познавательно. Над будет попробовать.

lwgroup комментирует...

Странно, но мне было интересно у тебя в гостях. Спасибо!

Carlos комментирует...

нихуя не понял :(