需解决的问题
在上图的拓扑中,我们希望达到的效果是:
- 对于除了两个网卡的ip所在网段的路由,全部作为默认路由,以ECMP(等价多路径)的方式,从两张网卡发送出去;
- 当其中一张网卡link down时,忽略该网卡的路径,流量只从link up的网口发出去;
服务器的两张网卡分别属于两个不同的三层网络,分别是:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group defau
lt qlen 1000
link/ether a0:36:9f:ad:47:84 brd ff:ff:ff:ff:ff:ff
inet 1.1.1.2/30 brd 1.1.1.3 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a236:9fff:fead:4784/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group defau
lt qlen 1000
link/ether a0:36:9f:ad:47:86 brd ff:ff:ff:ff:ff:ff
inet 1.1.2.2/30 brd 1.1.2.3 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a236:9fff:fead:4786/64 scope link
valid_lft forever preferred_lft forever
在此基础上增加默认路由配置后,在服务器上查看路由,会有如下条目:
default
nexthop via 1.1.1.1 dev eth0 weight 1
nexthop via 1.1.2.1 dev eth1 weight 1
1.1.1.0/30 dev eth0 proto kernel scope link src 1.1.1.2
1.1.2.0/30 dev eth1 proto kernel scope link src 1.1.2.2
当服务器的其中一张网卡eth0断开后,查看路由条目,会发现跟上面的输出没有变化,这意味着默认路由仍然会从eth0,eth1两个网卡以ECMP的方式发出,这将导致从eth0出去的流量丢失,从而发生网络故障。
解决方法
配置linux内核参数ignore_routes_with_link_down可以忽略网卡断开时的路由,具体方式如下:
# 默认忽略所有连接断开的网卡上的路由
net.ipv4.conf.default.ignore_routes_with_linkdown = 0
# 对所有网卡设置,忽略该网卡断开时本网卡上的路由
net.ipv4.conf.all.ignore_routes_with_linkdown = 0
# 对指定网卡eth0设置,忽略该网卡断开时本网卡上的路由
net.ipv4.conf.eth0.ignore_routes_with_linkdown = 0
在配置了如上三条任意一条后,再查看服务器上的路由,会得到如下显示:
default
nexthop via 1.1.1.1 dev eth0 weight 1 dead linkdown
nexthop via 1.1.2.1 dev eth1 weight 1
1.1.1.0/30 dev eth0 proto kernel scope link src 1.1.1.2 dead linkdown
1.1.2.0/30 dev eth1 proto kernel scope link src 1.1.2.2
这时默认路由将会忽略从eth0发出的路由,所有默认流量将从eth1发出,从而不会引起网络中断。