OpenVPN隧道之间的动态路由

OpenVPN隧道之间的动态路由

我正在考虑通过以下方式使用动态路由 [ OSPF 或 RIP ]OpenVPN隧道。目前,我有几个办公室以全网状方式连接,但随着我们添加更多位置,这不是可扩展的解决方案。如果我计划使用的两个 vpn 终端点之一发生故障,我希望避免大量内部流量受到影响的情况。

您在生产中是否有类似的配置?如果是的话 - 您使用了什么路由守护进程 -斑驴? 还有什么?您遇到什么问题了吗?

谢谢!

答案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 界面。

相关内容