Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Failover GW + OpenVPN

    Scheduled Pinned Locked Moved Russian
    36 Posts 6 Posters 6.0k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      PavelSv
      last edited by

      Тоже спрошу в этой теме:

      Имеем 2х провайдеров в режиме "load balance", OpenVPN cервер  слушающий locallhost. У клиентов прописаны оба внешних адреса.
      Проблема появляется когда у клиента  пропадает интернет и подключение проходит через второй адрес, но ответные пакеты при этом приходят с первого адреса. Помогает "сброс" подключения на стороне сервера. Есть ли какое ни будь решение?

      1 Reply Last reply Reply Quote 0
      • werterW
        werter
        last edited by

        Доброе.

        Проблема появляется когда у клиента  пропадает интернет и подключение проходит через второй адрес

        С чего бы клиенту точно подкл. на 2-ой впн? Пропал инет у клиента, появился, соединение пошло на тот адрес, к-ый указан первым в конфиге клиента.
        Покажите конфиг клиента.

        1 Reply Last reply Reply Quote 0
        • P
          pigbrother
          last edited by

          @werter:

          Доброе.

          Проблема появляется когда у клиента  пропадает интернет и подключение проходит через второй адрес

          С чего бы клиенту точно подкл. на 2-ой впн? Пропал инет у клиента, появился, соединение пошло на тот адрес, к-ый указан первым в конфиге клиента.
          Покажите конфиг клиента.

          @werter:

          Тогда зачем отслеживать падение gw для впн серверов ? Failover для опенвпн настраивается на клиентах. В конфиге клиентов, напр. :

          ...
          remote 1.1.1.1 1194 udp
          remote 2.2.2.2 1195 udp
          remote-random
          ...
          

          Всё. Клиент будет перебирать адреса впн-серверов. Недоступен один - подкл. к другому.

          Может быть из-за  remote-random, который для failover, imho, не нужен?

          1 Reply Last reply Reply Quote 0
          • P
            PavelSv
            last edited by

            Дело не в remote-random. Клиент - чаще всего виндовая машина за роутрером. Теряется инет, но связь то до роутера остаётся. Клиент и реконектится на следующий адрес.
            Ну это я так понимаю… Поправьте если что то не так

            1 Reply Last reply Reply Quote 0
            • W
              winmasta
              last edited by

              Придумал кое-какое решение для своей проблемы через 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, как только шлюз вновь будет доступен, впн серверы перезапустятся снова.
              В реальных условиях буду тестировать завтра, если где ошибся или не прав, сообщите.

              1 Reply Last reply Reply Quote 0
              • P
                PavelSv
                last edited by

                С нетерпением жду тестов и бегу разворачивать Zabbix

                1 Reply Last reply Reply Quote 0
                • P
                  PavelSv
                  last edited by

                  Еще назрел вопрос: а что если вместо внешних ip указать dns имена (А записи)? Есть ли какие то подводные камни? И как лучше сделать: 2 А-записи на разные ip или 1 A-запись с разным приоритетом ip?

                  1 Reply Last reply Reply Quote 0
                  • W
                    winmasta
                    last edited by

                    @PavelSv:

                    Еще назрел вопрос: а что если вместо внешних ip указать dns имена (А записи)? Есть ли какие то подводные камни? И как лучше сделать: 2 А-записи на разные ip или 1 A-запись с разным приоритетом ip?

                    У нас сделано так: есть ddns имя, в сети (не на pfsense а отдельно) стоит dynamic updater от noip с интервалом обновления 1 минута, при отвале основного шлюза в течение минуты записи обновляются, но вот когда эти обновления дойдут до клиентов - большой вопрос, однако по результатам тестов руководство устраивает такая схема. Возможно лучший вариант все таки 2 remote на клиентах, первый - основной, второй - резервный, при рестарте сервера сначала клиенты всегда будут стучать на первый.

                    Не совсем понятно, что значит "А-запись с разным приоритетом ip", возможно имеется ввиду roundrobin ?

                    PS теста похоже не будет, обещали с утра свет отключить, но видимо не будут. С другой стороны вчера на "левом" триггере несколько раз оттестировал - работает (серверы рестартуют, что и требуется).

                    1 Reply Last reply Reply Quote 0
                    • P
                      pigbrother
                      last edited by

                      winmasta,
                      Нарыл в своих запасниках рестартер Open VPN, который пару раз использовал на 2.0.2

                      echo "" | 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 нагруженным.
                      Необходимость перезагрузки отпала, разбираться не стал.

                      1 Reply Last reply Reply Quote 0
                      • W
                        winmasta
                        last edited by

                        @pigbrother:

                        winmasta,
                        Нарыл в своих запасниках рестартер Open VPN, который пару раз использовал на 2.0.2

                        echo "" | 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, где то я эту строку уже находил

                        1 Reply Last reply Reply Quote 0
                        • P
                          pigbrother
                          last edited by

                          Оба варианта пробовали?

                          1 Reply Last reply Reply Quote 0
                          • P
                            pigbrother
                            last edited by

                            Если еще актуально.
                            Корректный стоп\старт\рестарт индивидуального экземпляра 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

                            Создам, пожалуй, отдельный пост.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post
                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.