iptables 设置 connmark 但 ip 规则不匹配

iptables 设置 connmark 但 ip 规则不匹配

我正在尝试设置一个 Ubuntu 17.10 VM 以使用多个 VPN 连接,并在它们之间平衡连接负载。我尝试通过运行多个 openvpn 客户端来实现这一点,并尝试使用 iptables/connmark 标记连接,并使用随机模式用不同的值标记不同的连接,然后将它们与不同的 VPN 路由表匹配。但是,我没有成功,所以我试图简化情况以了解出了什么问题。

我已将场景简化为单个 VPN 连接,将所有路由逻辑放在专用路由表中,并尝试标记所有数据包以使用该路由表。

如果我强制所有流量使用该表,它就可以正常工作。如果我尝试标记所有数据包,然后匹配该标记以使用该表,则它不起作用。

适用的规则如下:

0:从所有查找本地
10:从所有查找VPN2
32766:来自所有查找主
32767:来自所有查找默认

以下是无效的规则:

0:从所有查找本地
10:从所有 fwmark 0x14 查找 VPN2
32766:来自所有查找主
32767:来自所有查找默认

下面是我的 iptables mangle 表,它应该标记所有内容:

# iptables -nvL -t mangle
链 PREROUTING(策略接受 6785 个数据包,464K 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标
 8013 545K CONNMARK 全部 -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK 恢复
 7981 543K MARK 全部 -- * * 0.0.0.0/0 0.0.0.0/0 MARK 设置 0x14
 7958 541K CONNMARK 全部 -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK 保存

链输入(策略接受6773个数据包,463K字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

链转发(策略接受 0 个数据包,0 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

链输出(策略接受 4382 个数据包,1132K 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标
 4636 1159K CONNMARK 全部 -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK 恢复
 4516 1146K MARK 全部 -- * * 0.0.0.0/0 0.0.0.0/0 MARK 设置 0x14
 4382 1132K CONNMARK 全部 -- * * 0.0.0.0/0 0.0.0.0/0 CONNMARK 保存

链 POSTROUTING(策略接受 4151 个数据包,1116K 字节)
 pkts 字节数 目标 协议 选择加入 退出 源 目标

我知道我的规则在这里有点没意义(无论如何在标记之前恢复)但我一直试图让它标记所有内容以了解问题出在哪里。

就像我说的,如果我让一切都使用 VPN2 路由表,它就可以正常工作 - 而且我可以看到使用20( 0x14)标记的连接conntrack -L

但是,如果我尝试根据标记进行路由,它不起作用,并且连接尝试甚至在中不可见conntrack -L,即使我看到了SYN_SENT中的状态netstat。我还看到源 IP 不是我的 VPN tun 接口,因此该表未被使用。

非常感谢任何有关调试此问题的建议。

非常感谢

相关内容