Failover GW + OpenVPN
-
Тогда зачем отслеживать падение gw для впн серверов ? Failover для опенвпн настраивается на клиентах. В конфиге клиентов, напр. :
... remote 1.1.1.1 1194 udp remote 2.2.2.2 1195 udp remote-random ...
Всё. Клиент будет перебирать адреса впн-серверов. Недоступен один - подкл. к другому.
-
вот эта проблема по прежнему актуальна
- При подключении основного gw обратно, соединения по прежнему идут через второй gw (на который переключились при отключении основного), ровно до тех пор пока не перезапустишь OpenVPN серверы, тогда сразу возвращаемся на первый 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Создам, пожалуй, отдельный пост.