Согласен, условия специфические — но чего в жизни не случается.
Схема приблизительно такая — домашний ПК стучится на ваш сайт (вы же веб-разработчик как-никак, должен же у вас быть сайт), тот фиксирует 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 адрес…
Теперь последняя часть — настройка на ноутбуке подключения к серверу одной командой. Сделаем скрипт, допустим, homeslackconnect.sh:
content=$(wget http://my.site/testippage.php -q -O -) ssh $content -p 666 -l niph
он считывает ip адрес в переменную content и пытается подключиться по полученному адресу через порт 666 как пользователь niph. Что и требовалось изначально.
Не спорю с тем что DynDNS — гораздо более простое решение, однако не все роутеры умеют пользоваться бесплатными DynDNS серверами, к тому же они имеют тенденцию становиться не столь бесплатными, да и своё решение всегда теплее. Вопросы задавайте в комментариях, надеюсь кому-то это решение поможет упростить себе жизнь.
ссылка на оригинал статьи http://habrahabr.ru/post/160275/
Добавить комментарий