我试图使用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命令。
答案 0 :(得分:0)
我有同样的问题。作为临时解决方案,我发现-j TEE
目标有助于:
iptables -t mangle -A PREROUTING [options] -j TEE --gateway IP
在您的情况下,使用您的值填写[options]
和网关的IP
(intfA地址)。