Pull to refresh

Расширить возможности 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, установленная на самом роутере.

Традиционно: замечания, добавления, рекомендации — приветствуются. Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.