Interface 使用iptables标记和ip路由命令更改数据包的传入接口

Interface 使用iptables标记和ip路由命令更改数据包的传入接口,interface,routing,packet,iptables,Interface,Routing,Packet,Iptables,我试图使用iptables标记和ip路由命令更改数据包的传入接口 我尝试过使用iptable Mark和iproute2实用程序而不是路由目标,但在接收路径中更改数据包的传入接口时没有发现任何成功 我有一个应用程序“A”,它绑定到linux中的接口intfA,即应用程序仅通过intfA发送和接收数据包 发送路径 在基于隧道的设置中,我能够使用以下iptable命令将数据包从intfA发送到tap0: iptables -t mangle -A OUTPUT -d 8.9.10.11/32 -j

我试图使用iptables标记和ip路由命令更改数据包的传入接口

我尝试过使用iptable Mark和iproute2实用程序而不是路由目标,但在接收路径中更改数据包的传入接口时没有发现任何成功

我有一个应用程序“A”,它绑定到linux中的接口
intfA
,即应用程序仅通过
intfA
发送和接收数据包

发送路径 在基于隧道的设置中,我能够使用以下
iptable
命令将数据包从
intfA
发送到
tap0

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
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: "
主表中的默认路由条目指向
intfA

在表“1”中,我将默认路由表入口点设置为
tap0

route add default dev tap0 table 1
我可以从内核dmesg日志中观察到,数据包的传出接口成功地从
intfA
更改为
tap0

在返回路径中 在
tap0
从隧道中获取加密的数据包后,它将其解密,并通过
tap0
接口将目标为“a.b.c.d”的纯文本数据包注入linux内核

因此,在内核预路由钩子中,我看到数据包带有IP='a.b.c.d',以及传入的
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命令在预路由钩子和输入钩子处记录数据包:

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
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: "
我希望包的传入接口在预路由钩子和输入钩子之间从
tap0
更改为
intfA
。但令人惊讶的是,接口在内核日志跟踪中都没有改变。我也可以看到标记为2的传入数据包

从dmesg日志中,我确认输入钩子之后,传入接口仍然保持为
tap0


我想了解我使用的iptables命令的这种行为背后的原因。不确定我使用的iptables命令中是否遗漏了导致此问题的任何内容。

我也有同样的问题。作为一种临时解决方案,我发现
-j TEE
target有助于:

iptables-t mangle-A预路由[选项]-j TEE-网关IP


在您的情况下,用您的值填充
[选项]
和网关的
IP
(intfA地址)。

我遇到了与原始OP相同的问题。我尝试了-j TEE,但复制的数据包随后将传入接口设置为
lo
,而不是带有
intfA
地址的接口。