Failover GW + OpenVPN
-
Доброе.
@winmasta:https://forum.pfsense.org/index.php?topic=127210.msg702207#msg702207
вот товарищ тоже интересуется такой же реализацией
По ссылке внизу есть решение с приязкой Openvpn к Localhost. Решение рабочее - у меня так и работало. Воспользуйтесь.
-
Всем спасибо, все понял.
-
pfSense при выборе интерфейса OpenVPN-сервера выводит группу с примечанием GW group. По идее группы не должно быть видно вообще, так как это группа шлюзов, а привязывается OpenVPN-сервер к интерфейсу.
-
pfSense при выборе интерфейса OpenVPN-сервера выводит группу с примечанием GW group. По идее группы не должно быть видно вообще, так как это группа шлюзов, а привязывается OpenVPN-сервер к интерфейсу.
Было бы неплохо если бы был механизм который (для фэйловера с двумя интерфейсами):
1)при запуске впн сервера на группе шлюзов проверяет какой из них сейчас активен и поднимает сервер на соответствующем интерфейсе
2)при падении главного шлюза впн сервер перезапускается на интерфейсе второго шлюза
3)при восстановлении главного шлюза впн сервер опять перезапускается на первом интерфейсе -
В продолжение темы https://forum.pfsense.org/index.php?topic=128936.0
-
вот эта проблема по прежнему актуальна
- При подключении основного gw обратно, соединения по прежнему идут через второй gw (на который переключились при отключении основного), ровно до тех пор пока не перезапустишь OpenVPN серверы, тогда сразу возвращаемся на первый gw и OPenVPN клиенты тут же появляются
хотя впн серверы теперь живут на локалхосте, проверял несколько раз, старый шлюз держится пока не ткнешь кнопку перезапустить впн сервер, тогда моментально переключается на основной шлюз
как же быть ?
-
ДА…............
Та же проблема...
Нашел один скрипт который решает этот вопрос.
Но не как не могу понять как запустит.вот он.
#!/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> -
Это похоже скрипт для перезапуска впн КЛИЕНТА pfsense, а у меня проблема в серверах, впн сервера не дают сенсу переключить дефолтный шлюз обратно при восстановлении основного, пока вручную не перезапустишь впн серверы.
-
Подскажите а как можно удаленно перезапустить впн серверы на сенсе. Может убить процессы и запустить заново ?
-
Подскажите а как можно удаленно перезапустить впн серверы на сенсе. Может убить процессы и запустить заново ?
Вроде было какое-то API - не уверен правда. как вариант смотреть — Status/Services
-
сделал скриптец один, сегодня проверю, если все отработает - опишу решение
-
в общем есть такой скрипт
#!/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 (причем любого) -
Доброе.
Вы так и не убрали впн с группы интерфейсов ? -
Доброе.
Вы так и не убрали впн с группы интерфейсов ?Убрал, теперь серверы локалхост слушают.
-
Тогда зачем отслеживать падение 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. У клиентов прописаны оба внешних адреса.
Проблема появляется когда у клиента пропадает интернет и подключение проходит через второй адрес, но ответные пакеты при этом приходят с первого адреса. Помогает "сброс" подключения на стороне сервера. Есть ли какое ни будь решение?