четвер, 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 сказав...

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