【内核】Linux内核参数ignore_routes_with_link_down-忽略已断开连接的路由

需解决的问题

在上图的拓扑中,我们希望达到的效果是:

  1. 对于除了两个网卡的ip所在网段的路由,全部作为默认路由,以ECMP(等价多路径)的方式,从两张网卡发送出去;
  2. 当其中一张网卡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发出,从而不会引起网络中断。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章