【问题标题】:Linux kernel: how to force TCP RST to be sent on incoming interface and not making routing decisions?Linux内核:如何强制TCP RST在传入接口上发送而不做出路由决定?
【发布时间】:2013-07-24 07:26:00
【问题描述】:

我在一个服务被隔离且它们之间没有路由的环境中工作。 因此我需要通过传入接口发送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 消息没有在传入接口上发送,而是做出了路由决策。

有什么帮助吗?

我错过了什么吗?

【问题讨论】:

    标签: linux tcp linux-kernel


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2019-04-04
      • 2019-12-11
      • 1970-01-01
      • 2017-11-05
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多