背景
这个学期学校好像调整了网速,之前原来有300M的网速现在只有100M了,而我买的固态硬盘又到了。
装上硬盘后我当然开始美滋滋地下游戏,看见网速只有12MB/s天都塌了,一个游戏要下3个小时,这谁受得了?
为了恢复往日荣光,开始琢磨单线多拨。😊
(由于原设备已经实现了,这里使用虚拟机进行演示)
设备要求
我们需要一台支持macvlan和mwan3的openwrt路由器
macvlan可以在一张网卡上创建多个虚拟网卡,从而使用一条网线获取多个ip地址。
mwan3用于负载均衡,可以将不同的连接分配到不同的出口,即上文的虚拟网卡
我用的是刷了QWRT的Xiaomi router WR30U,斐讯K2P可能也可以(但空间比较捉鸡)。
在下面的演示中,我使用x86平台的iStoreOS,操作过程是一样的。
刷机的过程有需要的话我会再出一篇文章。
配置环境
先从web登录到路由器管理页面,我们需要先安装两个软件,macvlan和mwan3。
在系统 -> 软件包中先点击更像列表来刷新可用软件包列表
如果出现错误或下载慢可以先换源,见opkg换源
然后再过滤器中输入macvlan,在下方"可用"选项卡中安装macvlan,我这里系统自带了,就不用安装了。
然后在过滤器中输入mwan3,我们需要安装mwan3,luci-app-mwan3(mwan3的网页配置工具),luci-i18n-mwan3-zh-cn(网页配置的中文包)。
我们可以直接安装luci-i18n-mwan3-zh-cn,剩下的两个会自动安装。

正式配置
添加虚拟网卡
转到网络 -> 接口 的 "设备"选项卡。
PS:部分系统可能没有该选项卡,可以通过ssh创建虚拟网卡,见通过ssh创建虚拟网卡,然后可以跳过“添加虚拟网卡”这一小节。
在左下角添加设备配置,然后按照下图配置新的设备。
注意:
mac地址可以通过随机MAC地址生成器获取。每个设备的mac都必须唯一,不可以重复。
设备名也不能重复。
其中基础设备是wan的物理设备,即网络 -> 接口,中红色的wan下面显示的设备,不一定是eth0。见查看出口物理设备
重复操作添加若干个虚拟网卡,建议3到5个。
配置接口
转到网络 -> 接口 ,左下角添加新接口,按照下图配置。
名称不可以重复,协议为dhcp客户端,设备为前面创建的设备。
点击创建接口,然后进入下一步配置,继续按照下图配置。
在使用网关度量值处(也叫网关跃点,metric)填入任意的值如,不同的接口不能重复 。
注意系统自带的wan接口也需要配置网关度量值,不要遗漏了
点击wan接口的配置按钮即可。
然后在防火墙配置中分配wan区域。
接着保存。反复操作,直到为每个虚拟网卡都添加了对应接口。
点击下面保存并应用,应该可以看见每个接口都能获取ip,如下图。
如果没有,建议寻求技术支持。

到这一步,我们已经成功了一大半,接下来只需要为每个接口登录校园网,然后配置负载均衡。
配置负载均衡
原理简述
转到网络 -> multiWAN 管理器(有时也叫做负载均衡)。可以看见若干个选项卡(如下图)。

先简述一下mwan3工作原理。
接口:是选择哪些接口可以被负载均衡使用。
成员:是被选择的基本单位,具有不同的权重和度量值。
策略:其中可以配置多个成员,被每个连接按照权重和度量值被分配给其中的成员,优先分配个低度量值的成员,相同度量值的成员按照权重分配。
规则:为不同的连接匹配不同的策略。
简单来说,对于每个连接,mwan3 根据它的源ip,端口,目标ip,端口等,为它匹配一个策略,然后根据策略中的成员的度量值和权重,将其分配到一个成员,然后发送到成员对应的接口。
接口配置
接下来开始配置
先在接口选项卡中删除全部接口,然后添加wan,以及上文配置接口添加的接口,名称需要与接口名称完全一致,然后按照下图配置。
PS:原则上不应该如此配置,原因见下文。这会导致每个接口都被始终认为为在线,因此当某些接口离线后,连接仍然会被发送到这些接口,这会导致一些问题。

重复操作,直到每个接口都被添加进去。
成员配置
转到成员选项卡,移除所有默认成员。然后添加成员,名字建议为接口名+m,如wanm,vwanm。
注意:成员名称不能与配置的接口、策略或规则相同
接口选之前的接口,度量值和权重随意,但是每个成员建议相同。
重复操作,直到每个接口都有对应的成员。
策略配置
转到策略选项卡,移除所有默认的策略。然后添加一个balanced策略,如下图配置。
在使用的成员处添加所有接口。
然后为每个成员添加only策略(这是为了后续登录用),建议名称为接口名+s,如wans,vwan0s。

