背景

这个学期学校好像调整了网速,之前原来有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.orghttps://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

重启网络服务。