• Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Search
  • Register
  • Login
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 May 3, 2017, 10:21 AM

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

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

    1 Reply Last reply Reply Quote 0
    • W
      werter
      last edited by May 3, 2017, 3:34 PM

      Доброе.

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

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

      1 Reply Last reply Reply Quote 0
      • P
        pigbrother
        last edited by May 3, 2017, 6:57 PM

        @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 May 4, 2017, 3:20 AM

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

          1 Reply Last reply Reply Quote 0
          • W
            winmasta
            last edited by May 10, 2017, 4:01 PM

            Придумал кое-какое решение для своей проблемы через 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 May 11, 2017, 6:39 AM

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

              1 Reply Last reply Reply Quote 0
              • P
                PavelSv
                last edited by May 11, 2017, 7:26 AM

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

                1 Reply Last reply Reply Quote 0
                • W
                  winmasta
                  last edited by May 11, 2017, 7:55 AM

                  @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 May 11, 2017, 10:24 AM May 11, 2017, 8:05 AM

                    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 May 11, 2017, 12:38 PM

                      @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 May 11, 2017, 1:22 PM

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

                        1 Reply Last reply Reply Quote 0
                        • P
                          pigbrother
                          last edited by May 22, 2017, 3:29 PM May 22, 2017, 12:27 PM

                          Если еще актуально.
                          Корректный стоп\старт\рестарт индивидуального экземпляра 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.
                            This community forum collects and processes your personal information.
                            consent.not_received