本文章尚未完善, 有错误还请包涵, 有建议还请提出
学校环境:工作日晚上十一点到早上六点定时断网(气煞我也); 宿舍有LAN网络接口; 南校区 三营业厅都设基站在饭堂楼顶
需要设备: 路由RAX3000M(nand版); 网线若长; 可上网电脑; 随身WIFI(阿里云物联卡的);
一 获得设备
路由: 我现在看到某鱼都炒到125+了,离谱,价格越来越高了
网线: 我学校宽带最高才100mpbs,超五类 绰绰有余.
电脑: 有台电脑更方便操作
随身WiFi: esim是阿里云认证的物联卡, 速度好, 流量虚标较少, 而且还有那种9.9/100G/1个月套餐, 划算, 还想继续折腾的可以把esim移植到其他设备上, 让这卡更 物有所值, 具体咋做不在此论述.
二 路由刷openwrt
为啥要RAX3000M?因为我刚好有一台, 也刚好看到Krohnya-chan大神编译的固件. #我不会编译固件 :)
从各种渠道拿到路由后, 参考这篇教程,刷上不死U-Boot和Krohnya-chan编译的固件. #我选择刷入的是:压缩包里面叫 immortalwrt-mediatek-mt7981-cmcc_rax3000m-squashfs-sysupgrade.bin 的文件.
三 使用命令实现网络认证
步骤参考以下教程:
上面的很详细, #必须看看
请注意:
有些地方, 每个学校的认证方式可能不一样, 不要直接就复制拿去用, 一定要拿自己在学校获取的数据来做修改.
就比如我们学校锐捷这个:
curl "http://192.168.**.**:**/eportal/portal/login?callback=dr1003&login_method=1&user_account=******cmcc&user_password=******&wlan_user_ip=$IP&wlan_user_ipv6=&wlan_user_mac=***&wlan_ac_ip=&wlan_ac_name=&jsVersion=4.1.3&terminal_type=1&lang=zh-cn&v=7375&lang=zh"
就跟那位ccpd_1的openwrt下实现校园网的web认证里面写的差很多.
我学校的$IP那地方需要根据每次连接获取的IP做改变, 我在下面脚本会自己获取并更改.
mac, 每台设备肯定都是不一样的.
四 配置路由
用刷好的路由WAN口连上宿舍的LAN网络接口, 在路由后台应该就能看到对应网络信息,
在usbA口插上随身wifi, 在路由后台的接口里添加新接口, 随身WiFi需要在路由添加新的 DHCP客服端 才能通过usb共享网络 来使用.
#名称随意, 不碍事, 在脚本改成你改的名称就行.
不知道设备指定哪个,那就观察随身WiFi插上和没插上之间多了啥设备,选择对应的eth, 添加即可, 并且将此新添接口的防火墙归属于有WAN的一组里.
编写脚本,我主要参考了以下教程:openwrt校园网自动登录且断网重连 #建议必须看看
但是我学校环境特殊,所以我并没有使用教程的定时任务, 而是开机自启.
将以下程序, 复制放在/root/ping/ping.sh里
#附属教程Linux 文件与目录管理
sleep 30 # 等待系统完全启动 echo "ping脚本开始运行" LOG_PATH="./log.txt" # 设置日志路径 count=0 # 初始化计数器 while true; do weekday=$(date "+%a") # 获取星期几 hour=$(date "+%H") # 获取24小时制的小时 minute=$(date "+%M") # 获取分钟 # 判断是否在断网时间范围内 if ([ "$weekday" = "Mon" ] && [ "$hour" -ge 23 ]) || \ ([ "$weekday" = "Tue" ] && [ "$hour" -lt 6 ] || ([ "$hour" -eq 6 ] && [ "$minute" -le 30 ])) || \ ([ "$weekday" = "Tue" ] && [ "$hour" -ge 23 ]) || \ ([ "$weekday" = "Wed" ] && [ "$hour" -lt 6 ] || ([ "$hour" -eq 6 ] && [ "$minute" -le 30 ])) || \ ([ "$weekday" = "Wed" ] && [ "$hour" -ge 23 ]) || \ ([ "$weekday" = "Thu" ] && [ "$hour" -lt 6 ] || ([ "$hour" -eq 6 ] && [ "$minute" -le 30 ])) || \ ([ "$weekday" = "Thu" ] && [ "$hour" -ge 23 ]) || \ ([ "$weekday" = "Fri" ] && [ "$hour" -lt 6 ] || ([ "$hour" -eq 6 ] && [ "$minute" -le 30 ])) || \ ([ "$weekday" = "Sun" ] && [ "$hour" -ge 23 ]) || \ ([ "$weekday" = "Mon" ] && [ "$hour" -lt 6 ] || ([ "$hour" -eq 6 ] && [ "$minute" -le 30 ])); then echo "开启SSWAN,等15秒" if ip link show dev eth2 | grep -q "state UP"; then echo "SSWAN 已开启" else echo "初始SSWAN 未开启,正在尝试开启" ifup SSWAN fi sleep 15 # 等待一段时间确保接口已经开启 # 指定SSWAN(eth2) ping测试 ping -c 1 -W 1 -I eth2 www.baidu.com > /dev/null ret1=$? ping -c 1 -W 1 -I eth2 www.bilibili.com > /dev/null ret2=$? if [[ $ret1 -eq 0 || $ret2 -eq 0 ]]; then echo '随身网络正常,关闭WAN,等15秒后开始下一轮循环' if ip link show dev eth1 | grep -q "state UP"; then echo "初始 WAN 已开启,正在尝试关闭" ifdown WAN else echo "WAN 本未开启" fi sleep 15 # 等待一段时间确保接口已经关闭 # 重置失败计数器 count=0 continue else echo '随身网络异常,等8秒后开始下一轮循环' echo -n "$(date '+%Y-%m-%d %H:%M:%S') 异常!" >> $LOG_PATH echo '-> 随身网络异常' >> $LOG_PATH # 计数器加一 ((count++)) if [ $count -eq 5 ]; then echo "连续5次连接失败,增加每次循环的间隔时间到两分钟" sleep 120 elif [ $count -eq 15 ]; then echo "连续15次连接失败,增加每次循环的间隔时间到20分钟" sleep 1200 else sleep 8 fi fi #######################分界线####################### else echo "开启WAN,等20秒" if ip link show dev eth1 | grep -q "state UP"; then echo "WAN 本已开启" else echo "初始 WAN 未开启,正在尝试开启" ifup WAN fi sleep 20 #等待一段时间确保接口已经开启 # 指定WAN(eth1) ping测试 ping -c 1 -W 1 -I eth1 www.baidu.com > /dev/null ret3=$? ping -c 1 -W 1 -I eth1 www.bilibili.com > /dev/null ret4=$? if [[ $ret3 -eq 0 || $ret4 -eq 0 ]]; then echo '校园网络正常,关闭SSWAN,等15秒后开始下一轮循环' if ip link show dev eth2 | grep -q "state UP"; then echo "SSWAN 已开启,正在尝试关闭" ifdown SSWAN else echo "SSWAN 本未开启" fi sleep 15 #等待一段时间确保接口已经关闭 # 重置失败计数器 count=0 continue else echo '尝试连接校园网' # 获取 eth3 接口的当前 IP 地址 IP=$(ip addr show dev eth1 | grep -oE '(inet [0-9.]+)' | cut -d ' ' -f 2) echo "WAN IP地址: $IP" # 使用获取的 IP 地址进行 curl 请求 curl "http://192.168.**.**:**/eportal/portal/login?callback=dr1003&login_method=1&user_account=******cmcc&user_password=******&wlan_user_ip=$IP&wlan_user_ipv6=&wlan_user_mac=***&wlan_ac_ip=&wlan_ac_name=&jsVersion=4.1.3&terminal_type=1&lang=zh-cn&v=7375&lang=zh" # 等待网络连接恢复 echo '等网络连接恢复20秒' sleep 20 ping -c 1 -W 1 -I eth1 www.baidu.com > /dev/null ret5=$? ping -c 1 -W 1 -I eth1 www.bilibili.com > /dev/null ret6=$? if [[ $ret5 -eq 0 || $ret6 -eq 0 ]]; then echo '校园网连接成功,等15秒后开始下一轮循环' # 重置失败计数器 count=0 else echo '校园网连接失败,等15秒后开始下一轮循环' echo -n "$(date '+%Y-%m-%d %H:%M:%S') 异常!" >> $LOG_PATH echo '-> 校园网连接异常' >> $LOG_PATH # 计数器加一 ((count++)) if [ $count -eq 5 ]; then echo "连续5次连接失败,增加每次循环的间隔时间到两分钟" sleep 120 elif [ $count -eq 15 ]; then echo "连续15次连接失败,增加每次循环的间隔时间到20分钟" sleep 1200 else sleep 15 fi fi fi fi done
以上命令需根据实地的环境该改的,改. 就比如 eth*\断网时间段\接口名字 等,
不懂得地方问 文心一言, 有条件的问 chatGPT.
#今年4月1号GPT已经开放了部分地区, 没有GPT账号也能用了, 针不戳, 啥时候能国内用.
放上去后先用以下命令测试
./root/ping/ping.sh
如果运行不了,先输入以下命令添加权限
chmod +x /root/ping/ping.sh
测试可以了,且符合自身需求, 在启动项添加:
/root/ping/ping.sh &
最后在此感谢:
Krohnya-chan的固件
1715173329的 U-boot
symon_chu的教程以及
m0_66984299的教程