基于OpenWRT的多运营商策略路由探讨

发布于 / 网络 / 0 条评论

在校期间,博主发现多运营商策略路由的上网方式,在体验上明显好于单运营商,单出口的网络。经过长时间观察,博主发现,对于电信/联通/移动的目标地址会通过对应的互联网出口访问,对于非三大运营商的目标地址,则根据具体的规则及负载情况,选择某一个互联网出口。

本文基于Openwrt系统,使用 负载均衡MWAN3分流助手 两款插件实现多运营商负载均衡

本文特色:使用SoftEtherVPN实现非中国大陆目的地址的策略路由

最终实现策略:

非大陆IPV4地址/GFW列表–>SE-VPN出口

电信地址–>电信出口

移动地址–>移动出口

默认路由–>电信出口

0.基本情况

0.1硬件

i5-1135G7六口软路由(六口2.5GE)

0.2系统/软件

VMware ESXi 8.0U2

OpenWrt R23.7.7 GDQ V2[2023] Compiled by eSir

0.3运营商接入

电信、移动

0.4软路由接口情况

WAN:移动物理接口,桥接,PPPOE拨号

WAN2:电信物理接口,桥接,PPPOE拨号

0.5额外的地址表

非中国大陆IPV4地址:

点击此处下载

本地址表为博主聚合每个国家/地区的ipv4地址整理所得

1.配置负载均衡插件

在OpenWRT系统中找到 网络-负载均衡 进行配置

1.1配置MWAN – 接口

MWAN 支持最多 252 个物理或逻辑接口。
MWAN 要求所有接口必须在 /etc/config/network 中设定唯一的网关跃点。
名称必须与 /etc/config/network 中的接口名称匹配。
名称允许包括 A-Z、a-z、0-9、_ 但是不能有空格。
接口不应该与成员、策略、规则中的任意一个设置项使用相同的名称

网络-接口 中,将WAN的跃点数设为10,WAN2保持默认

网络-负载均衡-接口 中,添加wan wan2两个接口

uci show network | grep 'interface'

由上图可知,,接口名称均为小写。

在接口配置中,设置跟踪的主机或IP地址,用于检测链路是否在线

按上述方式配置好wan wan2 两个接口,最终效果如下图

1.2配置MWAN – 成员

“成员”用来设置每一个 MWAN 接口的跃点数(即接口优先级)和所占比重。
名称允许包括 A-Z、 a-、0-9、_ 但是不能有空格。
成员不应该与接口、策略、规则中的任意一个设置项使用相同的名称

最终配置结果如下所示

此次配置中,对 wan 和 wan2口各配置了3个成员,vpn0则仅配置了1个成员,相同接口的3个成员之间仅存在跃点数(即接口优先级)的区别,其它方面均无差别,对应三种路由策略,即:

仅走wan口(只走移动出口)

仅走wan2口(只走电信口)

仅走vpn0口(只走SE-VPN出口)

具体策略配置思路将在本文1.3节详细说明,vpn0接口的前期配置则在本文的 进阶 部分展示

1.3配置MWAN – 策略

“策略”把成员进行分组,告诉 MWAN 如何分配“规则”中使用这一策略的流量
拥有较低跃点数的成员将会被优先使用。拥有相同跃点数的成员把流量进行负载均衡。
进行负载均衡的成员之间拥有较高比重的成员将会被分配到更多流量。
名称允许包括A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内
策略不应该与接口、成员、规则中的任意一个设置项使用相同的名称

本次配置使用到的策略为 vpn0_only wan_only wan2_only 分别代表 仅走隧道仅走移动仅走电信 三种策略,具体配置情况如下

为保证网络稳定,vpn0_only 中分配了三个成员,先后依次为 vpn0_m1_w1wan_m2_w1wan2_m3_w1 ,三个成员之间存在备用

所表示的含义:

1.在vpn0接口在线时,使用成员vpn0_m1_w1(vpn0接口,跃点为1),走vpn0(隧道)出口

2.在vpn0接口离线时,使用成员wan_m2_w1(wan接口,跃点为2),走wan(移动)出口

