Как стать автором
Обновить

Расширить возможности OpenVPN на DD-WRT на старых роутерах

Случилась следующая ситуация:
— имеется несколько разнесенных территориально (разные города) офисов.
— имеется относительно старые роутеры с поддержкой DD-WRT, пусть, к примеру, это будет DLink DIR-300.
— требуется связать между собой локальные сети этих офисов.

Решение, которое предполагалось изначально: на роутерах поднимается OpenVPN и уже посредством него связываются офисные «локалки». Идея понятная, много раз опробованное и реализованное многократно.

Но «в лоб», по отлаженным схемам не получилось, так как встроенные в web-интерфейс DD-WRT возможности по конфигурированию OpenVPN довольно скромные, и не позволяют использовать многие возможности.

После некоторых размышлений, была создана и отлажена конфигурация OpenVPN, которая запускалась с заранее подготовленного файла на роутере. Все работает, но ровно до первой перезагрузки роутера. Роутер не сохраняет никаких файлов а внешний носитель, вроде USB-флешки подключить некуда — портов нет. Т.е. изначальная задача свелась к следующей: как научить роутер загружать OpenVPN с нужным мне файлом конфигурации и ключами.

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

Идея такая — хранить все необходимые файлы на отдельном выделенном сервере, возможно и внешнем «облаке», при включении роутера и появлении у него выхода в Интернет, скачивать с внешнего ресурса требуемые файлы во временную память роутера и уже после этого запускать OpenVPN с необходимыми файлами.

Итак делаем следуюющее:

1. На доступном выделенном сервере (у меня это стал сервер под Linux в центральном офисе, на котором организован корпоративный почтовый сервер и прочие корпоративные штучки) поднят FTP-сервер. Как вариант, это может быть какое-то из облачных хранилищ.

2. На FTP-сервере заводим одного (или несколько, если нет доверия между офисами), и для каждого офиса создаем отдельную директорию, содержащую ключи, файл конфигурации и прочую необходимую информацию, уникальную для каждого офиса.

3. На роутере, находящемся в удаленном офисе, прописываем следующие переменные, хранящиеся в NVRAM:

rc_startup=echo 'start'>/tmp/root/log.txt;sleep 30;cd /tmp/root;rm -f openvpn.sh;wget vpn:1357246@80.89.140.182/ogni/openvpn.sh;sh openvpn.sh
cron_enable=1
cron_jobs=*/3 * * * * root cd /tmp/root;rm -f watchovpn.sh;wget vpn:1357246@80.89.140.182/ogni/watchovpn.sh;sh watchovpn.sh


первая переменная — это набор команд, которые выполнятся при загрузке роутера
вторая — включает демон cron, и вызывает его загрузку
третья — содержит задание, которое будет исполняться с периодичность раз в три минуты

И не забываем сказать роутеру nvram commit, если зашли на него через ssh (telnet) или сохранить изменения, если зашли на web-страничку.

4. Более подробно рассмотрим первую переменную rc_startup.

Выполнение переменной приводит к тому, что в каталог /tmp/root будес помещен скрипт openvpn.sh, скачанный из каталога, содержащего файлы для офиса «Малина».
И после этого, скрипт будет исполнен.

Содержимое скрипта такое:

/home/vpn/malina/openvpn.sh

#!/bin/sh
#Download need files and start openvpn-client

#Make work_dir
sleep 1
rm -rf /tmp/openvpn
sleep 1
mkdir -p /tmp/openvpn

runcron=`pidof cron`
if [ "$runcron" -eq "" ]; then
/usr/sbin/cron
fi

#Download files
sleep 1
wget ftp://vpn:1357246@a.b.c.d/malina/ca.crt -O /tmp/openvpn/ca.crt
wget ftp://vpn:1357246@a.b.c.d/malina/malina.crt -O /tmp/openvpn/malina.crt
wget ftp://vpn:1357246@a.b.c.d/malina/malina.key -O /tmp/openvpn/malina.key
wget ftp://vpn:1357246@a.b.c.d/malina/openvpn.conf -O /tmp/openvpn/openvpn.conf
#wget ftp://vpn:1357246@a.b.c.d/malina/vpn_wd.sh -O /tmp/openvpn/vpn_wd.sh

