我有 2 个 openvpn 客户端连接到 2 个不同的服务器,分别在 tun0 和 tun1 设备上。
我需要为同一个主机 IP 添加 2 个静态路由,并将它们映射到 2 个不同的网关和 tun 设备。
我已经运行了这两个命令:
route add -host 69.30.217.90 gw 10.197.2.1 dev tun0
route add -host 69.30.217.90 gw 10.197.14.1 dev tun1
当我发出 CURL 请求并指定要使用的设备时,只有第二条路由有效。一旦我删除它(通过停止 openvpn 实例),第一条路由就可以正常工作。
有没有什么办法可以让两条路线都能正常工作,这取决于我使用哪种设备发出请求?
编辑:
我应该补充一点,这是一个简化的例子。
我实际上需要同时启动 5 个以上的 openvpn 隧道,并且路由的生存期约为 1 秒,仅足以执行单个 curl 请求。
我这样做的目的是测试 VPN 服务器是否正常工作,方式与客户端在正常使用时类似,通过连接到服务器、通过隧道发出请求并与预期响应进行比较。
运行测试守护进程的单个实例就可以了,但是完整的测试套件需要大约 20 秒,而测试 100 台服务器则需要很长时间。我可以同时运行多个,但它们最终会互相干扰。
答案1
我在 oif 匹配时遇到了麻烦。我怀疑(但不确定)这是因为输出接口决策是在它最初决定使用哪个路由条目之后做出的。
但可以匹配输出IP地址,进行策略路由。
例如:
echo "100 TUN" >> /etc/iproute2/rt_tables
ip route add 10.197.2.0/24 dev tun0 table TUN
ip route add 69.30.217.90 via 10.197.2.1 dev tun0 table TUN
ip rule add from 10.197.2.8 table TUN
echo 为路由表 #100(以下称为 TUN)创建一个别名,以便可以在 iproute2 命令中通过名称引用它。
第一个路由命令将 tun0 的基本在线网络添加到表 TUN。这应该设置为与默认表中预先存在的路由相同的网络。
第二条路由命令将与 tun0 关联的特定主机和网关添加到表 TUN 中。
最后,该规则按源 IP 匹配数据包。此处的值应更改为 tun0 上的本地接口地址,或者整个非重叠网络也可以。它指示与此规则匹配的数据包使用表 TUN,然后根据我们之前添加到此表的路由进行路由。
您可能想尝试 oif 匹配规则。这对我来说从未奏效,但 ymmv:
ip rule add oif tun0 table TUN