Хочу рассказать вам про то как имея в интернете свой VPS-сервер можно поднять туннель в домашнюю сеть. И не платить при этом за статический IP провайдеру, и даже находясь за NAT, все равно сделать доступными в интернете свои домашние сервисы.
В связи с тем что роутер у меня находится за провайдерским NAT, то после запуска туннеля, и при отсутствии какой либо активности после, соединение у меня просто переставало работать до тех пор, пока со стороны клиента к серверу не придет хотя бы один какой-нибудь пакет.
Поэтому я решил отправлять пинг на адрес моего VPN-сервера каждые 30 секунд. Этого оказалось достаточно, но в связи с отсутствием понимания ключа -i у команды ping моим OpenWRT-роутером пришлось написать маленький скриптик:
vi /bin/ping-vps.sh
#!/bin/sh
while true; do
ping -c 1 10.9.8.1
sleep 30
done
Затем я сделал его исполняемым
chmod +x /bin/ping-vps.sh
И добавил в /etc/rc.local строчку для автозапуска:
/bin/ping-vps.sh &
Добавлять нужно перед exit 0не забыв&в конце строки, это заставит не ожидать окончание выполнения нашего скрипта при запуске роутера, тем более что он у нас в цикле
Маршрутизация
Теперь настроим маршрутизацию.
Что бы наш VPS знал что путь в нашу домашнюю сеть лежит через роутер, он же vpn-клиент, нужно добавить статисческий маршрут:
В принципе все готово.
Наши сети соединены, все машины прекрасно друг-друга видят и обмениваются пакетами.
Теперь, при желании, можно настроить проброс портов с внешнего на внутренний адрес.
Вот так, к примеру, выглядит проброс ssh порта на одну из машин у меня в домашней сети:
# Forward SSH port to server
iptables -t nat -A PREROUTING -d XX.XX.XX.XXX -p tcp --dport 666 -j DNAT --to-dest 192.168.1.200:22
iptables -t nat -A POSTROUTING -d 192.168.1.200 -p tcp --dport 22 -j SNAT --to-source 10.9.8.1
Где XX.XX.XX.XXX — внешний IP сервера, 192.168.1.200 — IP моей машины внутри домашней сети, 666 — порт при обращении к которому я попадаю на эту машину
PS: Если у вас что-то не получается убедитесь что на вашем VPS есть и подключены все необходимые для этого модули ядра
Источники
При написании статьи, я использовал информацию из следующих источников: