0

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

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

arg.bound_dev_if = (skb->dev != dev_net(skb->dev)->loopback_dev) ? skb->dev->ifindex : 0;

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

有什么帮助吗?

我错过了什么?

4

1 回答 1

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

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

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

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

于 2013-07-24T09:34:10.493 回答