...

вторник, 18 марта 2014 г.

Поднимаем VPN-туннель из мира домой в обход NAT


Хочу рассказать вам про то как имея в интернете свой VPS-сервер можно поднять туннель в домашнюю сеть. И не платить при этом за статический IP провайдеру, и даже находясь за NAT, все равно сделать доступными в интернете свои домашние сервисы.



Исходные данные





  • VPS сервер на debian со статическим реальным IP

  • роутер с прошивкой OpenWRT, который находится за провайдерским NAT

  • домашняя сеть с компьютерами и виртуальными машинами в 192.168.1.0/24


Настройка туннеля




Первым делом установим и настроим OpenVPN сервер на нашем VPS:

apt-get update
apt-get install openvpn




Отредактируем файл конфигурации:

vi /etc/openvpn/tun0.conf



dev tun0
ifconfig 10.9.8.1 10.9.8.2
secret /etc/openvpn/static.key




Здесь 10.9.8.x будет наша VPN-сеть, в которой адрес 10.9.8.1 мы назначем VPN-серверу, а адрес 10.9.8.2 VPN-клиенту.

Еще нам нужно сгенерировать ключ с которым будет подключаться к серверу наш роутер:



openvpn --genkey --secret static.key




И можно запускать демона:

service openvpn start


Теперь установим OpenVPN на наш роутер с которого мы будем инициализировать VPN-соединение:



opkg update
opkg install openvpn




Скопируем ключ на наш рутер, исполюзуя scp:

scp root@your-server.org:/etc/openvpn/static.key /etc/openvpn/static.key




Отредактируем конфигурацию интерфейса:

vi /etc/openvpn/tun0.conf



remote your-server.org
dev tun0
ifconfig 10.9.8.2 10.9.8.1
secret /etc/openvpn/static.key




И проверим, все ли у нас заработает:

openvpn --config /etc/openvpn/tun0.conf




Если все ок, то запустим и добавим OpenVPN демона в автозапуск:

/etc/init.d/openvpn start
/etc/init.d/openvpn enable


Несколько слов о 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-клиент, нужно добавить статисческий маршрут:



route add -net 192.168.1.0 netmask 255.255.255.0 tun0




прописать его можно в том же /etc/rc.local на VPS сервере

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


Создадим файлик и запишем в него эти правила:



vi /etc/iptables.up.rules



#!/bin/sh

#Allow forwarding via tunnel
iptables -I INPUT -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT




Так же сделаем его исполняемым:

chmod +x /bin/ping-vps.sh




И добавим его в /etc/rc.local для автозапуска:

/etc/iptables.up.rules


В принципе все готово.

Наши сети соединены, все машины прекрасно друг-друга видят и обмениваются пакетами.

Теперь, при желании, можно настроить проброс портов с внешнего на внутренний адрес.


Вот так, к примеру, выглядит проброс 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 есть и подключены все необходимые для этого модули ядра


Источники




При написании статьи, я использовал информацию из следующих источников:

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий