我正在尝试设置配置,其中与端口 161 的所有连接都将通过另一个网关(通过 openvpn),而其他连接则直接进行
[本地主机] -> [网关] -> [远程] - 确定
[localhost] <- [网关] <- [远程] - 数据包在 VPN 隧道后消失。我可以在 tun0 iface 上嗅到它,然后它就消失了。
我做了什么:将 gw1 添加到 rt_tables 然后使用此规则
ip route add default via 10.8.0.1 dev tun0 table gw1
ip rule add fwmark 0x1 table gw1
iptables -A OUTPUT -t mangle -o eth0 -p tcp --dport 443 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o tun0 -p tcp --dport 443 -j SNAT --to 10.8.0.2
iptables -A OUTPUT -t mangle -o eth0 -p udp --dport 161 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o tun0 -p udp --dport 161 -j SNAT --to 10.8.0.2
所以我正在测试 tcp 和 udp 连接以及我所看到的:
- 在远程端,一切正常,数据包被发送回网关 eth0
- 在网关上数据包被传回 VPN 隧道 (tun0)
- 在发送该数据包的本地主机上,我看到数据包如何到达 tshark 中的 10.8.0.2 (tun0),然后消失。本地主机进行 TCP 重传或重新发送 UDP 数据包。
我检查了wireshark中的数据包捕获,所有端口都是正确的,因此它在所有传输过程中使用相同的随机动态端口:来回传输。我还尝试在 localhost 上使用 masquerade 而不是 SNAT,但没有成功。尝试使用 DNAT 将数据包重定向到 127.0.0.1,但没有成功,但我不确定,也许我做错了什么。
为什么该数据包在 tun0 之后消失?我的输入链目前允许一切。也许我需要启用或禁用 sysctl.conf 中我不关心的任何新“功能”?
谢谢
答案1
我的规则是正确的
解决方案:
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
现在一切正常。请注意,您需要在每个 iface 上禁用该功能,选项“all”无法正常工作。