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

в 20:12, , рубрики: DynDNS, php, Веб-разработка, велосипедостроение, динамический ip, удалённый доступ, метки: , , , ,

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

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

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

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

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

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

Остаётся настроить сервер на запрос по 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 адрес…

Теперь последняя часть — настройка на ноутбуке подключения к серверу одной командой. Сделаем скрипт, допустим, homeslackconnect.sh:

content=$(wget http://my.site/testippage.php -q -O -)
ssh $content -p 666 -l niph

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

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

Автор: NiPh

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js