校园网多线多播实现网速叠加+web认证每天自动登录
前言
废话
在上个学期通过学校的钉钉也能联系到了学校负责网络设备的老师了罢(悲,经过询问得知宿舍网络设备改造会在近期进行,搓着小手期待的等到了这个学期,路由器通电一测,好啊还是百兆,观望了宿舍内和门口的网络布线发现还是没进行改造(怒。没办法,而且每天早上还要自己起来手动登录校园网
俗话说优化的尽头是自动化,下定决心要对宿舍网络进行改造。查询得知手头的两个红米ax3000不好刷openwrt,也不支持自己写脚本,于是青筋暴起,桌子HP-150,当即下单了小米wr30u,誓要将“懒”的精神贯彻到底
注意
嘶...... 我之前这里注意想写什么来着,不管了先放着吧
路由器刷机
在买路由器之前就已经准备好了一些资料,本人刷路由器的参考资料如下:
小米 WR30U 解锁 SSH 刷 openwrt,最有性价比的百元路由器 (qust.me)
然后所需要的文件如下(来源也是qust.me):
刷完不死uboot和lean佬的固件之后之后发现lean佬的固件没有想象中的多线多拨和负载均衡功能
( 注!:其实可以自己手动安装多线多拨插件luci-app-syncdial、kmod-macvlan(前置)和负载均衡插件luci-app-mwan3、mwan3(前置),配置原理大同小异
遂查询得知,刷入BleachWrt固件
宿舍网络拓扑
作为桂林的top3学校——(gay)桂林理工大学,我们宿舍为1号组团,逝上床下桌( 喜 分布在两边
所以靠近门口的墙面上有两个网口,分别用于两边床位的同学连接到学校的宽带和校园网
前文也提到我们每个网口的最高速率都是只有百兆,100mbps,理论网速可以跑到12.5MB/s的下载速度,实测Steam下载猛汉王也能稳定在11.7MB/s的均速
然后我们宿舍有两人开通了有200兆宽带的套餐,本来能享受400兆的宽带的(悲
总结:
- 2个都是100兆的网口
- 2个都能跑满网口的移动宽带账号
于是我将两根网线分别接到了路由器上的 1口 和 2口
双线多拨
多线多拨插件首先需要两个wan接口,接下来我们设置两个出口的wan口
首先,手头的WR30U四个网络接口都是千兆,是wan/lan可以自己改的,但是我没在设置里找到,遂将lan设置中取消绑定lan2口,提交(我的提交按钮在右边)。一会我们将其作为wan口用
接下来我们添加新wan口,进入左边的网络-接口-添加新接口
然后我们填好名称wan2,不选择协议,物理接口绑定我们刚才lan接口解绑的lan2物理口
接下来提交,那么另一个wan接口就创建好了,解下来我们配置多线多拨
进入多线多拨界面,由于我只有两个账号,并且需要这两个网口各拨一个号来跑满网速,所以我在这里选择的是双线多拨,每个外网接口只配置一个虚拟wan口
保存并应用后,在接口界面就会多出来两个vwan接口:VWAN1和VWAN2
我们学校是定制的Dr.com哆点来进行web认证,下文会进行讲解
校园网宽带自动web认证
web认证流程
当我每天清晨醒来,打开宿舍门口外的电箱,将空开推上去
打开电脑打开浏览器,点开B站,我的链接会被学校劫持,然后跳转到学校的上网认证系统
我们学校的上网认证系统的地址为172.16.2.2
输入账号密码,选择移动宽带,点击登录
如果登录成功会跳转到我们学校官网
在点击登录前按下F12点开网络选项卡,来康康在登录过程中网页都在做些什么
所有需要选择,填写的内容都设置好之后,点下登录按钮,网页已迅雷不及掩耳之势跳转到了我们学校官网,中间登录成功的界面太快了截图不到(
然后我们看到开发人员工具中的网络选项卡,往上拉,看到一个login关键词,让我们点开康康,里面包含了登录时我的账号和密码,不出意外的话这个http请求就是web认证的关键了
接下来对这个请求进行测试,看看会不会只有这一个认证过程
首先重新访问认证界面172.16.2.2,注销登录,等待一段时间之后B站无法打开,跳转到登录界面
然后把这一串请求直接复制到浏览器打开
然后可以得到一个类似json的响应(多了个dr1003()包裹住了
个人猜测dr1003可能是服务端实例,不过无所谓,请求的时候填一模一样的就行
稍微等了一下,刷新B站,可以正常访问
自动登录
那么登录校园网的方法我们已经知道了,就是http请求到学校的认证服务器,服务器放行白名单然后进行运营商拨号,我们需要做的就是http请求
windows下可以安装curl来请求,Linux内置有curl,所以做自动认证很方便
但是我想放在路由器中进行自动认证,所以写了个脚本,放在了root目录下,命名为loginNet.sh
#! /bin/bash
#
# ---账号密码配置部分---
#
username1=
password1=
username2=
password2=
#
# ---macvlan1接口登录---
#
logger "正在检查vlan1状态......" && echo "正在检查vlan1状态......"
vlan1CheckStatusResponse=(curl --interface macvlan1 -s -G 'http://172.16.2.2/drcom/chkstatus?callback=dr1003&jsVersion=4.1&v=630&lang=zh')
if [ -zvlan1CheckStatusResponse];then
logger 'Error:返回值为空,请检查网络连接' && echo 'Error:返回值为空,请检查网络连接'
exit 1
else
#去掉头部的dr1003(和尾部的)
vlan1CheckStatusResponse={vlan1CheckStatusResponse#*(}
vlan1CheckStatusResponse={vlan1CheckStatusResponse%)*}
#用jq解析result的键值进行判断
if [ (echo "vlan1CheckStatusResponse" | jq '.result') == 1 ];then
logger "用户`echo vlan1CheckStatusResponse | jq '.AC'`已登录成功"
echo "用户`echovlan1CheckStatusResponse | jq '.AC'`已登录成功"
else
logger "未登录,即将尝试登录......" && echo "未登录,即将尝试登录......"
#用变量存储curl请求登录地址返回的数据
vlan1LoginResponse=(curl --interface macvlan1 -s -G "http://172.16.2.2/drcom/login?callback=dr1003&DDDDD=username1&upass=password1&0MKKey=123456&R1=0&R2=&R3=2&R6=0¶=00&v6ip=&terminal_type=1&lang=zh-cn&jsVersion=4.1&v=7658&lang=zh")
#一样是去掉头部的dr1003(和尾部的)
vlan1LoginResponse={vlan1LoginResponse#*(}
vlan1LoginResponse={vlan1LoginResponse%)*}
if [(echo "vlan1LoginResponse" | jq '.result') == 1 ];then logger "用户`echovlan1LoginResponse | jq '.uid'`已登录成功" && echo "用户`echo vlan1LoginResponse | jq '.uid'`已登录成功"
fi
fi
fi
#
# ---macvlan2接口登录---
#
logger "正在检查vlan2状态......" && echo "正在检查vlan2状态......"
vlan2CheckStatusResponse=(curl --interface macvlan2 -s -G 'http://172.16.2.2/drcom/chkstatus?callback=dr1003&jsVersion=4.1&v=630&lang=zh')
if [ -z "vlan2CheckStatusResponse" ];then
logger 'Error:返回值为空,请检查网络连接' && echo 'Error:返回值为空,请检查网络连接'
exit 1
else
#去掉头部的dr1003(和尾部的)
vlan2CheckStatusResponse={vlan2CheckStatusResponse#*(}
vlan2CheckStatusResponse={vlan2CheckStatusResponse%)*}
#用jq解析result的键值进行判断
if [(echo "vlan2CheckStatusResponse" | jq '.result') == 1 ];then logger "用户`echovlan2CheckStatusResponse | jq '.AC'`已登录成功" && echo "用户`echo vlan2CheckStatusResponse | jq '.AC'`已登录成功"
else
logger "未登录,即将尝试登录......" && echo "未登录,即将尝试登录......"
#用变量存储curl请求登录地址返回的数据
vlan2LoginResponse=(curl --interface macvlan2 -s -G "http://172.16.2.2/drcom/login?callback=dr1003&DDDDD=username2&upass=password2&0MKKey=123456&R1=0&R2=&R3=2&R6=0¶=00&v6ip=&terminal_type=1&lang=zh-cn&jsVersion=4.1&v=5720&lang=zh")
#一样是去掉头部的dr1003(和尾部的)
vlan2LoginResponse={vlan2LoginResponse#*(}
vlan2LoginResponse={vlan2LoginResponse%)*}
if [ (echo "vlan2LoginResponse" | jq '.result') == 1 ];then
logger "用户`echo vlan2LoginResponse | jq '.uid'`已登录成功" && echo "用户`echovlan2LoginResponse | jq '.uid'`已登录成功"
fi
fi
fi
连接到路由器的方法有很多,在管理界面中的系统
-文件传输
中就可以直接上传文件,然后通过终端(如ssh或者管理界面的ttyd终端)移动一下文件到自己想要的目录就行
我自己用的是WinSCP这一软件连接到路由器然后上传,直接用vscode编辑还挺方便的,
注意在新建会话的时候文件协议要选择SCP,主机名选自己的网关,我这里在刷好固件之后改成了192.168.66.1方便和我以前管理的路由器做区分
直接执行会报错Permission denied
,那我们就给脚本添加一下权限
chmod 775 /root/loginNet.sh
然后在计划任务中添加一行
*/10 6-7 * * * /root/loginNet.sh
这样就会每天6点到7点之间每隔10分钟就执行自动登录了。我此处每隔10分钟是防止学校抽风的情况。
负载均衡
负载均衡一般设置
既然设置了双线双拨那肯定要设置负载均衡的
我们在设置好多线多拨之后负载均衡会自动添加设置,我们需要更改一些设置来让负载均衡正确的叠加两条宽带的流量
首先我们需要设置两个虚拟wan口,更改两个接口的网关跃点为不同的数值,如图所示
当然可能设置的小一点会比较好,推荐设置的数值是vwan1为2,vwan2为3
接下来是接口
界面,接口只保留两个:vwan1
和vwan2
成员
界面也是只保留vwan1和vwan2的两个成员
策略
界面我们只保留balanced
这个策略,其他删除
重点来了,规则
界面我们只保留default_rule
这一条规则,并且修改设置,将粘滞模式
改为否,这样流量才会均匀的走两条线路
负载均衡通知设置
接下来是通知界面,通知的功能是给发生情况的时候自动处理用的,我为了防止校园网抽风偶尔会自动在中午12点注销登录,我也配置了这里的脚本
#!/bin/sh
#
# This file is interpreted as shell script.
# Put your custom mwan3 action here, they will
# be executed with each netifd hotplug interface event
# on interfaces for which mwan3 is enabled.
#
# There are three main environment variables that are passed to this script.
#
# ACTION
# <ifup> Is called by netifd and mwan3track
# <ifdown> Is called by netifd and mwan3track
# <connected> Is only called by mwan3track if tracking was successful
# <disconnected> Is only called by mwan3track if tracking has failed
#INTERFACE Name of the interface which went up or down (e.g. "wan" or "wwan")
# DEVICE Physical device name which interface went up or down (e.g. "eth0" or "wwan0")
#This is a dingshi script
case "ACTION" in
disconnected)
if [ (date +%w) == 5 ] || [(date +%w) == 6 ];then
if [ (date +%w) -lt 23 ] || [(date +%w) -lt 30 ];then
logger "接口"INTERFACE"失去连接,准备尝试重连 disconnected 01"
/root/loginNet.sh
else
logger "接口"INTERFACE"失去连接,达到校园网断网时间 02"
fi
else
if [ (date +%w) -lt 23 ] || [(date +%w) -lt 03 ];then
logger "接口"INTERFACE"失去连接,准备尝试重连 disconnected 03"
/root/loginNet.sh
else
logger "接口"INTERFACE"失去连接,达到校园网断网时间 04"
fi
fi
;;
connected)
logger "接口"$INTERFACE"上线成功 connected 05"
;;
ifup)
;;
ifdown)
;;
esac
因为我们宿舍楼是周五周六晚上11点30才断网,其他时间是11点整断网,整体还会往后延迟3分钟,所以加了判断
至此整个校园网双线双拨和自动登录的流程就完成了,路由器可以在那里干放两年了(
结尾
还没想好写什么
Comments 1 条评论
感谢学长的博客。
一开始我看到学校网络与信息中心官网上有drcom的登录客户端,就局限在GitHub上的drcom和dogcom这两个项目上来着。尝试了两天发现这俩项目好像对于咱们学校的6.0.0的d版drcom来说没法用。已经放弃了,回归web登录了。