Случилась следующая ситуация:
— имеется несколько разнесенных территориально (разные города) офисов.
— имеется относительно старые роутеры с поддержкой 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
Т.е. срипт подготавливает каталог /tmp/openvpn, запускает, если не запущен демон cron, скачивает нужные для работы OpenVPN файлы, уникальные для каждого офиса, и в конечном итоге, запускает OpenVPN.
5. Более подробно рассмотрим третью переменную: cron_jobs.
Ее задача — каждые три минуты роутер должен скачать с хранилища срипт watchovpn.sh и запустить его.
Содержимое скрипта следующее:
/home/vpn/malina/watchovpn.sh
Суть скрипта очень проста:
— проверить доступность центрального офиса по публичному адресу. и если недоступен, то ничего не делаем.
— проверить доступность центрального офиса по приватному (VPN) адресу. и если доступен, значит у нас все хорошо и ничего не делаем.
— если же приватный адрес центральный офис недоступен, но при этом он же доступен по публичному адресу, значит у нас что-то случилось с VPN (в удаленном офисе, или в центральном — не важно).
и поэтому, надо перезапустить OpenVPN для попытки восстановить приватный доступ. Для этого загружается актуальный openvpn.sh и исполняется. Т.е. по сути, выполняем переменную rc_startup.
Резюмируем: не смотря на то, что в удаленных офисах стоят примитивные роутеры, мы имеем достаточно гибкую, отказоустойчивую приватную сеть, построенную при помощи OpenVPN с центральным хранилищем ключей и исполняемых скриптов.
При необходимости внести изменения в конфигурацию VPN, достаточно исправить файлы в центральном хранилище, а они самостоятельно будут актуализированы удаленным офисом, самое позднее, через 3 минуты.
Саму конфигурацию OpenVPN я намеренно опускаю, так как она здесь не играет никакой роли, и каждым может быть реализована согласно его интересов. Единственное ограничение — версия openvpn, установленная на самом роутере.
Традиционно: замечания, добавления, рекомендации — приветствуются. Спасибо за внимание.
— имеется несколько разнесенных территориально (разные города) офисов.
— имеется относительно старые роутеры с поддержкой 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, установленная на самом роутере.
Традиционно: замечания, добавления, рекомендации — приветствуются. Спасибо за внимание.