规则配置
转到规则选项卡,无需移除默认规则。先将https规则的粘滞模式取消(或直接删除规则)。
粘滞模式会让一定时间内相同源ip的连接全部导向同一个出口,可以避免某些网站对于源ip变化的安全限制。但是同时会导致下载连接被导向同一出口,无法实现带宽叠加。
由于校园网环境同一账户的出口ip一般是相同的,所有这一项可以关闭,一般不会有问题。
随后添加一个login的规则,目标地址填写校园网的登录ip。策略选某个非balanced策略。
接着将其移动到第一位。
我们到时候通过这个规则为每个ip登录到校园网。
PS:这是十分麻烦的,我们应该通过脚本一键为每个接口登录,而不是通过用户手动登录。但是因为个人能力问题,无法在负载均衡的情况下编写出能够一键登录的脚本。所有只能出此下策。有能力的大佬可以自行解决。本人也会继续研究,如果有结果会及时更新文章。
完成后,点击下方保存并应用。
登录每个ip
接下来我们通过设置上文的login规则为不同的only策略,即wans, vwan0s, vwan1s 等。然后保存并应用,然后在校园网登录页面登录账户。
测速
完成后,可以使用Steam或其他多线程下载软件测试网速。(本人无法在speedtest.cn测试出正确网速,不知道为啥)。
本人可以达到60MB/s的网速,下载速度大大提升了,再也不用苦哈哈等一个上午也下不完了。
(虽然还是得等一会)

结语
其实在此之前我已经尝试过了许多次单线多拨,也尝试过爱快等各种支持多拨的路由器系统,但是都以失败告终。这些拨号环境都是以宽带拨号为主,缺少对校园网环境的支持,这次网速下调算是一个契机,让我下定了决心去做这个单线多拨。
其中我碰到的一个意外是没有为每个接口配置一个不同的网络跃点,导致一致无法成功,后来才发现这个提示就写在mwan3的提示里,我却没有发现,白白浪费了很多时间😭。
对于自动登录问题,mwan3似乎没有方法将流量分流到离线接口,所以只能将每个接口都认定为在线(不然在规则那里即便配置了单成员策略,也无法分流到离线接口)。这导致了上文提到的问题。
后来我打算通过curl的--interface参数来配置指定接口发送登录请求,然而出现了无法连接的问题(curl: (7) Failed to connect to www.baidu.com port 80 after 6208 ms: Could not connect to server),使用指定接口ping时也会出现收不到前4个包的情况。还会出现莫名出现对公网ip发出arp请求的情况。
这个问题困扰我到现在都没有解决,不过我后面在想想办法,到时候有成果了在更新文章😊
附录
查看出口物理设备
转到 网络 -> 接口,中红色的wan下面显示的设备,如下图黄色荧光笔区域。

opkg换源
转到 系统 -> 软件包,点击opkg配置,在发行版软件包,或/etc/opkg/distfeeds.conf的输入框中,将所有 http://downloads.openwrt.org或 https://downloads.openwrt.org的 URL 替换为 https://mirrors.tuna.tsinghua.edu.cn/openwrt
随后返回点击更新列表
通过ssh创建虚拟网卡
登录到路由器
按下Win + R 组合键,打开“运行”对话框,输入powershell,随后按下回车确认。
在打开的终端中,输入
ssh root@<ip>将<ip>替换为路由器的ip地址(包括尖括号)。
随后如果是首次连接会提醒确认指纹,输入yes后按下回车。

然后会提醒输入密码,输入后按下回车即可(输入密码时不会显示字符)
成功的话应该能看见终端提示符,如下图,不同系统显示可能不同。

添加设备
输入
vim /etc/config/network 在任意两个config之间插入下面的内容
config device
option type 'macvlan'
option ifname '<eth>'
option mode 'vepa'
option name '<name>'
option macaddr '<mac>'将<eth>替换为网络 -> 接口,中红色的wan下面显示的设备(见查看出口物理设备)。
将<name>替换为设备名(大小写英文和下划线)
将<mac>替换为通过随机MAC地址生成器获取的mac地址。每个设备的mac都必须唯一,不可以重复。
设备名name也不能重复。
重复操作添加若干个虚拟网卡,建议3到5个。
然后输入
:wq退出vim,注意开头有个冒号。注意是英文标点符号。
然后输入
service network reload重启网络服务。