我正在尝试为具有固定 IP 的工作节点设置高可用性 OpenVPN 集群,无论它们连接到哪个 OpenVPN 服务器。这是一项要求,因为事物都明确绑定到该 IP 地址。我计划在每个主节点上安装一个分布式 etcd,我将推送哪个主节点具有哪些工作节点(使用 OpenVPN 连接/断开脚本),然后相应地更新每个主节点的路由表(通过观察 etcd 密钥)。
一切都将在docker容器中运行。
我绘制了一张当前情况的图表,其中有 3 个主节点(M1、M2、M3)、3 个工作节点(w1、w2、w3)和“sidecar”容器(M2M1、M3M1、M3M2),用于将每个主节点连接到其他主节点。
设置以下路由表后,一切正常,但需要更新主节点和 sidecar 容器上的路由。除了标准 iptables -A FORWARD 规则以确保接口之间的流量转发外,我只需要在工作节点上添加一条 iptables 规则,例如iptables -A POSTROUTING -o tap0 -m iprange --dst-range 5.0.0.0-5.255.255.255 -j SNAT --to-source 5.0.0.1 -t nat
针对 w1,否则它将使用主 ip 地址发送数据包。
我想知道是否可以在 Sidecar 容器上设置基于策略的路由,以便只使用规则"if it's coming from tap0 and it's from an ip in 5.0.0.0/8 then put it on eth0 towards the master node inside the same subnet"
,反之亦然"if it's coming from eth0 and it's in an ip in 5.0.0.0/8 then put it on tap0 towards the vpn gateway"
。如果我可以这样做,那么我只需要操作主节点上的路由
我是否需要用 iptables 标记数据包,然后设置 2 个路由表,每个标记一个,然后在该表上设置路由?
我以前尝试过建立一座桥梁,但却无法让它发挥作用。
(如果有比我这个相当复杂的设置更好的方法来设置具有固定 IP 的 VPN 集群,请告诉我)
编辑:
在以下答案的帮助下,我针对 M2M1 测试了以下语句,效果很好:
# Create the 2 tables to add specific routes on
echo "2 toeth" >> /etc/iproute2/rt_tables
echo "3 totap" >> /etc/iproute2/rt_tables
# Everything coming from eth0 will be going to the totap table and everything from tap0 will be going to the toeth table
ip rule add table totap iif eth0
ip rule add table toeth iif tap0
# Add the routes but on the specific table
ip r r 5.0.0.0/8 via 192.168.1.1 table totap
ip r r 5.0.0.0/8 via 172.30.2.2 table toeth
编辑2:
如果有人有兴趣尝试一下,我已经建立了一个github 仓库
答案1
您可以使用ip rule
(参见man ip-rule
)根据源或目标 IP 以及源或目标接口设置特定路由表。它应该能够实现您想要的效果。
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ iif STRING ] [ oif STRING ] ...