Failover GW + OpenVPN
-
нашел интересную тему https://forum.pfsense.org/index.php?topic=65846.0 там вроде как описано, что можно через файл /etc/devd.conf по событию запускать команды, может кто в курсе как в этот файл добавить инструкцию по перезапуску впн сервера при падении wan ?
и еще интересная старая тема, https://forum.pfsense.org/index.php?topic=42000.0 там есть строка на php по перезапуску openvpn (я так понял аналог нажатия на кнопку "перезапустьть опенвпн сервер"), но она не работает, может знатоки ее подправят ?
-
Доброе.
А если понизить tier (вес) до 2 второму WAN ? -
это было сделано изначально
-
Тоже спрошу в этой теме:
Имеем 2х провайдеров в режиме "load balance", OpenVPN cервер слушающий locallhost. У клиентов прописаны оба внешних адреса.
Проблема появляется когда у клиента пропадает интернет и подключение проходит через второй адрес, но ответные пакеты при этом приходят с первого адреса. Помогает "сброс" подключения на стороне сервера. Есть ли какое ни будь решение? -
Доброе.
Проблема появляется когда у клиента пропадает интернет и подключение проходит через второй адрес
С чего бы клиенту точно подкл. на 2-ой впн? Пропал инет у клиента, появился, соединение пошло на тот адрес, к-ый указан первым в конфиге клиента.
Покажите конфиг клиента. -
Доброе.
Проблема появляется когда у клиента пропадает интернет и подключение проходит через второй адрес
С чего бы клиенту точно подкл. на 2-ой впн? Пропал инет у клиента, появился, соединение пошло на тот адрес, к-ый указан первым в конфиге клиента.
Покажите конфиг клиента.Тогда зачем отслеживать падение gw для впн серверов ? Failover для опенвпн настраивается на клиентах. В конфиге клиентов, напр. :
... remote 1.1.1.1 1194 udp remote 2.2.2.2 1195 udp remote-random ...
Всё. Клиент будет перебирать адреса впн-серверов. Недоступен один - подкл. к другому.
Может быть из-за remote-random, который для failover, imho, не нужен?
-
Дело не в remote-random. Клиент - чаще всего виндовая машина за роутрером. Теряется инет, но связь то до роутера остаётся. Клиент и реконектится на следующий адрес.
Ну это я так понимаю… Поправьте если что то не так -
Придумал кое-какое решение для своей проблемы через zabbix, может кому пригодится. Настройку заббикса опишу поверхностно, если надо позже распишу более подробно.
0. Устанавливаем и настраиваем пакет zabbix-agent на нашем pfsense, настраиваем узел сети для нашего pfsense, проверяем, что заббикс агент видит заббикс сервер и наоборот. В настройках zabbix-agent нажав Advanced Options в поле User Parameters добавляем
EnableRemoteCommands=1
1. Создаем на заббикс сервере скрипт в разделе Администрирование-Скрипты следующего содержания
sudo -S sh /usr/openvpnrestart.sh
2. Создаем на заббикс сервере узел сети в разделе Настройки-Узлы сети с любым названием (например providerNameGw) и ip адресом нужного gateway (в моем случае это основной шлюз, за ним и будем следить). Присоединяем к этому узлу шаблон Template ICMP Ping. Далее заходим в элементы данных этого узла, открываем элемент ICMP Ping и в поле Интервал обновления (в сек) выставляем желаемый интервал "пингования" шлюза (я себе поставил 10 сек). Далее заходим в триггеры и (чтобы не изменять триггер шаблона) создаем новый триггер с именем например {HOST.NAME} is DOWN и с выражением {providerNameGw:icmpping.max(#6)}=0 это значит, что после 6 неудачных пингов каждый через 10 сек (итого 6 раз * 10 сек = 1 мин) сработает триггер.
3. Создаем на заббикс сервере действие в разделе Настройки-Действия для источника событий Триггеры (выбрать в меню в правом верхнем углу) с именем например openvpn restart, обязательно ставим галку Сообщение о восстановлении. На вкладке Условия удаляем все условия и добавляем единственное Триггер = ИМЯ_ТРИГГЕРА например в нашем случае будет providerNameGw is DOWN. На вкладке операции добавляем операцию Длительность шага операции по умолчанию (я поставил 60 секунд), Шаги 1-1, Длительность шага - 0 (по умолчанию), Тип операции - Удаленная команда, в Список целей добавляем наш pfsense (из шага 0), Тип-Глобальный скрипт (хотя тут можно было и пользовательский прямо в действии прописать, но вдруг у нас будет много pfsens'ов), имя скрипта - из шага 1, нажимаем Обновить
4. Устанавливаем пакет sudo на pfsense. Заходим в настройку System-sudo, выбираем Custom Configuration - Include at Start.
5. Заходим по ssh на наш pfsense (если ssh не включен, то включаем в System-Advansed раздел Secure Shell) и создаем там скрипт например в папке /usr с названием openvpnrestart.sh и с содержимым
#!/bin/sh pgrep openvpn | xargs kill -9 /usr/local/sbin/openvpn --config /var/etc/openvpn/server1.conf /usr/local/sbin/openvpn --config /var/etc/openvpn/server2.conf
если у вас один сервер, то нижнюю строку убираем, если 3 то добавляем еще одну поменяв номер сервера и т.д. по анологии. Делаем скрипт исполняемым (на всякий случай, хотя у меня он и без этого выполняется)
sudo chmod a+x /usr/openvpnrestart.sh
6. Создаем файл в папке /usr/local/etc/sudoers.d с именем например zabbix и следующим содержимым
zabbix ALL=NOPASSWD: /bin/sh /usr/openvpnserver.sh
ВСЁ! Теперь при отсутствии шлюза в течение минуты сработает триггер, который перезапустит пн серверы на нашем pfsense, как только шлюз вновь будет доступен, впн серверы перезапустятся снова.
В реальных условиях буду тестировать завтра, если где ошибся или не прав, сообщите. -
С нетерпением жду тестов и бегу разворачивать Zabbix
-
Еще назрел вопрос: а что если вместо внешних ip указать dns имена (А записи)? Есть ли какие то подводные камни? И как лучше сделать: 2 А-записи на разные ip или 1 A-запись с разным приоритетом ip?
-
Еще назрел вопрос: а что если вместо внешних ip указать dns имена (А записи)? Есть ли какие то подводные камни? И как лучше сделать: 2 А-записи на разные ip или 1 A-запись с разным приоритетом ip?
У нас сделано так: есть ddns имя, в сети (не на pfsense а отдельно) стоит dynamic updater от noip с интервалом обновления 1 минута, при отвале основного шлюза в течение минуты записи обновляются, но вот когда эти обновления дойдут до клиентов - большой вопрос, однако по результатам тестов руководство устраивает такая схема. Возможно лучший вариант все таки 2 remote на клиентах, первый - основной, второй - резервный, при рестарте сервера сначала клиенты всегда будут стучать на первый.
Не совсем понятно, что значит "А-запись с разным приоритетом ip", возможно имеется ввиду roundrobin ?
PS теста похоже не будет, обещали с утра свет отключить, но видимо не будут. С другой стороны вчера на "левом" триггере несколько раз оттестировал - работает (серверы рестартуют, что и требуется).
-
winmasta,
Нарыл в своих запасниках рестартер Open VPN, который пару раз использовал на 2.0.2echo "" | php -q
Проверил - вроде работает и сейчас, из консоли, через SSH, через pitty\plink свежих версий.
Полная версия, из которой взял нужный кусок выглядит так:/usr/bin/time -h sh -c 'RUNNING=`ps ax | grep openvpn | grep -v grep`; while [ -n "$RUNNING" ]; do RUNNING=`ps ax | grep openvpn | grep -v grep`; done' | & awk '{print $3}' & echo '' | php -q
Что не понравилось - какая-то из этих версий отрабатывала, но иногда оставляла CPU нагруженным.
Необходимость перезагрузки отпала, разбираться не стал. -
winmasta,
Нарыл в своих запасниках рестартер Open VPN, который пару раз использовал на 2.0.2echo "" | php -q
Проверил - вроде работает и сейчас, из консоли, через SSH, через pitty\plink свежих версий.
Полная версия, из которой взял нужный кусок выглядит так:/usr/bin/time -h sh -c 'RUNNING=`ps ax | grep openvpn | grep -v grep`; while [ -n "$RUNNING" ]; do RUNNING=`ps ax | grep openvpn | grep -v grep`; done' | & awk '{print $3}' & echo '' | php -q
Что не понравилось - какая-то из этих версий отрабатывала, но иногда оставляла CPU нагруженным.
Необходимость перезагрузки отпала, разбираться не стал.попробовал выполнить - ничего не произошло, версия 2.3.3, где то я эту строку уже находил
-
Оба варианта пробовали?
-
Если еще актуально.
Корректный стоп\старт\рестарт индивидуального экземпляра Open VPN сервера. Возможно - и клиента, это не проверял.pfSsh.php playback svc stop openvpn server 2
Starting the pfSense developer shell….
Attempting to issue stop to openvpn service...
openvpn has been stopped.pfSsh.php playback svc start openvpn server 2
Starting the pfSense developer shell….
Attempting to issue start to openvpn service...
openvpn has been started.pfSsh.php playback svc restart openvpn server 2
Starting the pfSense developer shell….
Attempting to issue restart to openvpn service...
openvpn has been restarted.server 2 - то, что в
/var/etc/openvpn
соответствует server2.confИспользуется PHP pfSense Shell. Теретически можно писать подобие макросов.
https://doc.pfsense.org/index.php/Using_the_PHP_pfSense_ShellСоздам, пожалуй, отдельный пост.