比较典型的一种场景:一台 Linux 服务器上有三个网口并接入三个不同运营商的网络,以实现不同运营商用户访问其对应的网络线路,来减少网络延时。
服务器及对应网络信息如下:
一台 Ubuntu 16.04 server,这里一共使用三块网卡。假定网络信息如下:
网卡名称
IP
网关
备注
enp0s5
192.168.100.212
192.168.100.1
电信线路
enp0s6
192.168.110.213
192.168.110.1
联通线路
enp0s7
192.168.120.214
192.168.120.1
教育网线路
这里 IP 只是为了区分各运营商线路做的示例,实际情况请以运营商给出的网络信息调整。
下面我们来看如何实现这样的需求:
在 Linux 下一台多网卡服务器不能同时配置两个及以上的默认网关,因为默认网关(Default Gateway)只能配置一个,通过 gateway 参数配置的网关在这里实际为默认路由。
这里通过配置 Linux 下策略路由来实现,通过原线路返回的策略路由可以实现多线多 IP 同时在线。让从同一运营商过来的请求由原运营商线路返回,比如:电信IP过来的请求按照电信路由返回,从网通IP过来的求从网通路由返回。
配置网络
首先配置三块网卡的基本网络信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
$ vim /etc/network/interfaces
auto enp0s5 iface enp0s5 inet static address 192.168.100.212 netmask 255.255.255.0
auto enp0s6 iface enp0s6 inet static address 192.168.110.213 netmask 255.255.255.0
auto enp0s7 iface enp0s7 inet static address 192.168.120.214 netmask 255.255.255.0
重启网络
1
$ /etc/init.d/networking restart
查看配置好的网络情况
1 2 3 4 5 6 7
$ ip a|grep enp0s 2: enp0s5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.100.212/24 brd 192.168.100.255 scope global enp0s5 3: enp0s6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.110.213/24 brd 192.168.110.255 scope global enp0s6 4: enp0s7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.120.214/24 brd 192.168.120.255 scope global enp0s7
查看各网卡当前路由
1 2 3 4
$ ip route show 192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212 192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213 192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214
增加路由表
Linux 中的路由由路由规则和路由表组成。路由规则指定当数据包满足规则时,应转交到哪个路由表;路由表根据数据包的信息,选择下一跳。
可通过 ip rule 看当前的路由策略,如:
1 2 3 4
$ ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
从这里也可以看出在内核中最多支持 32768 条路由规则。这里的 main 表是系统主要的路由表,所有的路由规则都写在这个表中。
查看 main 表
1 2 3 4
$ ip route list table main 192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212 192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213 192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214
Linux 中支持 256 张路由表,编号为 0 到 255,可直接使用编号操作,也可使用编号的别名操作,编号和其别名的对应关系在 /etc/iproute2/rt_tables 文件中。
$ ip route add default via 192.168.100.1 dev enp0s5 table ChinaTel $ ip route add default via 192.168.110.1 dev enp0s6 table ChinaCnc $ ip route add default via 192.168.120.1 dev enp0s7 table ChinaEdu
如果要指定某一源 IP,可以加上 src 参数。
1
$ ip route add default via 192.168.100.1 dev eth0 src 192.168.100.212 table ChinaTel
查看新增路由表中内容
1 2 3 4 5 6 7 8
$ ip route show table ChinaTel default via 192.168.100.1 dev enp0s5
$ ip route show table ChinaCnc default via 192.168.110.1 dev enp0s6
$ ip route show table ChinaEdu default via 192.168.120.1 dev enp0s7
增加路由原路返回规则,使来自不同的口的走不同的路由表。
1 2 3
$ ip rule add from 192.168.100.212 table ChinaTel $ ip rule add from 192.168.110.212 table ChinaCnc $ ip rule add from 192.168.120.212 table ChinaEdu
$ ip rule add from 192.168.100.212/32 table ChinaTel pref 100
查看新增的路由规则
1 2 3 4 5 6 7
$ ip rule 0: from all lookup local 32763: from 192.168.120.212 lookup ChinaEdu 32764: from 192.168.110.212 lookup ChinaCnc 32765: from 192.168.100.212 lookup ChinaTel 32766: from all lookup main 32767: from all lookup default
$ ip route add default via 192.168.100.1 dev enp0s5 $ ip route show table main default via 192.168.100.1 dev enp0s5 192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212 192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213 192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214
ip route flush table ChinaTel ip route add default via 192.168.100.1 dev enp0s5 table ChinaTel ip rule add from 192.168.100.212 table ChinaTel ip route flush table ChinaCnc ip route add default via 192.168.110.1 dev enp0s6 table ChinaCnc ip rule add from 192.168.110.212 table ChinaCnc ip route flush table ChinaEdu ip route add default via 192.168.120.1 dev enp0s7 table ChinaEdu ip rule add from 192.168.120.212 table ChinaEdu exit 0
退出并重启网络测试是否生效
1
$ /etc/init.d/networking restart
场景二 给指定网段分别设置网关
这种方法使用的是默认路由表,增加到指定网段的路由。
使用 route 指令
1 2 3
$ route add -net 192.168.100.0/24 gw 192.168.100.1 dev enp0s5 $ route add -net 192.168.110.0/24 gw 192.168.110.1 dev enp0s6 $ route add -net 192.168.120.0/24 gw 192.168.120.1 dev enp0s7
参数说明
-net 设置到某个网段的路由
-host 设置到某台主机的路由
gw 出口网关 IP地址
dev 出口网关 物理设备名
使用 ip 指令
1 2 3 4 5 6 7 8
# 推荐使用 replace 指令 $ ip route replace 192.168.100.0/24 via 192.168.100.1 dev enp0s5 onlink $ ip route replace 192.168.110.0/24 via 192.168.110.1 dev enp0s6 onlink $ ip route replace 192.168.120.0/24 via 192.168.120.1 dev enp0s7 onlink
# 直接使用 add 指令,会报 RTNETLINK answers: File exists 错。如果要使用 add 指令,可先删除原默认的路由规则后再增加。 $ ip route del 192.168.100.0/24 $ ip route add 192.168.100.0/24 via 192.168.100.1 dev enp0s5 onlink
注意:一块网卡只能设置一个网关,多个网关会发生冲突而无法成功配置。
如需增加默认路由,可使用以下指令:
使用 route 指令
1
$ route add default gw 192.168.100.1 dev enp0s5
使用 ip 指令
1
$ ip route add default via 192.168.100.1 dev enp0s5
如有多余的配置,可使用下面的命令进行删除路由。
使用 route 指令
1 2 3 4 5
$ route del -net 192.168.100.0/24 gw 192.168.100.1