我的目标是配置一个容器作为路由器,在多个 VPN 连接上进行负载平衡。
为此,我用以下概率标记启动数据包:
iptables -I PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m statistic --mode random --probability .50 -j MARK --set-mark 200 -m mark --mark 0
iptables -A PREROUTING -t mangle -j MARK --set-mark 201 -m mark --mark 0
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
选择两个路由表之一:
echo "200 tun0" >> /etc/iproute2/rt_tables
echo "201 tun1" >> /etc/iproute2/rt_tables
ip rule add fwmark 200 table tun0
ip rule add fwmark 201 table tun1
我相信路由表选择正确,因为当我配置任一表 tun0/1 以使用 VPN 网关流量时似乎无法返回。Atcpdump
显示流量退出但任何命令失败。
ip route add default 10.7.7.1 dev tun0 table tun0
ip route add default 10.7.7.1 dev tun1 table tun1
如果表 tun0/1 使用非 VPN 网关,10.10.10.1
流量将按预期运行。我还可以通过在主表上设置默认路由来在 VPN 网关之间进行选择:
ip route add default 10.7.7.1 dev tun0/1
因此,问题似乎出在通过自定义表之一而不是主表选择 VPN 网关时。欢迎任何线索/诊断/建议!
注意我已经配置了必要的选项:
echo 0 > /proc/sys/net/ipv4/conf/**/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
sysctl -w net.ipv4.fwmark_reflect=1
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
回答:
@AB 的回答提供了解决方案。我需要在 tun0/1 表中为返回本地网络的流量添加路由:
ip r a 10.10.10.0/24 via 10.10.10.1 table tun0
ip r a 10.10.10.0/24 via 10.10.10.1 table tun1
正如@AB 所说,没有这些标记的数据包将被发送回接收它们的 tun。