您无需修改内核即可实现此目的,请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
所以所有响应的数据包都将被发送到原始数据包来自的接口。