我有一个基于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议将受到感谢!