背景
最近在负责北大物院的一个服务器的维护,提供了公网访问,但由于CERNET高额的流量费(¥0.5/MB),某天不知道哪个系统部件突然跑了1G流量,直接就欠费了。于是我给服务器又加上了一个网卡,连到学工办的一个路由器上。但测试发现使用默认配置时,只能使用一张网卡,而且每次重启后主网卡都不一样。。。玄学_(:з」∠)_
解决方案
服务器对应网络信息如下:
网卡 | IP | 网关 | 备注 |
---|---|---|---|
p4p1 | 192.168.1.x | 192.168.1.1 | 直连学工办路由器,流量不收费 |
p8p1 | 162.105.145.22 | 162.105.145.1 | 公网IP,v4流量巨贵 |
下面来实现需求,即:
- 两网卡可同时访问,即 p4p1 网卡IP可在局域网内访问,p8p1网卡IP在校园网防火墙内可访问。
- 服务器对于校内地址默认走 p8p1 网卡,对于其他地址默认走 p4p1 网卡,以减少收费地址流量损耗。
配置网络
首先修改两块网卡的配置信息,由于服务器是 Centos 系统,网卡信息在 /etc/sysconfig/network-scripts/
文件夹下,将两网卡的配置信息中的 DEFROUTE=yes
全都改为 DEFROUTE=no
如果你是在本机上操作,或者有VNC之类的,执行命令
service network restart
重启网络后,利用命令
ip route show
可以查看到当前的路由表为
162.105.145.0/24 dev p8p1 proto kernel scope link src 162.105.145.22 metric 100
192.168.1.0/24 dev p4p1 proto kernel scope link src 192.168.1.110 metric 101
增加路由表
Linux 中的路由由路由规则和路由表组成。路由规则指定当数据包满足规则时,应转交到哪个路由表;路由表根据数据包的信息,选择下一跳。
可通过 ip rule
看当前的路由策略,如:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
可以看出内核最多支持 32768条路由规则。
Linux 中支持 256 张路由表,编号为 0 到 255,可直接使用编号操作,也可使用编号的别名操作,编号和其别名的对应关系在 /etc/iproute2/rt_tables 文件中。
默认有 local,main,default
三个路由表,这三个路由表的名称命名就来自 /etc/iproute2/rt_tables
。
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
#252 table252
#251 table251
#102 edu
#101 lede
在 /etc/iproute2/rt_tables
配置文件里面添加两个不同的路由表别名。增加三个路由表分别是: p4p1:lede
、p8p1:edu
。
$ echo "102 edu" >> /etc/iproute2/rt_tables
$ echo "101 lede" >> /etc/iproute2/rt_tables
因为这两个路由表的只是用来响应来自不同接口的,所以只需要每个路由表里面建立默认网关即可。
$ ip route add default via 192.168.1.1 dev p4p1 table lede
$ ip route add default via 162.105.145.1 dev p8p1 table edu
查看新增路由表中内容
$ ip route show table lede
default via 192.168.1.1 dev p4p1
$ ip route show table edu
default via 162.105.145.1 dev p8p1
增加路由规则
增加路由原路返回规则,使来自不同的口的走不同的路由表。
$ ip rule add from 192.168.1.x table lede
$ ip rule add from 162.105.145.22 table edu
查看新增的路由规则
$ ip rule
0: from all lookup local
32764: from 162.105.145.22 lookup edu
32765: from 192.168.1.x lookup lede
32766: from all lookup main
32767: from all lookup default
至此访问两个网段中的任意一个地址都能够连通了。即便是服务器上本身的默认路由都没有设置,也能够让外面的用户正常访问。
增加路由
由于我们仍需要服务器访问外部的网站,例如获取应用更新等,于是先增加一个默认路由,走 p4p1 网卡:
ip route add default via 192.168.1.1 dev p4p1
而我们还需要访问校内地址时使用 p8p1 网卡,所以增加一个路由
ip route add 162.105.0.0/16 via 162.105.145.1 dev p8p1
测试配置结果
执行完上述命令后,重启网络。
测试从p4p1的包的路由选择
$ ip route get 114.114.114.114 from 192.168.1.x 114.114.114.114 from 192.168.1.x via 192.168.1.1 dev p4p1 cache
测试从p8p1的包的路由选择
$ ip route get 114.114.114.114 from 162.105.145.22 114.114.114.114 from 162.105.145.22 via 162.105.145.1 dev p8p1 cache
测试默认路由
$ ip route get 114.114.114.114 114.114.114.114 via 192.168.1.1 dev p4p1 src 192.168.1.x cache
测试校内路由
$ ip route get 162.105.129.65 162.105.129.65 via 162.105.145.1 dev p8p1 src 162.105.145.22 cache