策略路由本地用户的stream量沿隧道

我有一个基于Linux的防火墙/路由器运行iptables和SNAT通过一个单一的上行链路传输到互联网的stream量 – 这工作正常。 此服务器上运行的应用程序也很less,这也可以正常工作。

我也有一个运行在这个路由器上的OpenVPN客户端,我想要将一个特定的本地用户的stream量路由到这个隧道。

我已经build立了一个接口tun_v的隧道启动和运行。

我创build了一个新的路由表(/ etc / iproute2 / rt_tables)v.tunnel,我在这个表中添加一个单一的默认路由。

我已经创build了一个IP规则来使用这个表标记为1的stream量

我用1标记了用户的stream量。

IP路由添加默认通过172.25.26.61 dev tun_v表v.tunnel

ip规则添加fwmark 1表v.tunnel

iptables -t mangle -A OUTPUT -m所有者–uid-owner 1002 -j MARK –set-xmark 0x1 / 0xffffffff

我也在路由器上伪装stream量:

iptables -t nat -A POSTROUTING -o wan -j MASQUERADE#这是正常的NAT到Internet

iptables -t nat -A POSTROUTING -o tun_v -j MASQUERADE#对于隧道

防火墙还默认input(和转发)链,所以我允许相关的:

iptables -A INPUT -i wan -m状态 – 状态RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -i tun_v -m状态 – 状态RELATED,ESTABLISHED -j接受(还有一些其他的防火墙规则,但与此无关)

如果我从这个用户(使用uid 1002)生成stream量,并通过tcpdump tun_v接口,我可以看到我的数据包出去了,回复。 但是,我从来没有看到数据包到达我的申请。 ping不显示任何答复,试图build立一个TCP连接,我看到SYN出去,SYNACK回来,然后一个TCP重新传输的SYN出去。

如果我添加使用此隧道的“正常”路线,例如

ip route通过172.25.26.61添加abcd

那么我可以(从任何用户)ping指定的服务器。

我确定还有别的东西我错过了,但是我什么也看不见。 据我所知,所有用户使用abcd(表主)的path意味着隧道和所有的iptables规则是正确的。 stream量的标记正在工作,并且正确的规则也适用,因为我可以看到数据包离开正确的界面,并且回复。

感觉就像有一个防火墙规则导致了这个问题,但正如上面提到的,testing规则在abcd的隧道下工作。

如果我从iptables中删除MARK,则来自UID 1002的所有stream量都可以工作(通过正常的WAN接口)。

任何帮助或build议将受到感谢!