OpenWrt下的策略路由

  拥有两条宽带后最大的问题便是如何合理的利用好两条宽带,例如下载的时候通过两条宽带一起下载,游戏走稳定的线路等等。目前电信宽带给的是300mbps/30mbps的带宽,华数联通给的则是100mbps/100mbps的带宽,目前仅配置了metric权重,所有默认路由都是从电信走的,而有台机器正好有高速上传的需求,因此需要配置一个策略让这台指定的机器从华数联通的宽带走。

路由与规则

  作为前置知识,应该知道网络设备(泛指能够进行网络的通信的设备,例如PC,路由器,网关等等)是通过查找路由表并进行最长匹配决定如何转发一个数据包的。一般情况下可以通过ip route命令查看本机的路由表。典型的一个结果如下,可以看到本机有两个不同权重的默认路由,另外还有一些针对内网特定网段的静态路由。而事实上,Linux拥有多张路由表,默认操作与查看的均是main表(其ID为254),其他还有prelocal(128),default(253),local(255),其中local表用于保存本机接口的直连路由。

1
2
3
4
5
6
7
8
9
10
11
12
13
# ip route
default via 125.120.136.1 dev pppoe-ctcc proto static
default via 218.108.255.54 dev pppoe-wan proto static metric 10
192.168.7.0/24 via 192.168.76.8 dev wireguard proto static
192.168.8.0/24 via 192.168.76.8 dev wireguard proto static
192.168.9.0/24 dev br-lan.1 proto kernel scope link src 192.168.9.254
192.168.10.0/24 via 192.168.76.8 dev wireguard proto static
192.168.15.0/24 via 192.168.76.8 dev wireguard proto static
192.168.16.0/24 via 192.168.76.8 dev wireguard proto static
192.168.28.0/24 dev zt7nnitens proto kernel scope link src 192.168.28.9
192.168.76.0/27 dev wireguard proto kernel scope link src 192.168.76.9
192.168.96.0/24 dev br-lan.96 proto kernel scope link src 192.168.96.254
192.168.98.0/24 dev br-lan.98 proto kernel scope link src 192.168.98.254

  那既然Linux拥有这么多路由表,那么究竟是哪一张表在起作用呢?这就要引出规则的概念,通过ip rule命令可以查看本机的路由表规则,默认的规则应该如下。这个结果应该非常容易看懂,最前面的数字代表规则的优先级,本机的所有数据包转发均依次匹配local、main、default三张路由表。

1
2
3
4
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

实现

  现在在整理一下路由表和规则的概念:路由表负责匹配路由,而规则决定使用哪张路由表。我们很容易产生一个思路来实现我们的目标:新建一个路由表,这个路由表的默认路由从华数联通走,并新建一个规则,对于我们需要的指定主机让他使用这个路由表进行匹配。OpenWrt 22.03的LuCI界面已经实现了这两个功能。

  现在在那台指定的主机上测试外网IP应该可以看到已经变为华数联通的IP,这证明我们的策略路由配置成功了,但是也随之而来一个问题,这台主机无法访问main路由表中的那些内网静态路由条目,因为针对刚刚配置的路由规则,这台指定的主机使用的是我们刚刚新建的ID为4837的路由表,而这个路由表中没有那些针对内网的静态路由。最简单的实现办法便是在4837路由表中在添加一遍main路由表中的项目,但是这样也太不优雅了。有没有什么办法可以融合main路由表和4837路由表呢,例如让4837表继承main路由表的项目,或是匹配4837表的默认路由其他路由使用main表。

  这里需要使用一个“前缀抑制”功能,目标是使该规则不匹配指定路由表中的指定前缀。在刚刚新建的规则之前,再新建一个规则,让指定的主机先匹配mian路由表,然后设置前缀抑制为0,那么其意思就是不匹配main表中默认路由,但是匹配其他路由条目,若这些路由条目都没有匹配中,那么则命中下一条规则,即匹配4837表。

  现在已经达成了目标,这台主机可以正常内网互通,且使用华数联通的出口。下一步可以考虑使用mwan3进一步利用多条宽带。