#Start openvpn-client
sleep 1
killall openvpn
sleep 1
openvpn --daemon --config /tmp/openvpn/openvpn.conf


Т.е. срипт подготавливает каталог /tmp/openvpn, запускает, если не запущен демон cron, скачивает нужные для работы OpenVPN файлы, уникальные для каждого офиса, и в конечном итоге, запускает OpenVPN.

5. Более подробно рассмотрим третью переменную: cron_jobs.

Ее задача — каждые три минуты роутер должен скачать с хранилища срипт watchovpn.sh и запустить его.

Содержимое скрипта следующее:

/home/vpn/malina/watchovpn.sh

#!/bin/sh
#
# Watch-dog for openvpn link
#
# Cron job
#*/3 * * * * root cd /tmp/root;rm -f watchovpn.sh;wget ftp://vpn:1357246@a.b.c.d/malina/watchovpn.sh;sh watchovpn.sh
#
#####################################

runcron=`pidof cron`
if [ "$runcron" -eq "" ]; then
/usr/sbin/cron
fi

rm /tmp/log.txt

#Test link to MainOffice
/bin/ping a.b.c.d -c 3 -q > /dev/null;rez=$?

if [ "$rez" -eq "1" ]; then
dt=`/bin/date "+%Y/%m/%d %H:%M:%S"`
echo "$dt Main Office not available. Check inet. Done." >> /tmp/log.txt
exit
fi

#Main Office is available
dt=`/bin/date "+%Y/%m/%d %H:%M:%S"`
echo "$dt Main Office is OK." >> /tmp/log.txt

/bin/ping 10.0.7.1 -c 3 -q > /dev/null;rez=$?

if [ "$rez" -eq "0" ]; then
dt=`/bin/date "+%Y/%m/%d %H:%M:%S"`
echo "$dt VPN Tunnel is OK. Test done." >> /tmp/log.txt
exit
fi

dt=`/bin/date "+%Y/%m/%d %H:%M:%S"`
echo "$dt Restart OpenVPN." >> /tmp/log.txt
#Restart OpenVPN

cd /tmp/root
rm -f openvpn.sh
wget ftp://vpn:1357246@a.b.c.d/malina/openvpn.sh
sh openvpn.sh

dt=`/bin/date "+%Y/%m/%d %H:%M:%S"`
echo "$dt Done." >> /tmp/log.txt


Суть скрипта очень проста:
— проверить доступность центрального офиса по публичному адресу. и если недоступен, то ничего не делаем.
— проверить доступность центрального офиса по приватному (VPN) адресу. и если доступен, значит у нас все хорошо и ничего не делаем.
— если же приватный адрес центральный офис недоступен, но при этом он же доступен по публичному адресу, значит у нас что-то случилось с VPN (в удаленном офисе, или в центральном — не важно).
и поэтому, надо перезапустить OpenVPN для попытки восстановить приватный доступ. Для этого загружается актуальный openvpn.sh и исполняется. Т.е. по сути, выполняем переменную rc_startup.

Резюмируем: не смотря на то, что в удаленных офисах стоят примитивные роутеры, мы имеем достаточно гибкую, отказоустойчивую приватную сеть, построенную при помощи OpenVPN с центральным хранилищем ключей и исполняемых скриптов.
При необходимости внести изменения в конфигурацию VPN, достаточно исправить файлы в центральном хранилище, а они самостоятельно будут актуализированы удаленным офисом, самое позднее, через 3 минуты.
Саму конфигурацию OpenVPN я намеренно опускаю, так как она здесь не играет никакой роли, и каждым может быть реализована согласно его интересов. Единственное ограничение — версия openvpn, установленная на самом роутере.

Традиционно: замечания, добавления, рекомендации — приветствуются. Спасибо за внимание.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.