我在一个孤立服务的环境中工作,它们之间没有路由。
因此,我需要通过传入接口发送TCP RST
消息,而不做任何路由决定,因为dst
和[{1}}消息的可用路由都没有丢失。
我在Linux内核tcp_v4_send_reset函数中添加了这一行:
RST
但我可以从tcpdump看到RST消息没有在传入接口上发送,但做出了路由决定。
任何帮助?
我错过了什么吗?答案 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
因此,所有响应的数据包都将被发送到原始数据包来自的接口。