Linux服务器双网卡双默认路由的实现

场景一

其中一张网卡只需要与特定网段通信,此种情况下可以针对需要通信的特定网段配置明细路由,并在路由条目中指定通信的网卡。

我们假设服务器的网卡为 eth0 和 eth1,网卡相关信息如下:

eth0:ip 地址 172.21.134.84 网关 172.21.134.1
eth1: ip 地址 172.21.135.7  网关 172.21.135.1

其中网卡 eth1 只需要与 172.21.136.0/24 网段通信,则可以通过如下命令添加明细路由:

route add -net 172.21.136.0/24 gw 172.21.135.1 dev eth1

添加后服务器路由表会多出如下条目:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.21.136.0    172.21.135.1    255.255.255.0   UG    0      0        0 eth1

此时即可实现 172.21.136.0/24 网段与 172.21.135.7 之间的通信。

场景二

两张网卡都需要与外界通信,且无法限制特定网段,此时需要针对两张网卡都配置默认路由,而对于服务器来说,配置多条默认路由只有一条会生效,因此直接配置多条默认路由的方法并不能实现双网卡的正常通信。为了解决此问题,我们引入新增路由表 + 策略路由的方法。

1、Linux 中的路由表

Linux 系统默认生成四张路由表:

  • local 表,table_id 为 255,为本地路由表,管理本地回环广播等,由系统自动维护,管理员不能操作此表。
  • main 表,table_id 为 254,主路由表,使用传统命令 route -n 或者 ip route show 看到的路由表就是 main 表的内容。Linux 系统在默认情况下使用这份路由表来传输数据。
  • default 表,table_id 为 253,默认路由表,这个路由表在默认情况下内容为空。
  • unspec 表,table_id 为 0,系统保留表。


路由表的信息可以通过/etc/iproute2/rt_tables 文件查看。

[root]#cat /etc/iproute2/rt_tables
#
#reserved values
#
255	local
254	main
253	default
0	unspec

如果需要新增路由表,可以直接编辑此文件,为了实现双默认路由,我们需要新增两个路由表供后面配置策略路由使用。

[root]#cat /etc/iproute2/rt_tables
#
#reserved values
#
255	local
254	main
253	default
0	unspec
#
#local
#
#1	inr.ruhep
1	net_134
2	net_135

新增的两个路由表 table_id 为 1 和 2,名称为 net_134 和 net_135。

2、策略路由

所谓策略路由,即通过匹配策略规则进行路由转发,Linux 系统默认会生成如下三条路由策略:

[root]#ip rule show
0:	from all lookup local
32766:	from all lookup main
32767:	from all lookup default

路由策略可以分为三个部分:

  • 优先级:即上面的0,32766,32767,数字越小优先级越高。
  • 条件:即上面的from all,意思为来自所有 IP 地址
  • 动作:即上面的lookup main,意思为查找 main 路由表


其匹配规则为,根据优先级从高到低依次遍历,直到找出数据包的下一跳路由。

此处我们新增两条策略供两个网卡单独使用:

ip rule add from 172.21.135.7 table net_135
ip rule add from 172.21.134.84 table net_134

其中 net_135 和 net134 即为上面新建的两张路由表,再次查看路由策略,数量由 3 条变为 5 条,如不特殊指定优先级,则策略优先级默认由 32766 开始递减。

[root]#ip rule show
0:	from all lookup local
32764:	from 172.21.134.84 lookup net_134
32765:	from 172.21.135.7 lookup net_135
32766:	from all lookup main
32767:	from all lookup default

虽然我们新增了两个路由表,但目前路由表仍为空,我们还需要在路由表中按需添加路由,以便策略路由可以真正生效。此场景下我们对两张网卡都添加默认路由:

ip route add default via 172.21.134.1 dev eth0 table net_134
ip route add default via 172.21.135.1 dev eth1 table net_135

添加完成后可在路由表中看到到相关条目:

[root]#ip route show table 1(注:此处使用了路由表的 table_id,和路由表名称等价)
default via 172.21.134.1 dev eth0


[root]#ip route show table 2
default via 172.21.135.1 dev eth1

此时访问网卡 eth0 的数据包回包会匹配到路由策略 32764,路由下一跳为 172.21.134.1,数据包从网卡 eth0 发出;访问网卡 eth1 的数据包回包会匹配到路由策略 32765,路由下一跳为 172.21.135.1,数据包从网卡 eth1 发出,从而实现双网卡同时与外界通信。

原文链接:,转发请注明来源!