Как стать автором
Обновить

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

Время на прочтение 2 мин
Количество просмотров 64K
Итак, допустим вы веб-разработчик. Допустим у вас есть домашний компьютер под управлением Линукса, работающий 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 серверами, к тому же они имеют тенденцию становиться не столь бесплатными, да и своё решение всегда теплее. Вопросы задавайте в комментариях, надеюсь кому-то это решение поможет упростить себе жизнь.
Теги:
Хабы:
+4
Комментарии 30
Комментарии Комментарии 30

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн