Свой DynDNS на коленке

Итак, допустим вы веб-разработчик. Допустим у вас есть домашний компьютер под управлением Линукса, работающий 24x7 и динамический внешний ip. Допустим вам нужно подключаться к нему по ssh или демонстрировать заказчику web проекты, которые по каким то причинам долго или и вовсе нельзя выкладывать на хостинг (именно из за необходимости показывать что-то третьим лицам VPN не выход). Допустим вас не устраивают DynDNS сервисы. Приступим.

Согласен, условия специфические — но чего в жизни не случается.

Схема приблизительно такая — домашний ПК стучится на ваш сайт (вы же веб-разработчик как-никак, должен же у вас быть сайт), тот фиксирует ip адрес, и выдаёт его вам.

Сначала настроим выход(на самом деле вход) домашнего ПК (далее — сервер, для простоты) во внешнюю сеть. Если ваш ПК смотрит в интернет напрямую — смело пропускаем этот пункт. Примерно так выглядит настройка через web интерфейс моего роутера ASUS WL-520GU с альтернативной прошивкой tomatoUSB — я открываю на роутере порт 666 для переадресации ssh и порт 667 для переадресации web запросов на сервер (внутренний адрес — 192.168.1.100, ip адрес зафиксирован за сервером правилами DHCP того же роутера).



Некоторые роутеры нужно перезагрузить, но с большой степенью вероятности они сами сообщат об этом.

Остаётся настроить сервер на запрос по cron'у страницы на вашем хостинге (http://my.site/testippage.php, например).

В консоли —
crontab -e
*/5 * * * * wget http://my.site/testippage.php?key=habrahabr -O /dev/null

(раз в 5 минут скачиваем страницу my.site/testippage.php в никуда)

Передаваемый get запросом ключ служит небольшой защитой от случайной или намеренной диверсии.

Теперь настраиваем серверную часть. Раньше я использовал для хранения текущего ip адреса базу MySQL — но это совершенно излишне, и в процессе редактирования статьи получился такой код:
<?php
if($_GET['key']=='habrahabr'){
	file_put_contents ( 'ip.txt' ,  getenv("REMOTE_ADDR"));
} else {
	$ip = file_get_contents('ip.txt');
	if (isset($_GET['page'])){
		header('Location: http://'.$ip.':667/'.$_GET['page']);
	} else {
		echo $ip;
	}
}
?>


Как понятно из кода, если скрипту передаётся параметр get — он записывает ip постучавшегося, если параметр page — перенаправляет на ваш домашний компьютер, а если ему ничего не пришло — просто выводит ip адрес.

Чтобы показать заказчику проект лежащий в папке project сервера — надо дать ему ссылку my.site/testippage.php?page=project.

