OpenVPN在pfSense连接恢复后切换回主服务器

我们使用pfSense作为Openvpn服务器/客户端。 我们有大约20个站点到站点的pfSense客户端,它们使用Openvpn站点到站点configuration连接到主站点。 在主要pfSense(vpn服务器)上,我们安装了多个wans,并且通过设置服务器侦听本地主机和端口从多个wans向127.0.0.1转发vpn端口,我们已经build立了故障转移站点到站点的连接。 在自定义选项中的客户端,我们添加了:

remote serverAlternatieWanIp VpnPort udp

当主链路断开时,这种情况对我们工作正常,客户端通过备用WANbuild立新的连接。

我们不知道的是:
主WAN连接重新启动后,如何推送客户端切换回(重新连接)到主WAN? (我们的解决方法是重新启动Openvpn客户端,或者重新启动整个pfSense来推动vpn客户端再次连接到主WAN,或者“终止”备用WAN来推动VPN客户端重新连接到主服务器。方法来做到这一点)。

我们也很乐意看到哪个客户端连接到备用WAN。 现在,解决方法是在每个VPN客户端pfsense上进行并读取客户端的VPN状态上的远程主机地址。 我们正在使用Zabbix来监视我们的networking基础设施,我们将很乐意尝试使用某种API方式来连接networking,所以我们至less可以在Zabbix上触发错误,并告诉pipe理员将客户端重新连接到主WAN。

我有两个想法

1.你可以让OpenVPN等到没有任何活动(如果可能的话,也许在晚上),然后自动删除连接或重新parsing服务器的IP(也许可以做一些棘手的/创造性的东西)。 我还没有testing过这些,我只是看了一下文档。 看起来这可能适合你,你只需要试验。

除此之外,我并没有发现任何固有的错误,例如,通过重新启动实例,或者暂时closures备份链接,只要用户能够处理短暂的断开连接,就可以通过删除客户端连接来重新连接它们。 你担心吗? 或只是热衷于自动发生?

从OpenVPN提取手册页: https //openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html

–inactive n (实验性)导致OpenVPN在TUN / TAP设备停止n秒后退出。 不活动的时间长度是从最后一个进入的隧道数据包开始测量的。

如果在至lessn秒内没有发送数据包,则在TCP / UDP控制通道上Ping Ping远程设备(在两个对等点上指定 – ping,因为OpenVPN ping数据包没有被回显,所以双向发送ping数据包IP ping数据包)。 在使用OpenVPN的安全模式(其中指定了–secret, – tls-server或-tls-client)时,ping数据包将具有密码安全性。 这个选项有两个预期的用途:

(1)与状态防火墙的兼容性 定期ping将确保允许OpenVPN UDP数据包通过的有状态防火墙规则不会超时。

(2)为使用-ping-exit选项远程testing对等体的存在提供依据。

–ping-exit n导致OpenVPN在n秒后退出,而不接收来自远程的ping或其他数据包。 此选项可与–inactive,–ping和–ping-exit组合以创build两层不活动断开连接。 例如,

openvpn [选项…] – 不活跃3600 – 平台10 – 平台退出60

当在两个对等体上使用时,如果对方断开连接,将导致OpenVPN在60秒内退出,但如果没有实际的隧道数据交换,将在一小时后退出。

–ping-restart n类似于–ping-exit,但在n秒后通过SIGUSR1重启,而不接收来自远程的ping或其他数据包。 如果远程节点具有dynamicIP地址,并且使用低TTL DNS名称来跟踪IP地址,则此选项非常有用,例如http://dyndns.org/ +dynamicDNS客户端(如ddclient 。

如果无法访问对等设备,将会触发重新启动,导致与–remote一起使用的主机名被重新parsing(如果还指定了–resolv-retry)。

在服务器模式下,–ping-restart,–inactive或任何其他types的内部生成信号将始终应用于单个客户端实例对象,而不是整个服务器本身。 还要注意,在服务器模式下,任何通常会导致重新启动的内部生成的信号都会导致删除客户机实例对象。

在客户端模式下,默认情况下,–ping-restart参数设置为120秒。 该默认值将一直保持到客户端从服务器中取出一个replace值,这取决于服务器configuration中的–keepalive设置。 要禁用120秒的默认值,请在客户端上设置–ping-restart 0。

有关SIGUSR1的更多信息,请参阅下面的信号部分。

请注意,SIGUSR1的行为可以通过–persist-tun,–persist-key,–persist-local-ip和–persist-remote-ip选项来修改。

还要注意–ping-exit和–ping-restart是互斥的,不能一起使用。

我build议阅读手册。 那里有更多的东西。

也可以看看–PfSense关于此事的具体讨论: https ://forum.pfsense.org/index.php?topic=42935.0

2. 另一个想法是在接口状态改变时运行一个脚本(重新启动OpenVPN?)。 这也是,我不会去testing或任何东西,但我find了一些关于它的讨论。

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" "[az]+[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!'"; }; 

也许这会为你工作