Назад | Перейти на главную страницу

OpenVPN переключиться обратно на основной сервер после восстановления соединения на pfSense

Мы используем pfSense в качестве сервера / клиентов Openvpn. У нас есть около 20 клиентов pfSense, которые подключаются к основному сайту с помощью сайта Openvpn для настройки сайта. На основном pfSense (сервер vpn) мы установили несколько WAN, и у нас есть настройка отказоустойчивого сайта для подключения к сайту, настроив сервер на прослушивание localhost, а порт перенаправляет порты vpn с нескольких WAN на 127.0.0.1. На клиентах в Custom options мы добавили:

remote serverAlternatieWanIp VpnPort udp

Этот сценарий подходит для нас, когда основной канал выходит из строя, клиенты устанавливают новое соединение через альтернативную глобальную сеть.

Чего мы не знаем:
Как заставить клиентов переключиться (переподключиться) к основной глобальной сети после того, как основное подключение к глобальной сети снова установится? (Нашим обходным путем теперь является перезапуск клиента Openvpn или иногда перезапуск всего pfSense, чтобы подтолкнуть клиентов vpn снова подключиться к основной глобальной сети, или «убить» альтернативную глобальную сеть, чтобы подтолкнуть клиентов VPN к повторному подключению к основной. Все они кажутся мне плохими способ сделать это).

Нам также будет интересно узнать, кто из клиентов подключен к альтернативной глобальной сети. Теперь обходной путь - перейти к каждому клиенту vpn pfsense и прочитать адрес удаленного хоста в статусе клиента vpn. Мы используем Zabbix для мониторинга нашей сетевой инфраструктуры, и мы будем рады попытаться выяснить, какой WAN используется для подключения каким-либо образом API, чтобы мы могли, по крайней мере, вызвать ошибку в Zabbix и сказать администраторам, чтобы они повторно подключили клиента к основной WAN.

У меня есть две идеи

1. Вы могли бы заставить OpenVPN ждать, пока не прекратится активность (если возможно, может быть, ночью?), А затем автоматически разорвать соединение или повторно разрешить IP-адрес сервера (и, возможно, сделать что-то сложное / творческое с DNS). Я ничего из этого не тестировал, я просто просмотрел документацию. Похоже, это может сработать для вас, вам просто нужно поэкспериментировать.

Помимо этого, я не вижу ничего принципиально неправильного в отключении клиентских подключений, чтобы заставить их повторно подключиться путем перезапуска их экземпляров или мгновенного отключения резервного канала, пока пользователи могут справиться с кратковременным отключением. Вы беспокоились об этом? Или просто хотите, чтобы это происходило автоматически?

Извлечено из справочной страницы OpenVPN: https://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html

- неактивный n (Экспериментально) Заставляет OpenVPN завершать работу через n секунд бездействия на устройстве TUN / TAP. Время бездействия измеряется с момента последнего входящего туннельного пакета.

- пинг n Удаленный эхо-запрос по каналу управления TCP / UDP, если в течение как минимум n секунд не было отправлено ни одного пакета (укажите --ping на обоих одноранговых узлах, чтобы пакеты ping отправлялись в обоих направлениях, поскольку пакеты ping OpenVPN не отражаются, как пакеты ping IP) . При использовании в одном из безопасных режимов OpenVPN (где указаны --secret, --tls-server или --tls-client) пакет ping будет криптографически безопасным. У этой опции есть два предполагаемых использования:

(1) Совместимость с межсетевыми экранами с отслеживанием состояния. Периодический пинг гарантирует, что правило брандмауэра с отслеживанием состояния, которое позволяет проходить UDP-пакетам OpenVPN, не истечет.

(2) Предоставить удаленному устройству основу для проверки существования своего партнера с помощью опции --ping-exit.

--ping-exit n Заставляет OpenVPN завершать работу через n секунд без получения пинга или другого пакета от удаленного компьютера. Эту опцию можно комбинировать с --inactive, --ping и --ping-exit для создания двухуровневого отключения при бездействии. Например,

openvpn [параметры ...] --inactive 3600 --ping 10 --ping-exit 60

при использовании на обоих одноранговых узлах вызовет выход OpenVPN в течение 60 секунд, если его одноранговый узел отключится, но выйдет через один час, если фактические данные туннеля не обмениваются.

--ping-restart n Аналогично --ping-exit, но запускает перезапуск SIGUSR1 по прошествии n секунд без приема эхо-запроса или другого пакета от удаленного устройства. Этот параметр полезен в случаях, когда удаленный узел имеет динамический IP-адрес, а DNS-имя с низким TTL используется для отслеживания IP-адреса с помощью такой службы, как http://dyndns.org/ + динамический DNS-клиент, такой как ddclient.