3.在vpn0接口离线,且wan接口也离线的情况下,使用成员wan2_m3_w1(wan2接口,跃点为3),走wan2(电信)出口

为保证网络稳定,wan_only 中分配了两个成员,先后以此分别为 wan_m1_w1 wan2_m2_w1 ,即优先走wan出口(移动),wan离线的情况下走wan2(电信)出口

同理,wan2_only 中分配了两个成员,不再赘述

备用成员选择 不可达(拒绝),见下图

上图所示的 balanced 策略,配置正确的情况下,可用于 多拨/多线带宽叠加 等场景,暂不在本文的讨论范围内。

1.4配置MWAN – 规则

规则用于指定哪些流量将使用特定的 MWAN 策略
规则可基于 IP 地址,端口或协议
每条流量至上而下进行匹配
如果匹配中了某条规则,则其下方的规则将被忽略
不符合任何规则的流量将使用主路由表进行路由
目的地为已知(非默认)网络的流量由主路由表处理
如果流量符合某条规则,但该规则所使用的策略中的所有 WAN 接口都离线,则该流量会被丢弃
名称可包含字符 A-Z,a-z,0-9,_ ,但不能有空格
规则不能与接口、成员或策略重名

1.4.1配置前准备

在配置规则前,先打开 服务-MWAN3分流助手-IPSet列表 查看现有的路由表数据,如下图

该列表所在绝对路径为 /rom/usr/lib/lua/luci/model/cbi/mwan3helper/list.lua ,可根据需要自行修改,其中,中国电信的ipsets名称为 ct,中国移动的ipsets名称为cmcc

其中,非中国大陆ISP部分PT-Tracker地址 为博主后期添加

/etc/init.d/mwan3helper 文件末尾可看到如下内容

该部分定义了 ipsets 名称与对应地址表的关系,例如ct对应的地址表为 /etc/mwan3helper/chinatelecom.txt ,该部分内容可配合地址表一起,根据实际需要进行修改,最后两行内容为博主后期添加

地址表实际内容为一堆聚合后的ipv4地址,如下图

1.4.2开始配置路由规则

理清ipsets与地址表对应的关系后,可以开始配置路由规则

本文将介绍下图标号的10个规则

①指定的源地址(内网地址/网段)使用 wan2_only 策略,电信出口在线时,优先走电信出口,具体配置页面如下

填入源地址(支持CRDR记法),协议选择all,分配策略为 wan2_only

②与①同理,不再赘述,指定的源地址,移动出口在线时,优先走移动出口

③指定某个目的地址,协议选择 all,移动出口在线时,优先走移动出口

此策略原为vpn0接口做准备,该地址为AWS首尔一台vps的地址,考虑到移动在亚太地区有丰富的跨境互联资源,故通过移动连接隧道。该策略已弃用,现在博主通过移动ipv6接入隧道,获得了更稳定的跨境互联体验

④与③同理,不再赘述

⑤⑥⑦为vpn0接口的策略

其中,⑤的配置信息如下

参考 1.4.1节 将非中国大陆地址的 IPSet 配置为 glb,此处填入 IPSetglb,协议选择 icmp ,分配策略为 vpn0_only,在 vpn0 接口在线时,非中国大陆目的地址icmp 协议优先走 vpn0 接口

⑥将非大陆ipv4地址的22,53,80,443,8080,3389UDP端口访问请求优先转发到vpn0接口,配置如下

考虑到境外vps一般采用流量包方式售卖,故仅将此类常见端口的流量发往隧道,以节约vps流量

⑦同理,将此类端口的TCP流量优先转发到vpn0接口

注意:经博主测试,如直接将协议选择为 all,则目标端口的配置将不起作用,即所有非大陆地址的流量均会被优先转发到 vpn0 接口,因此博主将vpn0策略分成了icmp,tcp,udp三项进行实现

⑧为电信地址的路由策略,优先走电信出口,具体配置信息如下

IPset为ct,分配的策略为wan2_only

⑨与⑧相似,为移动地址的路由策略,优先走移动出口,不再赘述

⑩为默认路由,优先走电信出口,配置如下

策略路由的配置阶段到此结束

2.进阶

2.1SoftEther服务端的搭建与简单配置

