实际问题
当服务器有两个外网IP时,发现通过另一个IP始终无法访问到服务器
找寻原因
安装tcpdump后对流量进行分析
tcpdump -i any -ff -n port 80

对所有网口抓包后发现看起来还挺正常
但是
tcpdump -i ens7 -ff -n port 80

tcpdump -i ens6 -ff -n port 80

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中流出