我试图使用 iptables MARK 和 ip route 命令更改数据包的传入接口。
我已经尝试过这种方法,它建议使用 iptable Mark 和 iproute2 实用程序而不是 ROUTE 目标,但在接收路径中更改数据包的传入接口时找不到任何成功。
我有一个应用程序“A”,它绑定到 linux 中的接口intfA
,即应用程序仅在 via 上发送和接收数据包intfA
。
发送路径
intfA
在基于隧道的设置中,我能够tap0
使用以下iptable
命令发送数据包:
iptables -t mangle -A OUTPUT -d 8.9.10.11/32 -j MARK --set-mark 1
ip rule add fwmark 1 priority 9000 table 1
我在主表中的默认路由条目指向intfA
在表“1”中,我将默认路由表入口点设为tap0
:
route add default dev tap0 table 1
我可以从内核 dmesg 日志中观察到数据包的传出接口成功地从 更改intfA
为tap0
。
在返回路径中
从隧道中获取加密数据包后tap0
,它会对其进行解密并通过接口将目标为“abcd”的纯文本数据包注入 linux 内核tap0
。
因此,在内核预路由钩子中,我看到带有 IP = 'abcd' 和传入的数据包tap0
。
以下 iptable 规则用于更改传入接口:
iptables -t mangle -A PREROUTING -d a.b.c.d/32 -j MARK --set-mark 2
ip rule add fwmark 2 priority 8000 table 2
在表“2”中,我将默认路由表入口点设为intfA
:
route add default dev intfA table 2
我尝试使用以下 iptable 命令在 PREROUTING 钩子和 INPUT 钩子上记录数据包:
iptables -t mangle -A PREROUTING -d a.b.c.d/32 -j LOG --log-level 0 --log-prefix "VPN PREOUTING: "
iptables -t mangle -A INPUT -d a.b.c.d/32 -j LOG --log-level 0 --log-prefix "VPN INPUT: "
我希望数据包的传入接口在 PREROUTING 钩子和 INPUT 钩子之间tap0
更改。intfA
但令人惊讶的是,内核日志跟踪中的接口都没有改变。我也可以看到标有标记 2 的传入数据包。
tap0
从 dmesg 日志中,我确认 Incoming 接口在 INPUT 钩子之后仍然存在。
我想了解我使用的 iptables 命令的这种行为背后的原因。不确定我是否错过了导致此问题的 iptables 命令中的任何内容。