我设置了一个 openvpn 服务器,并有许多客户端连接到该服务器。所有这些客户端都有固定的 IP 地址,这些地址来自其证书名称。
在 openvpn 服务器后面,我有一个管理服务器,它需要连接到客户端(以监视/执行一些远程命令)。
|-C1
|-C2
A -- VPN server -|
|-C3
|-C4
服务器A可以通过VPN连接到C1-4,使用固定IP。
我想要做的是将设置扩展到多个 VPN 服务器(以处理服务器中断并分散负载),同时仍然让 A 以一种简单的方式找到任何特定的远程客户端。
|-C1
|-C2
--- VPN server 1 -|
|
A
|
--- VPN server 2 -|
|-C3
|-C4
我知道如何配置客户端随机选择其中一个 openvpn 服务器,但我不知道如何管理 ip 分配。
我应该为服务器保留一个子网吗?在这种情况下,A 如何知道 IP 位于哪个服务器后面?我应该为每个 openvpn 服务器设置一个子网吗?在这种情况下,A 如何知道要联系哪个 IP 地址?
我研究过一些动态路由系统,但我必须为每个客户端 IP 管理一个路由,这似乎非常错误...另一种选择是使用映射 {client-name => 当前 IP 地址} 保持 DNS(或类似 DNS)服务更新,但这看起来很复杂,而且我不确定我们所有的软件堆栈是否都能适应它。
通常如何处理这种故障转移设置?
答案1
使用映射 {客户端名称 => 当前 IP 地址} 更新的 DNS(或类似 DNS)服务
使用 OpenVPN 服务器上的脚本在 OpenVPN 服务器上处理此问题相对容易--client-connect
。客户端连接脚本会传递新连接的 IP 地址。然后您可以使用它来调用 nsupdate调整您的 DNS 记录。
这是我的一个旧脚本,它记录了连接客户端的外部地址。这不是您想要的,但我相信如果您查看Environmental Variables
手册页的部分,您可以找到正确的变量。
#!/bin/sh
# expects variables like from openvpn
#common_name=server1.example.org
#trusted_ip=192.168.47.1
dnssrv="192.168.0.1"
zone="vpn.example.org"
ttl="7200"
record=`echo ${common_name} | sed -e 's/example.org/vpn.example.org/'`
echo "client-connect.sh ${common_name} ${trusted_ip} ${record}" | logger
(
echo "server ${dnssrv}"
echo "zone ${zone}"
echo "update delete ${record} A"
echo "update add ${record} ${ttl} A ${trusted_ip}"
echo "send"
) | /usr/bin/nsupdate