我有一个基于 Linux 的防火墙/路由器,运行 iptables 和 SNAT,以便通过单个上行链路将流量传输到互联网 - 运行良好。此服务器上还运行着少量应用程序,它们也运行良好。
我还在此路由器上运行了一个 OpenVPN 客户端,并且我想将特定本地用户的流量通过此隧道路由。
我已经启动并运行了隧道,它创建了一个接口 tun_v。
我创建了一个新的路由表(/etc/iproute2/rt_tables)v.tunnel,并且我正在这个表的隧道中添加一条单一的默认路由。
我创建了一条 IP 规则,将此表用于标记为 1 的流量
我将我的用户的流量标记为 1。
ip route 通过 172.25.26.61 dev tun_v table v.tunnel 添加默认
ip 规则添加 fwmark 1 表 v.tunnel
iptables -t mangle -A OUTPUT -m 所有者 --uid-owner 1002 -j MARK --set-xmark 0x1/0xffffffff
我也在路由器上伪装流量:
iptables -t nat -A POSTROUTING -o wan -j MASQUERADE #这是互联网的正常 NAT
iptables -t nat -A POSTROUTING -o tun_v -j MASQUERADE #用于隧道
防火墙还默认删除输入(和转发)链,因此我允许相关:
iptables -A INPUT -i wan -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun_v -m state --state RELATED,ESTABLISHED -j ACCEPT(还有一些其他防火墙规则,但与此无关)
如果我从该用户(uid 为 1002)生成流量,然后对 tun_v 接口进行 tcpdump,我可以看到我的数据包发出去,回复回来。但是我从未看到数据包到达我的应用程序。ping 没有显示任何回复,尝试建立 TCP 连接时,我看到 SYN 发出去,SYNACK 回复,然后 SYN 的 TCP 重新传输发出去。
如果我添加一条使用此隧道的“正常”路线,例如
ip route 通过 172.25.26.61 添加 abcd
然后我就可以(从任何用户)ping 指定的服务器。
我确信我遗漏了其他东西,但我看不出是什么。据我所知,所有用户到 abcd(表主)的路由都有效,这意味着隧道和所有 iptables 规则都是正确的。流量标记有效,并且应用到正确的规则也有效,因为我可以看到数据包离开正确的接口,并且回复回来了。
感觉好像某个地方的防火墙规则导致了问题,但如上所述,针对 abcd 的隧道测试规则有效。
如果我从 iptables 中删除 MARK,那么来自 UID 1002 的所有流量都可以正常工作(通过正常的 wan 接口)。
如有任何帮助或建议,我们将不胜感激!