使用iptables MARK和ip route命令更改数据包的传入接口

时间:2013-05-01 02:59:45

标签: interface routing packet iptables

我试图使用iptables MARK和ip route命令更改数据包的传入接口。

我尝试this approach建议使用iptable Mark和iproute2实用程序而不是ROUTE目标,但是在接收路径中找不到更改数据包传入接口的任何成功。

我有一个应用程序'A',它绑定到linux中的接口intfA,即应用程序仅通过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从隧道获取加密数据包后,它会对其进行解密,并通过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命令在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的传入数据包。

从dmesg日志中我确认Incoming接口在INPUT挂钩后仍然保持为tap0

我想了解我使用的iptables命令背后的原因。不确定我是否错过了我使用的导致此问题的iptables命令。

1 个答案:

答案 0 :(得分:0)

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

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

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