2

我试图使用 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 日志中观察到数据包的传出接口成功地从 更改intfAtap0

在返回路径中

从隧道中获取加密数据包后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 命令中的任何内容。

4

1 回答 1

0

我也有同样的问题。作为一个临时解决方案,我发现-j TEEtarget 有帮助:

iptables -t mangle -A PREROUTING [options] -j TEE --gateway IP

在您的情况下,用您的值填写[options]网关的IP(intfA 地址)。

于 2013-08-14T11:47:22.713 回答