答案1
我以前也实现过类似的功能,但我的设置相当复杂,可能太复杂了。我目前正在研究实现一个更简单的解决方案,其思路和以下 URL 中描述的内容相似/受其影响,但我将同时描述我构建的内容。URL 为http://www.linuxjournal.com/article/9915
过去,对我来说,一个非常有效的选择是使用 tap 设备而不是 tun 设备来构建 OpenVPN 隧道。这将以太网封装在隧道上而不是第 3 层,并且它允许您绕过 OpenVPN 维护独立于内核的自己的路由表的固有限制。缺点是,这种方式的隧道传输会产生大量开销……想象一下 TCP 通过以太网通过 TCP 加密 SSL……您明白了。优点是它已经运行良好,并且水平扩展得相当好。
假设您的 VPN 服务器和客户端是 Linux 端点(我只在 Linux 上测试过),您可以创建一个新的虚拟桥接接口并将 tap 接口分配给桥接以获取第 3 层。在我的拓扑中,我为每个 VPN 服务器分配了自己的 10.x.0.0/16 子网,还部署了一个本地 DHCP 服务器来为连接的客户端分配地址。DHCP 服务器需要存在,因为 OpenVPN 不再知道 IP 地址;它正在隧道化以太网。客户端在连接后运行 dhclient 以通过 VPN 接口获取 IP,这一切都由与 OpenVPN 配置绑定的连接脚本管理。
通过 DHCP 获得双方的 IP 地址后,您可以使用动态路由协议在连接的客户端之间通告路由。我过去曾使用过 Quagga,它运行得相当可靠。
使用 tap 的服务器配置示例:
mode server
proto tcp-server
port 1194
dev tap0
将 Tap 接口添加到新桥接器的示例命令:
sudo brctl addbr vpnbr0 # create new bridge called vpnbr0
sudo brctl setfd vpnbr0 0 # set forwarding delay to 0 secs
sudo brctl addif vpnbr0 tap0 # add openvpn tap interface to vpnbr0
拆卸命令示例:
sudo brctl delif vpnbr0 tap0
sudo brctl delbr vpnbr0
有了 vpnbr0 桥接接口后,您可以在其上运行 DHCP 服务器或手动分配 IP 地址。然后,您可以像对待任何其他以太网接口一样对待它。您可能希望进行其他更改以调整 MTU 大小,并且您可能会尝试不同的协议和加密选项,直到找到效率和安全性之间的正确平衡。我不再提供任何有关整体吞吐量的良好规格,这里有很多变动部件。
如果我不得不重来一次,我会坚持使用 OpenVPN 中的 tun 设备,并按照我在第一段中链接的文章中的说明,在 OpenVPN 的内部地址表更新时更新 Linux 内核的路由表。这将消除堆栈中的 DHCP,减少隧道开销,并允许我的客户端在不参与动态路由的情况下进行连接和操作。
答案2
我们目前有多个 OpenVPN AS 实例在运行,每个实例都有指向它们的静态路由。我们为每个 OpenVPN 服务器分配了一个 /24 子网。目前,我们已让用户手动指向每个服务器,但您可以使用各种技术将用户指向正确的服务器。
这里唯一的问题是,如果 OpenVPN 服务器发生故障,用户将需要连接到另一台服务器来获取流量。这是因为我们正在重新分配到 OpenVPN 服务器的静态路由,因为 OpenVPN AS 不支持 OSPF。
有一些支持 OpenVPN 的开源路由器,例如 Vyatta,但我们更喜欢 OpenVPN AS 的 Web 界面。