Linux内核:如何强制TCP RST在传入接口上发送而不做出路由决策?

时间:2013-07-24 07:26:01

标签: linux tcp linux-kernel

我在一个孤立服务的环境中工作,它们之间没有路由。 因此,我需要通过传入接口发送TCP RST消息,而不做任何路由决定,因为dst和[{1}}消息的可用路由都没有丢失。

我在Linux内核tcp_v4_send_reset函数中添加了这一行:

RST

但我可以从tcpdump看到RST消息没有在传入接口上发送,但做出了路由决定。

任何帮助?

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您无需修改​​内核即可实现此目的,请改用ip rule

首先标记来自不同界面的连接,并将标记保存在conntrack表中(我以eth2 / 4为例):

iptables -t mangle -A routemark -i eth2 -j MARK --set-mark 0x100
iptables -t mangle -A routemark -i eth4 -j MARK --set-mark 0x200
iptables -t mangle -A routemark -m mark ! --mark 0x0/0xff00 -j CONNMARK --save-mark --mask 0xff00

然后为/etc/iproute2/rt_tables中的每个接口创建rt_table,将默认路由插入表中:

ip route add default via gateway-ip-eth2 dev eth2 table rt-eth2
ip route add default via gateway-ip-eth4 dev eth4 table rt-eth4

对于每个传出数据包,将连接标记恢复为数据包标记,并查找相应的rt_table:

iptables -t mangle -A PREROUTING -m connmark ! --mark 0x0/0xff00 -j CONNMARK --restore-mark --mask 0xff00
ip rule add from all fwmark 0x100/0xff00 ! iif eth2 lookup rt-eth2
ip rule add from all fwmark 0x200/0xff00 ! iif eth4 lookup rt-eth4

因此,所有响应的数据包都将被发送到原始数据包来自的接口。

相关问题