背景

最近在负责北大物院的一个服务器的维护,提供了公网访问,但由于CERNET高额的流量费(¥0.5/MB),某天不知道哪个系统部件突然跑了1G流量,直接就欠费了。于是我给服务器又加上了一个网卡,连到学工办的一个路由器上。但测试发现使用默认配置时,只能使用一张网卡,而且每次重启后主网卡都不一样。。。玄学_(:з」∠)_

解决方案

服务器对应网络信息如下:

网卡IP网关备注
p4p1192.168.1.x192.168.1.1直连学工办路由器,流量不收费
p8p1162.105.145.22162.105.145.1公网IP,v4流量巨贵

下面来实现需求,即:

  1. 两网卡可同时访问,即 p4p1 网卡IP可在局域网内访问,p8p1网卡IP在校园网防火墙内可访问。
  2. 服务器对于校内地址默认走 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:ledep8p1: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

测试配置结果

执行完上述命令后,重启网络。

  1. 测试从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
  2. 测试从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
  3. 测试默认路由

    $ ip route get 114.114.114.114
    114.114.114.114 via 192.168.1.1 dev p4p1 src 192.168.1.x
     cache
  4. 测试校内路由

    $ ip route get 162.105.129.65
    162.105.129.65 via 162.105.145.1 dev p8p1 src 162.105.145.22 
     cache
最后修改:2021 年 02 月 10 日
如果觉得我的文章对你有用,请随意赞赏