Вся затея теряет смысл если мы не сможем подключаться к серверу из любого места и смотреть за состоянием датчиков или просматривать записи с камер. Вот тут мне и подложили собаку господа из МТС.
Как оказалось, у МТС нет безлимитных тарифов с реальным Ip адресом, по которому можно было получить доступ к серверу. Узнав об этом я слабо сказать "опечалился", но мой воспаленный мозг нашел хоть и корявое, но все же решение данной проблемы!
Вот она, рыба моей мечты - VPN тунель!
Итак, приступим!
Дома у меня стоит DIR-320 (старый!) с прошивкой dd-wrt и поддержкой OpenVPN (как ее установить - google Вам в помощь, все описано до мельчайших подробностей). Выглядит он вот так:
На даче стоит DIR-620 с прошивкой keenetic (как превратить DIR-620 в ZyXEL Keenetic).
Теперь переходим к настройкам.
Сервером у нас будет выступать DIR-320, так как он имеет статический внешний ip-адрес.
Клиентом будет DIR-620, он будет соединяться с DIR-320.
VPN версия прошивки DD-WRT предлагает веб-интерфейс к конфигурации демона OpenVPN с полным набором сертификатов и ключей.
Будем иметь ввиду на будущее, но для начала я предлагаю воспользоваться более простым вариантом с единственным статическим ключом. Сделать это можно благодаря функции прошивки DD-WRT, позволяющей написать собственный набор скриптов, исполняемых во время загрузки устройства.
Начнём с маршрутизатора сервера, в качестве которого выступает DIR-320. Нам потребуется два скрипта, Startup и Firewall.
Примеры скриптов для серверного устройства:
cd /tmp
echo "
proto udp
port 2001
dev tun0
secret /tmp/static.key
verb 3
comp-lzo
keepalive 15 60
daemon
" > main-client1.conf
echo "
-----BEGIN OpenVPN Static key V1-----
d8b9a3ea013eed9b475aa6eb5aff9c8d
5faa88bf55117b89ed4a0f23dc9b7416
(Ваш статический ключ!)
1b1814a595720cd420484161b6cfa871
233ff7bd1da8a822ceee98ffe80b5175
bec32b2291df3c6904b42f7f14937a0d
-----END OpenVPN Static key V1-----
" > static.key
ln -s /usr/sbin/openvpn /tmp/myvpn
/tmp/myvpn --mktun --dev tun0
ifconfig tun0 10.0.1.1 netmask 255.255.255.0 promisc up
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.0.1.2
sleep 5
/tmp/myvpn --config main-client1.conf
iptables -I INPUT 2 -p udp --dport 2001 -j ACCEPT
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
iptables -I INPUT 3 -i tun0 -p icmp -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
Настройка клиента:
Установим OpenVPN на роутер DIR-620 командой:
opkg install openvpn
Создадим конфигурационный файл:
nano /media/DISK_A1/system/etc/openvpn/openvpn.conf
И вставим в него следующие строки:
remote xxx.xxx.xxx.xxx #Внешний ip-адрес нашего DIR-320
port 2001
proto udp
dev tun0
secret /media/DISK_A1/system/var/static.key
ifconfig 10.0.1.2 10.0.1.1
keepalive 15 60
verb 3
comp-lzo
persist-key
persist-tun
tun-mtu 1380
mssfix 1300
Сохраняем файл (F2,Y, Enter). Затем чуть подправим скрипт запуска:
nano /media/DISK_A1/system/etc/init.d/K11openvpn
В нём надо добавить правила iptables в конце разделов start:
iptables –A INPUT -p udp --dport 2001 -j ACCEPT
route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.0.1.1
и stop:
iptables –D INPUT -p udp --dport 2001 -j ACCEPT
Пример:
Сохраняем этот скрипт, переименовываем для автоматического запуска и сразу же запускаем.
mv /media/DISK_A1/system/etc/init.d/K11openvpn /media/DISK_A1/system/etc/init.d/S11openvpn
/media/DISK_A1/system/etc/init.d/S11openvpn start
Теперь создадим группу правил для брандмауэра:
nano /media/DISK_A1/system/etc/firewall.d/fw.sh
В этот файл надо скопировать следующие строки:
#!/bin/sh
iptables -I FORWARD 1 --source 10.0.1.0/24 -j ACCEPT
iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
После сохранения делаем файл запускаемым и тут же выполняем его:
chmod +x /media/DISK_A1/system/etc/firewall.d/fw.sh
/media/DISK_A1/system/etc/firewall.d/fw.sh
В примерах у основного маршрутизатора внутренний интерфейс 192.168.0.1/24, внешний ххх.ххх.ххх.ххх, адрес туннельного интерфейса 10.0.1.1, у клиентского 192.168.1.1/24 и 10.0.1.2 соответственно. В качестве транспорта выбран протокол UDP, включена компрессия и каждые 15 секунд проверяется, отвечает ли маршрутизатор на другом конце туннеля.
Теперь осталось на роутере DIR-320 настроить проброс портов и по внешнему ip-адресу ххх.ххх.ххх.ххх будет доступен сервер подключенный к роутеру DIR-620!
Читайте продолжение истории!