场景一
其中一张网卡只需要与特定网段通信,此种情况下可以针对需要通信的特定网段配置明细路由,并在路由条目中指定通信的网卡。
我们假设服务器的网卡为 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 发出,从而实现双网卡同时与外界通信。