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

Linux内核:如何强制在传入接口上发送TCP RST而不做路由决定?,linux,tcp,linux-kernel,Linux,Tcp,Linux Kernel,我在一个服务被隔离的环境中工作,服务之间没有路由。 因此,我需要通过传入接口发送TCP RST消息,并且根本不做任何路由决定,因为没有可用于dst的路由,并且RST消息丢失 我在Linux内核tcp\u v4\u发送\u重置函数中添加了这一行: arg.bound_dev_if = (skb->dev != dev_net(skb->dev)->loopback_dev) ? skb->dev->ifindex : 0; 但我可以从tcpdumps中看到,RST消

我在一个服务被隔离的环境中工作,服务之间没有路由。 因此,我需要通过传入接口发送
TCP RST
消息,并且根本不做任何路由决定,因为没有可用于
dst
的路由,并且
RST
消息丢失

我在Linux内核tcp\u v4\u发送\u重置函数中添加了这一行:

arg.bound_dev_if = (skb->dev != dev_net(skb->dev)->loopback_dev) ? skb->dev->ifindex : 0;
但我可以从tcpdumps中看到,RST消息不是在传入接口上发送的,而是做出了路由决定

有什么帮助吗


我遗漏了什么吗?

您不需要修改内核来实现这一点,而是使用
ip规则

首先标记来自不同接口的连接,并将标记保存在conntrack表中(我使用eth2/4作为示例):

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

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_表:

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
因此,所有响应数据包将被发送到原始数据包来自的接口

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