VPN должен жить. Делаем костыль для подъема соединения в случае разрыва

Соединение OpenVPN, конечно же, может упасть. Может просто отвалиться служба, сервер может закрыть соединение с клиентом и ping-restart, keepalive помогают не всегда.

Нужно сделать восстановление соединения в кратчайшие сроки, если служба упала.

Работаем с OpenVPN client на OpenWRT 14.07

В моем случае туннеля два:

Если один из туннелей упал - нужно его поднять, если упали оба - нужно поднять оба, если всё хорошо, то ничего делать не нужно. Пишем скрипт vpn_watchdog.sh:

pgrep с аргументом -f ищет строку по всем аргументам, а не только в имени процесса.

Конструкция if [ -z "$vpn1" ]; проверяет пустая ли строка находится в переменной $vpn1. Если пустая - значит процесса нет и vpn1 нужно перезапустить, в противном  случае "VPN1 ok".

Добавим в cron, пусть проверяет каждую минуту:

crontab -e

*/1 * * * * /etc/openvpn/vpn_watchdog.sh > /dev/null 2>&1

Не забудьте о пустой строке в конце конфига и после внесения изменений перезапустим cron

/etc/init.d/cron restart

О своей работе скрипт пишет в syslog. Понаблюдать за ним можно, запустив logread -f

Всё хорошо:

Wed Oct 21 12:03:01 2015 cron.info crond[794]: crond: USER root pid 2825 cmd /etc/openvpn/vpn_watchdog.sh > /dev/null 2>&1
Wed Oct 21 12:03:01 2015 user.notice root: VPN1 ok
Wed Oct 21 12:03:01 2015 user.notice root: VPN2 ok

Убили принудительно один тунель:

Wed Oct 21 12:04:01 2015 cron.info crond[794]: crond: USER root pid 2842 cmd /etc/openvpn/vpn_watchdog.sh > /dev/null 2>&1
Wed Oct 21 12:04:01 2015 user.notice root: VPN1 restart
Wed Oct 21 12:04:01 2015 user.notice root: VPN2 ok

Если туннель один, то можно не использовать pgrep -f, а службу перезапускать целиком. Получится вот так:

 

Если Вы знаете, как сделать лучше, напишите, пожалуйста, об этом.

Закладка Постоянная ссылка.

Отправить ответ

avatar
  Subscribe  
Notify of