Итак, допустим вы веб-разработчик. Допустим у вас есть домашний компьютер под управлением Линукса, работающий 24x7 и динамический внешний ip. Допустим вам нужно подключаться к нему по ssh или демонстрировать заказчику web проекты, которые по каким то причинам долго или и вовсе нельзя выкладывать на
Согласен, условия специфические — но чего в жизни не случается.
Схема приблизительно такая — домашний ПК стучится на ваш сайт (вы же веб-разработчик как-никак, должен же у вас быть сайт), тот фиксирует ip адрес, и выдаёт его вам.
Сначала настроим выход(на самом деле вход) домашнего ПК (далее — сервер, для простоты) во внешнюю сеть. Если ваш ПК смотрит в интернет напрямую — смело пропускаем этот пункт. Примерно так выглядит настройка через web интерфейс моего роутера ASUS WL-520GU с альтернативной прошивкой tomatoUSB — я открываю на роутере порт 666 для переадресации ssh и порт 667 для переадресации web запросов на сервер (внутренний адрес — 192.168.1.100, ip адрес зафиксирован за сервером правилами DHCP того же роутера).
Некоторые роутеры нужно перезагрузить, но с большой степенью вероятности они сами сообщат об этом.
Остаётся настроить сервер на запрос по cron'у страницы на вашем
В консоли —
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