Если одноранговый узел недоступен, запускается перезапуск, в результате чего имя хоста, используемое с --remote, будет повторно разрешено (если также указано --resolv-retry).

В режиме сервера --ping-restart, --inactive или любой другой тип внутренне сгенерированного сигнала всегда будет применяться к отдельным объектам экземпляра клиента, а не ко всему серверу. Также обратите внимание на то, что в режиме сервера любой внутренний сигнал, который обычно вызывает перезапуск, вместо этого приведет к удалению объекта экземпляра клиента.

В клиентском режиме для параметра --ping-restart по умолчанию установлено значение 120 секунд. Это значение по умолчанию будет сохраняться до тех пор, пока клиент не получит заменяющее значение с сервера на основе параметра --keepalive в конфигурации сервера. Чтобы отключить 120 секунд по умолчанию, установите --ping-restart 0 на клиенте.

См. Раздел сигналов ниже для получения дополнительной информации о SIGUSR1.

Обратите внимание, что поведение SIGUSR1 можно изменить с помощью параметров --persist-tun, --persist-key, --persist-local-ip и --persist-remote-ip.

Также обратите внимание, что --ping-exit и --ping-restart являются взаимоисключающими и не могут использоваться вместе.

Предлагаю прочитать мануал. Там еще кое-что.

Смотрите также это - обсуждение этого вопроса в PfSense: https://forum.pfsense.org/index.php?topic=42935.0

2. Другой вариант - запустить скрипт (перезапустить OpenVPN?) При изменении статуса интерфейса. Это также, я не собираюсь проходить тестирование или что-то в этом роде, но я нашел некоторое обсуждение этого.

https://forum.pfsense.org/index.php?topic=65846.0

По-видимому, вы можете хранить команды в /etc/devd.conf

Моя содержит:

# $Id$
# $FreeBSD: src/etc/devd.conf,v 1.26.2.1 2005/09/03 22:49:22 sam Exp $

options {
        directory "/etc/devd";
        directory "/usr/local/etc/devd";
        pid-file "/var/run/devd.pid";
        set scsi-controller-regex
                "(aac|adv|adw|aha|ahb|ahc|ahd|aic|amd|amr|asr|bt|ciss|ct|dpt|\
                esp|ida|iir|ips|isp|mlx|mly|mpt|ncr|ncv|nsp|stg|sym|trm|wds)\
                [0-9]+";
};

# CARP notify hooks. This will call carpup/carpdown with the
# interface (carp0, carp1) as the first parameter.
notify 100 {
    match "system"          "CARP";
    match "type"            "MASTER";
    action "/usr/local/sbin/pfSctl -c 'interface carpmaster $subsystem'";
};

notify 100 {
    match "system"          "CARP";
    match "type"            "BACKUP";
    action "/usr/local/sbin/pfSctl -c 'interface carpbackup $subsystem'";
};

notify 100 {
    match "system"          "CARP";
    match "type"            "INIT";
    action "/usr/local/sbin/pfSctl -c 'interface carpbackup $subsystem'";
};

# When a USB keyboard arrives, attach it as the console keyboard.
attach 100 {
        device-name "ukbd0";
        action "kbdcontrol -k /dev/ukbd0 < /dev/console 2>/dev/null";
};

detach 100 {
        device-name "ukbd0";
        action "kbdcontrol -k /dev/kbd0 < /dev/console 2>/dev/null";
};

#
# Signal upper levels that an event happened on ethernet class interface
#
notify 0 {
        match "system"          "IFNET";
        match "type"            "LINK_UP";
        media-type              "ethernet";
        action "/usr/local/sbin/pfSctl -c 'interface linkup start $subsystem'";
};

notify 0 {
        match "system"          "IFNET";
        match "type"            "LINK_DOWN";
        media-type              "ethernet";
        action "/usr/local/sbin/pfSctl -c 'interface linkup stop $subsystem'";
};

#
# Signal upper levels that an event happened on 802.11 class interface
#
notify 0 {
        match "system"          "IFNET";
        match "type"            "LINK_UP";
        match "subsystem"       "[a-z]+[0-9]+_wlan[0-9]+";
        action "/usr/local/sbin/pfSctl -c 'interface linkup start $subsystem'";
};

# Notify all users before beginning emergency shutdown when we get
# a _CRT or _HOT thermal event and we're going to power down the system
# very soon.
notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "Thermal";
        match "notify"          "0xcc";
        action "logger -p kern.emerg 'WARNING: system temperature too high, shutting down soon!'";
};

Может это сработает для тебя