Теперь последняя часть — настройка на ноутбуке подключения к серверу одной командой. Сделаем скрипт, допустим, homeslackconnect.sh:
content=$(wget http://my.site/testippage.php -q -O -)
ssh $content -p 666 -l niph

он считывает ip адрес в переменную content и пытается подключиться по полученному адресу через порт 666 как пользователь niph. Что и требовалось изначально.

Не спорю с тем что DynDNS — гораздо более простое решение, однако не все роутеры умеют пользоваться бесплатными DynDNS серверами, к тому же они имеют тенденцию становиться не столь бесплатными, да и своё решение всегда теплее. Вопросы задавайте в комментариях, надеюсь кому-то это решение поможет упростить себе жизнь.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 30

    +1
    А правда, расскажите про ситуации, когда нельзя выкладывать на хостинг?
    Ну т.е. наверное иногда нужно скрыть проект от посторонних глаз. Но есть же Basic auth и костыли типа hide-from-my-mummy123.my.site/
      0
      Наверное я не совсем точно выразился. Больший юзкейс — это когда перенос проекта с домашней машины разработчика на хостинг не самая быстрая процедура, не автоматизированная, или например то что есть надо показать уже вчера, и тратить лишнее время совершенно не хочется. Или если площадка у заказчика своя, установкой он занимается сам — так зачем усложнять и выкладывать всё на свою демо-площадку в сети? Я не иронизирую, если что, такое решение мне правда кажется более простым, чем хранить часть проекта у себя, демо версию где-то ещё, а потом сливать их воедино. Наверно можно сказать что проблемы в моём подходе к разработке, не спорю.
      Наверное, единственный раз когда проект было действительно нельзя выкладывать — это когда заказчиком был очень очень осторожный seo оптимизатор, который боялся что сайт будет проиндексирован не смотря на все запрещающие это теги и закрытие директории через htpassword. В принципе он наверно был прав, от ошибки никто не застрахован. Договориться смогли только на таком решении, я открывал порт — он смотрел — я закрывал. После каждой правки кидать дамп для развёртывания не хотелось совершенно.
        +2
        > Наверное, единственный раз когда проект было действительно нельзя выкладывать — это когда заказчиком был очень очень осторожный seo оптимизатор, который боялся что сайт будет проиндексирован не смотря на все запрещающие это теги и закрытие директории через htpassword.

        Когда я работал в саппорте хостинга столкнулись с интересным случаем. У клиента с заядлой периодичностью пропадал весь контент из базы. Ну выкладывали ему бекапы, да вот каждый раз всё происходило заново. Детальный анализ показал, что у него была админка без пароля, но с каким-то хитрым адресом. И в таблице со списком статей была ссылка «Удалить» напротив каждого пункта, вот по ним и гулял Гугл каждый раз при индексации.

        Так к чему я это всё. Есть подозрение, что через все эти гугло-тулбары и гуглохромы поисковик узнает про новые страницы весьма легко, даже если он на IP вашей домашней машины.
          0
          это в принципе даже не подозрение… но индексирует он не настолько быстро, как я понимаю, адрес меняется раз в сутки, да ещё и порт нестандартный — ни разу не видел в выдаче гугла таких сайтов, что, конечно, не означает что их там нет.
            0
            Гугло-тулбары и гуглохромы не выполняют индексацию при ее явном запрете в robots.txt
        0
        Для dyndns есть отдельная прога-клиент которая сама стучится и обновляет IP, также можно и при помощи wget одним запросом обновить адрес на нём, зачем все эти костыли?
          0
          Если есть такое решение, бесплатное, под *nix — то не буду спорить. Когда пару лет назад я делал для себя этот костыль, настолько простого решения я не нашёл. Может плохо искал, конечно. К тому же, мне кажется что этот костыль не сложнее чем отдельная программа, разве что возможностей меньше. Но если они не нужны — зачем усложнять?
            0
            Если я не ошибаюсь у них API уже лет 10 как есть.
            Задача сводиться к отправке обычного GET запроса, единственное — надо свой внешний адрес определить, но тот же самый dyndns и этот сервис тоже предоставляет. Все подробности тут.

            P.S. У wget есть замечательная опция --spider, которая позволяет ничего не загружать
            0
            Прошу прощения, не заметил про wget. Но вопрос про бесплатность остаётся.
              0
              1 хост точно бесплатен, я уже много лет пользуюсь, ничего не плачу и никаких проблем.
                +1
                habrahabr.ru/post/130926/ что я могу сказать… не зря велосипедостроение в теги добавил. У меня закончились аргументы про преимущество этого костыля. Остаётся признать, что он носит характер «Hello World». Буду надеяться, что кто-то из тех людей, которые добавляют его в избранное, найдут ему уникальное, незаменимое место в жизни )
                  0
                  Недавно пытался найти бесплатный dynamic dns провайдер. DynDNS теперь платный, бесплатных планов не нашел dyn.com/dns/
                  если кто знает, как получить бесплатный dynamic dns — дайте знать :)
                    0
                    сейчас полез проверять по наводке — у меня в личном кабинете есть два бесплатных домена, но регистрировался я там очень давно, и не пользовался столько же, возможно это остатки былой роскоши. Если просто зарегистрироваться, а не выбирать план — не появляются ли бесплатные опции в личном кабинете?
                      0
                      Да действительно они что-то там изменили, но всё же если залогинится там написано про бесплатное пользование 1 хоста (раньше 2 было).
                        0
                        У меня не показывает. При любом добавлении чего-нибудь предлагает купить Pro.
                          0
                          Раньше бесплатно было 10 хостов с доменами 3 уровня или около того, и список доменов второго уровня порядка 50 штук в различных зонах. За последние годы, коммерциализация dyndns.org превратило его в dyn.com заточенный под подписку. Не спорю, что для большинства задач, где нужен не только хост для динамического ip, но и свой выделенный dns-сервер, например, сервис хорошо подходит. Но для простого мониторинга ip, а тем более если нескольких, но в пределах 5, это уже монстр.
                          +1
                          Нужен именно свой домен? Если нет, то когда-то пользовался www.no-ip.com/
                          Вроде бы остался до сих пор бесплатен с их доменом.
                            0
                            No-ip.com и dyn.com, по своей сути, очень близкие сервисы, у первого бесплатный аккаунт пока не столь урезан, но единственное достоинство бесплатных тарифов, поддержка стоковыми прошивками сетевых устройств различных производителей: Synology, D-Link, TP-link и прочих.
                            0
                            freedns.afraid.org/ — туева хуча доменов (здесь полный список), есть API и готовые клиенты
                              0
                              Тормозной он, хотя я им все равно пользуюсь.
                      0
                      У меня была задача узнавать свой ipv6 адрес, каторый мне выдаёт teredo. В убунте за 6to4 tunnel отвечает демон miredo. Всякие ddns я устал настраивать и сделал проще:
                      sendemail -f user@yandex.ru -t user@yandex.ru -u "Твой ip" -m "$(ifconfig)" -s smtp.yandex.ru:587 -xu user@yandex.ru -xp "$(cat /root/passmail)" -o tls=yes
                      Теперь этот скрипт либо в cron либо в /etc/network/if-up.d/
                      И всё каждый раз при поднятии сети у меня на почте оказывается мой текущий ipv6 адрес.
                        0
                        Год назад страдал тем же самым. Потом надоело извращаться и взял у прова постоянный IP. Нервы дороже. Возможностей больше.
                          0
                          У меня роутер при восстановлении подключения к интернету wget'ом стучится на мой хостинг, где скрипт правит DNS записи домена :)
                            0
                            путь настоящего джедая… а как быстро обновляется запись?
                              0
                              В течении пары минут. Однако если обновление происходит слишком часто (часто перезагружаю роутер) — домен перестает откликаться.
                                0
                                Странно, у провайдеров обычно время аренды ip для пользователя примерно сутки, у некоторых дольше, то есть можно не обновлять dns запись, если адрес не менялся. Или здесь все же время полной загрузки роутера?
                                  0
                                  У меня ip-адрес при каждом подключении новый. Провайдер Дом.ру.
                              0
                              Я когда-то тоже так извращался.
                              Потом надоело — просто CNAME своего домена на xxx.no-ip.biz прописал.
                              0
                              Как вариант — написать скрипт на сайте, который при получении запроса с вашего домашнего компа будет пересоздавать .htaccess с проксированием всего на его адрес.
                                0
                                как дополнительный вариант для того чтобы не показывать посетителям ip адрес? Можно, но проксирование уже не любой хостинг потянет. а так да, можно и что-то типа nph-proxy сконфигурировать, чтобы на домашнюю машину смотрел.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое