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

    Failover GW + OpenVPN

    Scheduled Pinned Locked Moved Russian
    36 Posts 6 Posters 6.5k 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
      pigbrother
      last edited by

      но почему то кажется что должно работать и через failover_gw
      Через failover можно, наверное, выпускать клиента OpenVPN. Вешать на failover, предназначенный для исходящих соединений службы, ожидающие, входящих соединений, IMHO, неверно.

      Похожая сегодняшняя тема:
      https://forum.pfsense.org/index.php?topic=128827.0

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

        @pigbrother:

        но почему то кажется что должно работать и через failover_gw
        Через failover можно, наверное, выпускать клиента OpenVPN. Вешать на failover, предназначенный для исходящих соединений службы, ожидающие, входящих соединений, IMHO, неверно.

        Похожая сегодняшняя тема:
        https://forum.pfsense.org/index.php?topic=128827.0

        тему конечно читал, хотел даже в ней вопрос задать, но

        1. почему в интерфейсах впн сервера есть возможность выбора интерфейса фейловер ?
        2. я вообще не вижу противоречий, при падении главного гейтвея впн сервер должен перезапуститься на запасном, при восстановлении - перезапуститься на основном (я так вижу этот функционал)

        ps готов почитать все пруф и бест практис линки на английском и русском языках

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

          https://forum.pfsense.org/index.php?topic=127210.msg702207#msg702207

          вот товарищ тоже интересуется такой же реализацией

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

            Пруфов не будет, будет IMHO

            1) почему в интерфейсах впн сервера есть возможность выбора интерфейса фейловер ?
            Потому, что может. Потому, что в списке интерфейсов есть вообще все интерфейсы, которые pfSense знает.

            2) я вообще не вижу противоречий, при падении главного гейтвея впн сервер должен перезапуститься на запасном, при восстановлении - перезапуститься на основном (я так вижу этот функционал)
            Потому, что и faiolver и load balance задуманы как механизмы работы с multiwan в другом направлении - из LAN в интернет.

            Интерфейс (в реальности - IP) и порт , на котором OVPN-сервер ждет подключения - это директивы
            local (1.2.2.2)
            и
            lport (1194)

            где 1.2.2.2 - IP-адрес, а не "виртуальное" имя мультивана, которым pfSense пользуется для организации исходяших  faiolver и load balance.

            Посмотрите, плз, как будет выглядеть директива local в конфиге сервера (/var/etc/openvpn/serverХ.conf)
            при указании в GUI failover_gw как интерфейса?

            Еще раз IMHO - искомый вами вариант если теоретически и возможен, то во взаимодействии  OVPN с pfSense не реализован.

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

              Доброе.
              @winmasta:

              https://forum.pfsense.org/index.php?topic=127210.msg702207#msg702207

              вот товарищ тоже интересуется такой же реализацией

              По ссылке внизу есть решение с приязкой Openvpn к Localhost. Решение рабочее - у меня так и работало. Воспользуйтесь.

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

                Всем спасибо, все понял.

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

                  pfSense при выборе интерфейса OpenVPN-сервера выводит группу с примечанием GW group. По идее группы не должно быть видно вообще, так как это группа шлюзов, а привязывается  OpenVPN-сервер к интерфейсу.

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

                    @pigbrother:

                    pfSense при выборе интерфейса OpenVPN-сервера выводит группу с примечанием GW group. По идее группы не должно быть видно вообще, так как это группа шлюзов, а привязывается  OpenVPN-сервер к интерфейсу.

                    Было бы неплохо если бы был механизм который (для фэйловера с двумя интерфейсами):

                    1)при запуске впн сервера на группе шлюзов проверяет какой из них сейчас активен и поднимает сервер на соответствующем интерфейсе
                    2)при падении главного шлюза впн сервер перезапускается на интерфейсе второго шлюза
                    3)при восстановлении главного шлюза впн сервер опять перезапускается на первом интерфейсе

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

                      В продолжение темы https://forum.pfsense.org/index.php?topic=128936.0

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

                        вот эта проблема по прежнему актуальна

                        1. При подключении основного gw обратно, соединения по прежнему идут через второй gw (на который переключились при отключении основного), ровно до тех пор пока не перезапустишь OpenVPN серверы, тогда сразу возвращаемся на первый gw и OPenVPN клиенты тут же появляются

                        хотя впн серверы теперь живут на локалхосте, проверял несколько раз, старый шлюз держится пока не ткнешь кнопку перезапустить впн сервер, тогда моментально переключается на основной шлюз

                        как же быть ?

                        1 Reply Last reply Reply Quote 0
                        • M
                          mozgx
                          last edited by

                          ДА…............
                          Та же проблема...
                          Нашел один скрипт который решает этот вопрос.
                          Но  не как не могу понять как запустит.

                          вот он.

                          #!/usr/local/bin/php -f
                          require_once('config.inc');
                          include('openvpn.inc');

                          if ($argc != 2)
                          {
                            echo "Usage: " . basename($argv[0]) . " <full or="" partial="" vpn="" client="" name="">\n";
                            exit;
                          }
                          $name = $argv[1];

                          $msg = "Checking whether the $name VPN client needs a restart.";
                          echo $msg."\n";
                          exec("logger '$msg'");

                          // Read in all of the OpenVPN client configs.
                          global $config;
                          if (!is_array($config['openvpn']['openvpn-client']))
                          {
                            return;
                          }

                          // Find client config for given name
                          $found_config = false;
                          foreach ($config['openvpn']['openvpn-client'] as & $settings)
                          {
                            if (stripos($settings['description'], $name) !== false)
                            {
                              $found_config = true;
                              break;
                            }
                          }

                          // If client config not found, exit.
                          if (!$found_config)
                          {
                            echo "Did not find client VPN config for "$name".\n";
                            exit;
                          }

                          // Print the client config.
                          echo "\n–--Client configuration----\n";
                          echo "vpnid: {$settings['vpnid']}\n";
                          echo "description: {$settings['description']}\n";
                          echo "server_addr: {$settings['server_addr']}\n"; 
                          echo "custom_options: {$settings['custom_options']}\n\n";

                          // Resolve the configured host name to an IP address.
                          // This is the VPN server's primary IP.
                          if (is_ipaddr($settings['server_addr']))
                          {
                            $ip_primary = $settings['server_addr'];
                          }
                          else
                          {
                            $ip_primary = gethostbyname($settings['server_addr']);
                            if ($ip_primary == $settings['server_addr'])
                            {
                              echo "DNS lookup failed for VPN server primary hostname ({$settings['server_addr']}). Exiting.\n";
                              exit;
                            }
                          }
                          echo "VPN server primary IP: $ip_primary\n";

                          // Tokenize the custom_options to get the VPN
                          // server's secondary IP.
                          $tok = strtok($settings['custom_options'], " \n\t;");
                          while ($tok !== false)
                          {
                            if (strcasecmp($tok, 'remote') == 0)
                            {
                              $tok = strtok(" \n\t;");
                              if ($tok !== false)
                              {
                                if (is_ipaddr($tok))
                                {
                                  $ip_secondary = $tok;
                                }
                                else
                                {
                                  $ip_secondary = gethostbyname($tok);
                                  if ($ip_secondary == $tok)
                                  {
                                    echo "DNS lookup failed for VPN server secondary hostname ($tok). Exiting.\n";
                                    exit;
                                  }
                                }
                                echo "VPN server secondary IP: $ip_secondary\n";   
                              }
                            }
                            $tok = strtok(" \n\t;");
                          }

                          // Find the status for the VPN client.
                          $found_status = false;
                          $clients = openvpn_get_active_clients();
                          foreach ($clients as $client)
                          {
                            if (stripos($client['name'], $name) !== false)
                            {
                              $found_status = true;
                              break;
                            }
                          }

                          // If client status not found, exit.
                          if (!$found_config)
                          {
                            echo "Did not find VPN client status for "$name".\n";
                            exit;
                          }

                          // Print the client status
                          echo "\n----Client status----\n";
                          echo "name: {$client['name']}\n";
                          echo "mgmt: {$client['mgmt']}\n";
                          echo "status: {$client['status']}\n";
                          echo "remote_host: {$client['remote_host']}\n";

                          // See if the client is connected to a secondary IP.
                          // Note: $client['remote_host'] has trailing white space that
                          // we must trim before comparing to $ip_primary
                          $remote_host = rtrim($client['remote_host']);
                          if ($client['status'] == 'up' && $remote_host == $ip_primary)
                          {
                            $msg = "The $name VPN client is connected to $remote_host (VPN server primary IP). Not restarting client.";
                            echo $msg."\n";
                            exec("logger '$msg'");
                            exit;
                          }
                          else if ($client['status'] == 'up')
                          {
                            $msg = "The $name VPN client is connected to $remote_host (VPN server secondary IP).";
                            echo $msg."\n";
                            exec("logger '$msg'");
                          }
                          else
                          {
                            $msg = "The $name VPN client is not connected. Current status is {$client['status']}.";
                            echo $msg."\n";
                            exec("logger '$msg'");
                            exit;
                          }

                          // If we got this far, we will want to restart the VPN client
                          // so it connects to primary IP instead of secondary IP.

                          // Before trying to connect to primary IP, we have to make sure
                          // we can ping it. If we can't ping it, there's no sense in
                          // trying to connect to it. Furthermore, that is probably
                          // the reason why the client is currently connected to the
                          // secondary IP.
                          exec("ping -t 10 -o $ip_primary", $output, $return_var);
                          echo "ping return_var: $return_var\n";

                          // A return value of 0 means at least one ping was replied to.
                          // In other words, the IP address is up and we should be
                          // able to restart to VPN to connect to it.
                          if ($return_var == 0)
                          {
                            $msg = "VPN server primary IP is up. Restarting $name VPN client.";
                            echo $msg."\n";
                            exec("logger '$msg'");

                          // Restart the VPN client by mimicking the technique used in
                            // the file /usr/local/www/status_services.php
                            //openvpn_restart('client', $settings);
                            $configfile = "{$g['varetc_path']}/openvpn/client{$settings['vpnid']}.conf";
                            $pidfile =    "{$g['varrun_path']}/openvpn_client{$settings['vpnid']}.pid";
                            if (file_exists($configfile))
                            {
                              $msg = "Terminating openvpn using pidfile: $pidfile";
                              echo $msg."\n";
                              exec("logger '$msg'");
                              killbypid($pidfile);
                              // wait for process to terminate
                              sleep(1);
                              $msg = "Starting new openvpn process using config file: $configfile";
                              echo $msg."\n";
                              exec("logger '$msg'");
                              mwexec_bg("/usr/local/sbin/openvpn --config {$configfile}");
                            }

                          $msg = "Finished restarting $name VPN client.";
                            echo $msg."\n";
                            exec("logger '$msg'");
                          }
                          else
                          {
                            $msg = "VPN server primary IP is down. Not restarting $name VPN client.";
                            echo $msg."\n";
                            exec("logger '$msg'");
                          }
                          ?></full>

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

                            Это похоже скрипт для перезапуска впн КЛИЕНТА pfsense, а у меня проблема в серверах, впн сервера не дают сенсу переключить дефолтный шлюз обратно при восстановлении основного, пока вручную не перезапустишь впн серверы.

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

                              Подскажите а как можно удаленно перезапустить впн серверы на сенсе. Может убить процессы и запустить заново ?

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

                                @winmasta:

                                Подскажите а как можно удаленно перезапустить впн серверы на сенсе. Может убить процессы и запустить заново ?

                                Вроде было какое-то API - не уверен правда. как вариант смотреть — Status/Services

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

                                  сделал скриптец один, сегодня проверю, если все отработает - опишу решение

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

                                    в общем есть такой скрипт

                                    #!/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

                                    который перезапускает openvpn серверы (может кто-то знает лучший вариант - напишите)
                                    как бы теперь его запускать по событию падения gateway (причем любого)

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

                                      Доброе.
                                      Вы так и не убрали впн с группы интерфейсов ?

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

                                        @werter:

                                        Доброе.
                                        Вы так и не убрали впн с группы интерфейсов ?

                                        Убрал, теперь серверы локалхост слушают.

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

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

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

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

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

                                            @winmasta:

                                            вот эта проблема по прежнему актуальна

                                            1. При подключении основного gw обратно, соединения по прежнему идут через второй gw (на который переключились при отключении основного), ровно до тех пор пока не перезапустишь OpenVPN серверы, тогда сразу возвращаемся на первый gw и OPenVPN клиенты тут же появляются

                                            хотя впн серверы теперь живут на локалхосте, проверял несколько раз, старый шлюз держится пока не ткнешь кнопку перезапустить впн сервер, тогда моментально переключается на основной шлюз

                                            как же быть ?

                                            Вот поэтому.

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