Сегодня мне понадобилось быстро получить возможность доступа к своему локальному серверу извне. IP адрес дома у меня динамический, а регистрировать сервис DynDNS просто не было времени. В этой статье я опишу свое решение этой задачи.

Для меня есть одна тонкость в этом вопросе — ПК дома находится за роутером, соответственно, если у тебя тоже — то не забудь пробросить необходимый порт через админку роутера. Обычно админка находится по адресу 192.168.0.1. Иначе при заходе по своему IP адресу извне ты увидишь либо ошибку, либо хуже — админку роутера. Сама опция может называться по-разному: Port Forwarding, проброс портов, виртуальные серверы. Также может потребоваться указать локальный IP своего ПК, как DMZ (демилитаризованная зона).

Для того, чтобы знать текущий IP моего домашнего компьютера я решил отправлять его к себе на сайт, а там простым PHP скриптом записывать полученный адрес в файл, чтобы при необходимости к нему обратиться. И чтобы особенно не прилагать усилий при копировании IP вручную — сделал редирект на него при определенном условии:

PHP скрипт:

<?php
##Указываем файл для хранения IP 
##У него должны быть права на запись
$file = './dir/ip.txt';
##Если передан GET аргумент go
##То переходим по IP из файла
if(isset($_GET["go"])) {
    header('Location: http://'.trim(file_get_contents($file)));
} else {
##Иначе, записываем новый IP
##Полученный от домашнего ПК
$ip = getenv('REMOTE_ADDR'); //или $_SERVER["REMOTE_ADDR"]
file_put_contents($file, $ip);
}
?>

Теперь есть два варианта очевидный и не совсем. Очевидный вариант — настроить дергалку по крону (планирощику заданий). Открываем эмулятор терминала и вводим:

crontab -e

Выбираем редактор (если предложит) и дописываем в конец открывшегося файла правило:

 */15 * * * * curl -G http://site.ru/ip.php

Если не установлен Curl (что сейчас редкость) — тогда можно использовать wget с выводом в dev/null:

 */15 * * * * wget http://site.ru/ip.php -O /dev/null

Цифра 15 — количество минут, через которые наша команда будет дергать скрипт на сайте для обновления IP. Впринципе для временного решения доступа к домашнему пк из сети пятнадцать минут вполне должно нас устроить. Если IP меняется чаще, чем раз в 15 минут — просто замени цифру, например, на 3 или 5 минут.

Не очевидный вариант, который, как ни странно, первым мне пришел в голову, и изначально именно его я для себя и реализовал, что называется «по-быстренькому» — это написать скрипт на bash с бесконечным циклом и sleep’ом:

#!/bin/bash

while (true) do
curl -G "http://site.ru/ip.php"
sleep 15m
done

Это вариант у меня отлично проработал целый день и не подвел меня.

Правда изначально (ну торопился) 🙂 я прибег к сильному извращению, но, пожалуй, покажу его тебе, хотя бы ради полезной фичи — выдергивания через терминал своего IP с сайта yoip.ru (но не стоит использовать этот скрипт, для реальной задачи используй Cron или скрипт выше, не стоит терзать понапрасну чужой сайт):

#!/bin/bash

while (true) do
mip=$(wget http://yoip.ru --quiet -O - | grep -E -o '[0-9]{1,3}(\.[0-9]{1,3}){3}') 
##timestamp я передавал, чтобы знать, когда было последнее обновление и не умер ли мой скрипт ))
stamp=$(date +%s) 
curl -G "http://site.ru/ip.php?ip=$mip&time=$stamp"
echo "$mip :: $stamp"
sleep 15m
done
No votes yet.
Please wait...