OpenWrt下的策略路由
拥有两条宽带后最大的问题便是如何合理的利用好两条宽带,例如下载的时候通过两条宽带一起下载,游戏走稳定的线路等等。目前电信宽带给的是300mbps/30mbps的带宽,华数联通给的则是100mbps/100mbps的带宽,目前仅配置了metric权重,所有默认路由都是从电信走的,而有台机器正好有高速上传的需求,因此需要配置一个策略让这台指定的机器从华数联通的宽带走。
路由与规则
作为前置知识,应该知道网络设备(泛指能够进行网络的通信的设备,例如PC,路由器,网关等等)是通过查找路由表并进行最长匹配决定如何转发一个数据包的。一般情况下可以通过ip route
命令查看本机的路由表。典型的一个结果如下,可以看到本机有两个不同权重的默认路由,另外还有一些针对内网特定网段的静态路由。而事实上,Linux拥有多张路由表,默认操作与查看的均是main表(其ID为254),其他还有prelocal(128),default(253),local(255),其中local表用于保存本机接口的直连路由。
1 |
ip route |
那既然Linux拥有这么多路由表,那么究竟是哪一张表在起作用呢?这就要引出规则的概念,通过ip rule
命令可以查看本机的路由表规则,默认的规则应该如下。这个结果应该非常容易看懂,最前面的数字代表规则的优先级,本机的所有数据包转发均依次匹配local、main、default三张路由表。
1 |
ip rule |
实现
现在在整理一下路由表和规则的概念:路由表负责匹配路由,而规则决定使用哪张路由表。我们很容易产生一个思路来实现我们的目标:新建一个路由表,这个路由表的默认路由从华数联通走,并新建一个规则,对于我们需要的指定主机让他使用这个路由表进行匹配。OpenWrt 22.03
的LuCI界面已经实现了这两个功能。
现在在那台指定的主机上测试外网IP应该可以看到已经变为华数联通的IP,这证明我们的策略路由配置成功了,但是也随之而来一个问题,这台主机无法访问main路由表中的那些内网静态路由条目,因为针对刚刚配置的路由规则,这台指定的主机使用的是我们刚刚新建的ID为4837的路由表,而这个路由表中没有那些针对内网的静态路由。最简单的实现办法便是在4837路由表中在添加一遍main路由表中的项目,但是这样也太不优雅了。有没有什么办法可以融合main路由表和4837路由表呢,例如让4837表继承main路由表的项目,或是匹配4837表的默认路由其他路由使用main表。
这里需要使用一个“前缀抑制”功能,目标是使该规则不匹配指定路由表中的指定前缀。在刚刚新建的规则之前,再新建一个规则,让指定的主机先匹配mian路由表,然后设置前缀抑制为0,那么其意思就是不匹配main表中默认路由,但是匹配其他路由条目,若这些路由条目都没有匹配中,那么则命中下一条规则,即匹配4837表。
现在已经达成了目标,这台主机可以正常内网互通,且使用华数联通的出口。下一步可以考虑使用mwan3进一步利用多条宽带。