参考以下文章

SoftEther VPN Server安装配置教程 – Linux – Clemon`s Blog (cyanlemon.net)

2.2SoftEther客户端的配置与使用

博主使用的OpenWRT系统中,已经自带全套SE-VPN服务,包含客户端与服务端,客户端配置如下

2.2.1设置开机启动

系统-启动项 中,使用 Ctrl+F 搜索softethervpnclientsoftethervpn,确保两个组件为启用状态(Enable),如下图

下面进入OpenWRT的ssh命令行开始客户端配置

下面是SE-VPN-Client的帮助菜单,供读者参考

VPN Client>?
您可以使用下面的 66 命令:
 About                    - 显示版本信息
 AccountAnonymousSet      - 设定连接设置的用户认证种类为匿名认证
 AccountCertGet           - 获取用于连接设置的客户端证书
 AccountCertSet           - 设置连接设置的用户认证类型为用户证书认证
 AccountCompressDisable   - 禁用连接设置进行通信时的数据压缩
 AccountCompressEnable    - 启用连接设置进行通信时的数据压缩
 AccountConnect           - 使用连接设置,开始连接 VPN Server
 AccountCreate            - 创建新的连接设置
 AccountDelete            - 删除连接设置
 AccountDetailSet         - 设置接续设置的高级通信设置
 AccountDisconnect        - 断开连接中的连接设置
 AccountEncryptDisable    - 禁用连接设置进行通信时的加密
 AccountEncryptEnable     - 启用连接设置进行通信的加密
 AccountExport            - 导出连接设置
 AccountGet               - 取得连接设置的设置
 AccountImport            - 导入连接设置
 AccountList              - 获取连接设置列表
 AccountNicSet            - 设置连接设置时使用的虚拟 LAN 卡
 AccountPasswordSet       - 设定连接设置的用户证类型为密码认证
 AccountProxyHttp         - 将连接设置的连接方法设置为通过 HTTP 代理服务器连接
 AccountProxyNone         - 将连接设置的连接方法直接设置为 TCP/IP 连接
 AccountProxySocks        - 将连接设置的连接方法设置为通过 SOCKS 代理服务器连接
 AccountRename            - 更改连接设置名称
 AccountRetrySet          - 设置连接设置的连接失败或断开时建立重新连接的次数和间隔
 AccountSecureCertSet     - 将连接设置的用户认证类型设置为智能卡认证
 AccountServerCertDelete  - 删除连接设置的服务器固有证书
 AccountServerCertDisable - 禁用连接设置服务器证书验证选项
 AccountServerCertEnable  - 启用连接设置服务器证书验证选项
 AccountServerCertGet     - 获取连接设置的服务器固有证明书
 AccountServerCertSet     - 设置连接设置的服务器固有证明书
 AccountSet               - 设定连接设置连接终端
 AccountStartupRemove     - 解除连接设置的启动连接
 AccountStartupSet        - 设定连接设置的启动连接
 AccountStatusGet         - 获取当前连接设置的状态
 AccountStatusHide        - 设置成在连接到 VPN Server 时不显示连接状态和错误的画面
 AccountStatusShow        - 设置成在连接到 VPN Server 时显示连接状态和错误的画面
 AccountUsernameSet       - 设置用于连接的连接设置的用户名
 CertAdd                  - 添加信任的证明机构的证书
 CertDelete               - 删除信任的证明机构的证书
 CertGet                  - 获得新任的证明机构的证书
 CertList                 - 获取信任的证明机构的证书列表
 Check                    - 检测 SoftEther VPN 是否能正常运行
 KeepDisable              - 禁用保持互联网连接功能
 KeepEnable               - 启动 Internet 保持连接功能
 KeepGet                  - 获取保持互联网连接的功能
 KeepSet                  - 设置 Internet 保持连接功能
 MakeCert                 - 创建新的 X.509 证书和密钥 (1024 位)
 MakeCert2048             - 创建新的 X.509 证书和密钥 (2048 位)
 NicCreate                - 新的虚拟 LAN 卡的创建
 NicDelete                - 删除虚拟 LAN 卡
 NicDisable               - 禁用虚拟 LAN 卡
 NicEnable                - 启用虚拟 LAN 卡
 NicGetSetting            - 获取虚拟 LAN 卡的设置
 NicList                  - 获取虚拟 LAN 卡列表
 NicSetSetting            - 更改虚拟 LAN 卡设置
 NicUpgrade               - 升级虚拟 LAN 卡设备驱动
 PasswordGet              - 获取为连接到 VPN 客户服务的密码的设定
 PasswordSet              - 为连接到 VPN 客户服务的密码的设定
 RemoteDisable            - 禁止 VPN 客户服务的远程管理
 RemoteEnable             - 允许 VPN 客户服务的远程管理
 SecureGet                - 获取使用的智能卡种类的 ID
 SecureList               - 获取可用的智能卡种类列表
 SecureSelect             - 选择要使用的智能卡种类
 TrafficClient            - 在用户模式下,运行网络流量速度测试工具
 TrafficServer            - 在服务器模式下,运行网络流量速度测试工具
 VersionGet               - 获取 VPN 客户服务的版本信息

参考每个命令的使用,输入 "命令名称 ?" 来查看帮助。
命令成功完成。

开始配置SE-VPN-Client

root@OpenWrt:~# vpncmd
vpncmd command - SoftEther VPN Command Line Management Utility Developer Edition
SoftEther VPN Command Line Management Utility (vpncmd command)
Developer Edition
Version 5.01 Build 9674   (English)
Compiled 2023/03/24 14:28:07 by esir at compile
Copyright (c) all contributors on SoftEther VPN project in GitHub.
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
All rights reserved.

By using vpncmd program, the following can be achieved. 

1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 2(选择2,进入SE-VPN-Client配置)

Specify the host name or IP address of the computer that the destination VPN Client is operating on. 
If nothing is input and Enter is pressed, connection will be made to localhost (this computer).
Hostname of IP Address of Destination: (此处直接回车,连接到localhost)

Connected to VPN Client "localhost".

VPN Client>AccountCreate
AccountCreate command - Create New VPN Connection Setting
Name of VPN Connection Setting: vpn-test(连接名,随便填)

Destination VPN Server Host Name and Port Number: 1.2.4.8:5555(服务器IP:端口号)

Destination Virtual Hub Name: VPN(Virtual Hub Name,与服务端一致,默认为VPN)

Connecting User Name: test(用户名,与服务端一致)

Used Virtual Network Adapter Name: vpnse0(随便填)

The command completed successfully.

VPN Client>AccountPasswordSet(设置连接的密码,与服务端配置一致)
AccountPasswordSet command - Set User Authentication Type of VPN Connection Setting to Password Authentication
Name of VPN Connection Setting: vpn-test(连接名,见上文设置)

Please enter the password. To cancel press the Ctrl+D key.

Password: ***********(密码,与服务端一致)
Confirm input: ***********(确认密码,与密码一致)


Specify standard or radius: standard(一般使用standard即可,与服务端配置一致)

The command completed successfully.

VPN Client>AccountConnect vpn-test(连接名,与上文一致)
AccountConnect command — Start Connection to VPN Server using VPN Connection Setting The command completed successfully.

至此,VPN连接成功

小提示:可以使用 AccountStartupSet 配置自动连接功能,每次软路由重启后均能自动连接

2.3OpenWRT虚拟接口配置

博主使用的OpenWRT已经配置好了vpn0接口,仅需简单配置即可使用,其中,网卡协议选择DHCP,在物理设置中,将接口选择为sevpn-client创建的适配器,如下图

点击保存,连接后,即可获取IP地址,连接成功,如下图

接下来按照本文1.1-1.4节的配置即可

对于想要手动创建vpn0接口的读者,下面贴一张防火墙配置图,供参考

最后,在 服务-MWAN3分流助手 中,启动GFWList即可

3.最终效果

3.1默认路由/电信地址:

3.2移动地址:

3.3非中国大陆地址/GFW列表:

3.4境外测速:

4.存在的问题

负载均衡与IPV6冲突

/lib/mwan3/mwan3.sh 当中的

IPT6=”/usr/sbin/ip6tables -t mangle -w”

注释掉

Not Comment Found