Linux 多网口策略路由


实际问题

当服务器有两个外网IP时,发现通过另一个IP始终无法访问到服务器

找寻原因

安装tcpdump后对流量进行分析

tcpdump -i any -ff -n port 80

all.png

所有网口抓包后发现看起来还挺正常

但是

tcpdump -i ens7 -ff -n port 80

ens7.png

tcpdump -i ens6 -ff -n port 80

ens6.png

WTF。。。流量竟然是分开来走的

既然不是目标地址返回的数据,且TCP链接都没有建立,客户端当然不会接受其他地址发来的数据,直接RST处理了

解决思路

既然流量分开走是不行的,那让流量只在同一接口返回即可

解决办法

对入方向的连接,每个都打上标记,方便处理

iptables -t mangle -A PREROUTING -i ens7 -m conntrack --ctstate NEW -j CONNMARK --set-mark 7

ens7的所有连接都打上7的标记

iptables -t mangle -A PREROUTING -i ens6 -m conntrack --ctstate NEW -j CONNMARK --set-mark 6

ens6的所有连接都打上6的标记

iptables -t mangle -A OUTPUT -m connmark ! --mark 0x0 -j CONNMARK --restore-mark

对出方向流量,把所有打了标记的连接清理掉

添加路由规则,限制返回的数据方向

ip route add default via 192.168.0.1 dev ens7 table 107
ip rule add fwmark 7 table 107

建立新的路由表107,将所有打了7标记的连接,都往这个路由表里经过,然后匹配到默认路由,从指定的端口ens7中流出

同理

ip route add default via 10.0.0.1 dev ens6 table 106
ip rule add fwmark 6 table 106

建立新的路由表106,将所有打了6标记的连接,都往这个路由表里经过,然后匹配到默认路由,从指定的端口ens6中流出


文章作者: Jerry Yan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jerry Yan !
  目录