最近更新于 2024-08-30 12:06
路由器相关测试
刷 Breed 恢复控制台:
- 红米 AC2100:https://blog.iyatt.com/?p=6839
- Newifi R6830: https://blog.iyatt.com/?p=7038
- 极路由 4 增强版:https://blog.iyatt.com/?p=7377
适配的路由器:
- 红米 AC2100(2023.9.17)
- 极路由 4 增强版(2023.3.9)
- Phicomm K2(2023.9.20)
- Newifi R6830(2022.10.5)
- Phicomm K2p(2022.10.1)
- Newifi3 (2022.10.1)
- 小米路由器 3 Pro(2022.10.1)
- 大麦 DW22D(2022.9.25)
编译主体步骤(初版,后续调整就在当前这篇日志):https://blog.iyatt.com/?p=6906
OpenWrt 固件在线构建:https://openwrt.ai/
OpenWrt 固件下载:https://downloads.openwrt.org/releases/
Padavan 固件下载:https://opt.cn2qq.com/padavan/
固件下载:
User-Agent 检测网站:
使用到的开源项目:
学校宽带登录地址:http://202.202.145.132/
2022.8.30
时隔多年,学校的校园网系统更新了。花溪校区全面更换光纤,移动和电信一起合资布设了宽带设备,宿舍有 WiFi6 覆盖。电信旧有宽带系统“创翼”将于 9 月末弃用,新登录系统使用锐捷(如下图)。
采用的是 WEB 页面认证,按照通知所说,支持一台电脑和一部移动设备同时在线,一般来说校园网都会限制多设备使用,比如开热点。
今天是新宽带试运行的第二天,我先测试了下电脑开热点。直接使用系统的热点功能虽然可以开启,但是连上WiFi却没网。我换用的 360 免费 WiFi 校园专版测试,可以开 WiFi 给多台设备使用。但是考虑到360 WiFi可能有技术应对校园网,还不能判断是否会检测多设备。
我又尝试了用树莓派(Linux 小电脑)登录校园网,然后开热点,连上的多台设备也都能使用,那就意味着可能是没有多设备检测。
然后我准备尝试编译 OpenWrt 添加锐捷登录协议,在和一个朋友交流时,给我提出了一种方式让我尝试:路由器克隆电脑的 MAC,电脑跳出登录页面后正常登录操作。结果真的可以工作,能不能长时间保持连接还待观察。
大致原理就是路由器 WAN 口直连接入学校校园网,校园网给路由器分配了一个 IP,然后电脑(用手机也可以操作)连接在路由器上间接接入校园网。此时校园网识别到的接入的设备就是路由器,然后因为登录要在电脑上进行,猜想可能会记录登录设备的 MAC 地址绑定登录状态,所以就先把电脑的 MAC 地址给路由器使用。然后在电脑上进行正常登录操作,数据经由路由器发送出去,校园网那边就会认为是路由器登录的(把路由器当作登录的电脑或手机)。路由器访问互联网后,连接在上面的设备也能间接访问互联网,绕过一个账号只能登录两台设备的限制,实现多设备上网。(后面测试发现不用克隆 MAC 也行)
所以操作的话,就是把路由器外网连接类型设成动态IP(截图为老毛子固件)
在电脑连上路由器的时候应该会跳出校园网的登录界面,如果关了,可以打开地址 202.202.145.132 ,正常登录就可以了,登录后可以关闭页面
然后所有连接到路由器上的设备都能上网了。
————————————————————————————————————————————————————
2022.9.1
锐捷限制一个账号登录两台设备,今天我测试了两个路由器使用一个账号,同时测速发现两台路由器都能达到办理套餐的带宽。意味着限速不是针对账号的,而是对每台设备的。
2022.9.3
今天下午开始,第一次出现路由器掉线的情况,掉线后尝试重新登录时提醒如下图:
后面频繁出现了很多次,每次被限制时间不定。
2022.9.4
查阅了网上很多资料,结合测试,推测这个“代理上网”识别是基于 UA 检测的,UA 中带有操作系统名,如果同时出现多个,那么就能判断出一个设备联网共享给多个设备使用。
经过通宵的折腾(编译红米 AC2100 的 OpenWrt 固件),一直搞到中午,终于弄出一个没掉线的固件了,主要通过替换 UA 避免检测。
详情:https://blog.iyatt.com/?p=6906
2022.9.5
今天我用别人的号测试电脑和手机同时间访问 http 网页,结果没出现掉线的情况,结合昨天有人给我说他在比我更早之前就被检测到代理上网然后禁止登录。我做了一个推测:
校园网是随机抽查部分用户检测,只要检测到一次,那么后面就会专门盯着你的账号。毕竟要分析你的上网特征也是要消耗服务器资源的,对全部上网用户同时检测服务器压力山大。
我也了解到一些用户在使用虚拟机和安卓模拟器时也会被检测到代理上网,这个其实很好理解。你登录的电脑把网络共享给虚拟机和安卓模拟器使用,两边的网络服务通信时,UA 可能不一样,特征和使用路由器很像,校园网就一棒子打死。
————————————————————————————————————
继 https://blog.iyatt.com/?p=6906 (初版)编译固件
红米 AC2100 固件(2022-9-5_lede20220716):
初版固件是基于原版 OpenWrt 编译,可扩展的功能较少,当然固件文件也较小,是考虑到实验性以及为了适配 PHICOMM K2 路由器(只有 8M 闪存)(以前我卖过很多“校园网”路由器,都是 K2 的,可提供升级服务)。所以只需要保证校园网基本的支持就行,K2 路由器闪存勉强够用,也就暂时不再考虑更新 K2 的固件了。
从这里开始采用 lede,这个版本是基于 OpenWrt 开发的,含有更丰富的功能模块,体验比原版更好,采用的分支为 20220716。
- 修改了 lede/package/base-files/files/etc/rc.local,将防 UA2F、TTL、NTP、FLASH 检测相关的防火墙配置预写入系统,不再需要刷机后手动设置,做到开箱即用
- 修改了 lede/package/lean/default-settings/files/zzz-default-settings(lede 的默认设置文件),去除了 lede 的默认密码(留空),将 UA2F 首次启用相关命令写入,不再需要刷机后手动执行,做到开箱即用
- 去掉了部分默认勾选编译的应用(我认为用不上的),另外添加了应用,最终编译的应用如图:
网络 -> Turbo ACC 网络加速
2022.9.8
——————————————————————————————————————————
晚上的时候,提出这个方案的学弟联系我测试(因疫情还没返校,我是暑假留校的)。他搭建了一个 VPN 服务端,然后我电脑连接网线不登陆宽带认证,直接使用 OpenVPN 客户端通过 53 端口连接服务器,成功上网。
——————————————————————————————————————
针对 2022.9.5 版固件发现问题(仅红米 AC2100 的固件),路由器断电后开机或重启,WiFI 不会自启动。
打开系统->启动项,翻到下面本地启动脚本
在最后一行的 exit 0 前面行添加下面内容,点击提交。
# 2.4GHz ip link set ra0 up brctl addif br-lan ra0 # 5GHz ip link set rai0 up brctl addif br-lan rai0
2022.9.10
固件下载地址(2022-9-10_lede20220716):
- 去除了上一版的部分功能,主要保留的功能有 UPNP 、KMS 和 Turbo ACC。
- 解决 2022.9.8 发现的 WiFI 不自启动的问题,修改后默认只启动 5GHz,如果要设置 2.4GHz 自启动,请自行修改 系统–>启动项–>本地启动脚本,解开对应部分的注释。
2022.9.11
- 红米 AC2100(2022-9-11_lede20220716):去除预置配置中关于 rkp-ipid 的部分:编译时并没有添加 rkp-ipid 模块,防火墙无需配置。
- Lenovo Y1 Newifi R6830(2022-9-11-openwrt22.03):新增固件,刷 Breed 参考:https://blog.iyatt.com/?p=7038。固件基于 OpenWrt 编译(lede 上测试 UA2F 功能失败,最终在 OpenWrt 上成功)。刷机启动后,进入管理后台,打开服务->终端,登录后执行 ./enable_ua2f,启用 UA2F 模块。
- Phicomm K2(2022-9-11-openwrt22.03):更新固件,本来不打算更新的了。但是第一版用于测试的要刷机后手动输入代码配置太麻烦,还是要预置配置更方便使用。这里采用的和上面 Lenovo Y1 一样的源码和配置编译的,操作完全一样。
2022.9.13
- Newifi R6830(2022-9-13_lede20220716_Newifi-R6830)(废弃,不要用): 这次成功测试了 lede,添加了 Turbo ACC,但是发现如果启用了软件流量分载,UA 替换模块就不会工作。还不只有这个问题,我测速发现严重掉速,可能 1Mbps 都达不到。后面我编译了不含 Turbo ACC 的固件,测试还是有严重的掉速问题,并且负载依然也比较高,因此决定放弃在 Newifi R6830 上使用 lede 版本。(上传的是含 Turbo ACC 的固件,有兴趣的可以自己测试)
2022.9.14
双网叠加测试,详情:https://blog.iyatt.com/?p=7154
2022.9.15
单线多拨测试,详情:https://blog.iyatt.com/?p=7213
2022.9.16
有计划研究一下 Web 认证进行过程,然后应该可以使用 cURL 进行 POST 实现登录,即可以做到路由器自动尝试登录,不再需要打开浏览器手动操作。
进展见:https://blog.iyatt.com/?p=7288
因为是 Web 认证,登录相关的实现完全可以在网页代码里看到,但是我不会 Javascript,暂时也没有时间去慢慢分析,所以暂且搁置。
2022.9.17
下午测试的时候开始出现两个路由器不能同时在线的情况(双网叠加用一个账号不行了,单线多拨估计也一样),然后我又试验了手机和电脑(可以),手机和平板电脑(不可以),电脑和平板电脑(不可以),这nm啥情况,我有点迷。
我也没太多时间,所以目前的情况暂时要搁置一下了。
2022.9.19 – 2022.9.20
根据 17 号测试的情况,判断应该是根据登录时浏览器的 UA 进行区分的,19号下午测试,发现 Linux 系统的电脑也无法与手机同时在线。我就专门整理了一下我测试使用的设备浏览器的 UA,然后准备重新编译固件修改 UA2F 模块的代码,不再全部改为 FFFFF….,而是全部换成手机的 UA,那么应该可以解决两个路由器无法同时在线的问题。
不过我想得太天真了,从下午一直折腾到凌晨都没达到我预期的效果,或者说到最后什么都没搞出来。一方面是很久没写 C 语言了,改 UA2F 的时候,还犯了几次基础语法错误。另一方面关于 UA 替换实现的部分使用的第三方库,以前没了解过,改的时候很懵逼,不断尝试修改-编译-刷路由器-登录测试 UA,到后面逐渐意识到如果要改成我所想的全部替换成一样的指定 UA(UA2F 本身是将 UA 改为浏览器 UA 等长度的 FFFFF…..),那就必须得大改,结构框架修改。最后还是放弃了,没那个时间去慢慢研究。
Ubuntu 20.04 – 谷歌浏览器
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Windows 11 – Edge 浏览器
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42
Windows 11 – 谷歌浏览器
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
小米平板 5 Pro – 谷歌浏览器
Mozilla/5.0 (Linux; Android 11; M2105K81AC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
小米平板 5 Pro – 内置浏览器
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/89.0.4389.116 Safari/534.24 Device/elish Model/M2105K81AC XiaoMi/MiuiBrowser/14.6.74
红米 Note11 Pro – 谷歌浏览器
Mozilla/5.0 (Linux; Android 12; 21091116C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Mobile Safari/537.36
红米 Note11 Pro – 内置浏览器
Mozilla/5.0 (Linux; U; Android 12; zh-cn; 21091116C Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.116 Mobile Safari/537.36 XiaoMi/MiuiBrowser/16.0.26 swan-mibrowser
2022.9.20
在放弃之后的凌晨,我决定进一步优化一下固件。有些设置直接在编译前的源文件上修改,刷好固件就不用再手动修改了。
- Newifi R6830(2022-9-20_openwrt22.03_newifi-r6830):时区改为中国,NTP 服务器换为国内的,启用“作为 NTP 服务器”。开启 WiFi,名字为 OpenWrt,加密方式 WPA2-PSK,密码为 12345678。管理页面主题修改,去掉之前添加的主题,只保留默认的。删掉我之前添加的关于 UA2F 防火墙相关的配置,使用的新版 UA2F 本身就会自动配置。
- Phicomm K2(2022-9-20_openwrt22.03_k2):同上
- Redmi AC2100(2022-9-20_lede20220716_redmi-ac2100):启用作为 NTP 服务器。UA2F 同上。
2022.9.21
- 极路由 4 增强版 HC5962(2022-9-21_lede20220716_hiwifi-hc5962):新增固件,刷 Breed 参考:https://blog.iyatt.com/?p=7377。固件编译配置大致同 2022.9.20 红米 AC2100 固件。
2022.9.22
目前所有路由器前一版固件均存在问题,由于我的失误,错误地以为 UA2F 已经包含了所有的防火墙配置(TTL、时钟偏移…)。刚才无意间翻看 UA2F 的源码,在启动项配置部分发现里面应该只含有了 UA2F 的部分。另外为了以防万一,还是准备加入 rkp-ipid 模块。趁着睡觉之前争取编译完。
- 启动项预置,在 package/base-files/files/etc/rc.local 添加
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 # 防 IPID 检测 iptables -t mangle -N IPID_MOD iptables -t mangle -A FORWARD -j IPID_MOD iptables -t mangle -A OUTPUT -j IPID_MOD iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN # 由于本校局域网是 A 类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网内网类型 # iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10 # 防时钟偏移检测 iptables -t nat -N ntp_force_local iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1 # 通过 iptables 修改 TTL 值 iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64
- 源码添加 rkp-ipid
Kernel modules–>Other modules–>kmod-rkp-ipid
git clone https://github.com/CHN-beta/rkp-ipid.git package/rkp-ipid --depth=1
更新固件:
- 红米 AC2100:2022-9-22_lede20220716_redmi-ac2100
- 极路由 4 增强版:2022-9-22_lede20220716_hiwifi-hc5962
- Newifi R6830:2022-9-22_openwrt22.03_newifi-r6830
- Phichom K2:2022-9-22_openwrt22.03_newifi-k2
红米 AC2100 添加 MentoHUST 插件测试
# MentoHUST git clone https://github.com/KyleRicardo/MentoHUST-OpenWrt-ipk.git package/mentohust --depth=1 # luci-app-mentohust git clone https://github.com/BoringCat/luci-app-mentohust.git package/luci-app-mentohust --depth=1
编辑 package/mentohust/Makefile,删除这两行(两个插件有同样的文件会冲突,这里放弃 MentHUST 的文件,使用 luci-app-MentHUST 的)
测试的情况是 ping 网站没问题,也没丢包,QQ 可以收发消息,但是就网页打不开。一般这种情况都会考虑 DNS 的问题吧,但是 ping 都能获取 IP,而且还有数据了,应该就不是这个问题了。我也尝试修改过 DNS,依然没用。
我暂时没有时间测试了,有兴趣的可以自己试一试。
红米 AC2100 固件: 2022-9-22_lede20220716_redmi-ac2100_MentoHUST
为了后面方便测试,这里新编译的固件同时包含了 UA2F、MentoHUST、macvlan、mwan3。
红米 AC2100 :2022-9-22_lede20220716_redmi-ac2100_all
极路由 4 增强版:2022-9-22_lede20220716_hiwifi-hc5962_all
2022.9.23
- 有够奇怪的,今天测试又可以两台路由器同时在线了。
- 目前测试的情况都还好,不过注意,使用路由器的时候,手机/电脑就不要直连校园网登录了,特别是在路由器和校园网直连之间切换的时候有可能触发“检测到代理上网行为,已被禁止上网”
针对 lede 编译的固件:
- 不再添加 Turbo ACC 及包含的模块(影响 UA2F 模块)
- 不再将防检测相关的防火墙配置预置到启动项,而是预置到防火墙自定义规则对应的配置文件中。编辑 package/lean/default-settings/files/zzz-default-settings,找到下面内容所在位置
echo 'iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53' >> /etc/firewall.user echo 'iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53' >> /etc/firewall.user echo '[ -n "$(command -v ip6tables)" ] && ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53' >> /etc/firewall.user echo '[ -n "$(command -v ip6tables)" ] && ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53' >> /etc/firewall.user
接着下一行开始添加
echo '# 防 IPID 检测' >> /etc/firewall.user echo 'iptables -t mangle -N IPID_MOD' >> /etc/firewall.user echo 'iptables -t mangle -A FORWARD -j IPID_MOD' >> /etc/firewall.user echo 'iptables -t mangle -A OUTPUT -j IPID_MOD' >> /etc/firewall.user echo 'iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN' >> /etc/firewall.user echo 'iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN' >> /etc/firewall.user echo '# 由于本校局域网是 A 类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网内网类型' >> /etc/firewall.user echo '# iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN' >> /etc/firewall.user echo 'iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN' >> /etc/firewall.user echo 'iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN' >> /etc/firewall.user echo 'iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN' >> /etc/firewall.user echo 'iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10' >> /etc/firewall.user echo '# 防时钟偏移检测' >> /etc/firewall.user echo 'iptables -t nat -N ntp_force_local' >> /etc/firewall.user echo 'iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local' >> /etc/firewall.user echo 'iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN' >> /etc/firewall.user echo 'iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN' >> /etc/firewall.user echo 'iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN' >> /etc/firewall.user echo 'iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1' >> /etc/firewall.user echo '# 通过 iptables 修改 TTL 值' >> /etc/firewall.user echo 'iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64' >> /etc/firewall.user
红米 AC2100: 20220923_lede20220716_redmi-ac2100
极路由 4 增强版: 20220923_lede20220716_hiwifi-hc5962(该路由器偶尔存在死机重启的情况,不知道是我路由器硬件的问题,还是固件问题)
Newifi R6830: 20220923_lede20220716_newifi-r6830
Phicomm K2: 20220923_lede20220716_k2(又测试了一下使用 lede,效果惨不忍睹,废弃版本)
50M 宽带分别使用上面四种路由器固件的测速:
最后一个可以明显看出ji了
2022.9.24
计划全部从 lede 转为 openwrt。
基础共有配置:
- 采用 openwrt 源码分支 v22.03.0
git clone https://github.com/openwrt/openwrt.git --depth=1 --branch=v22.03.0
- 编辑 package/base-files/files/etc/rc.local,写入
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 # 防 IPID 检测 iptables -t mangle -N IPID_MOD iptables -t mangle -A FORWARD -j IPID_MOD iptables -t mangle -A OUTPUT -j IPID_MOD iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN # 由于本校局域网是 A 类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网内网类型 # iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10 # 防时钟偏移检测 iptables -t nat -N ntp_force_local iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1 # 通过 iptables 修改 TTL 值 iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64
- 创建文件 files/root/setups,并添加可执行权限,写入
#!/bin/ash # 时区设置 uci set system.@system[0].timezone=CST-8 uci set system.@system[0].zonename=Asia/Shanghai uci commit system # WiFi 区域设置 uci set wireless.radio0.country='CN' uci set wireless.radio1.country='CN' uci commit wireless wifi # UA2F 配置 uci set ua2f.enabled.enabled=1 uci set ua2f.firewall.handle_fw=1 uci set ua2f.firewall.handle_tls=1 uci set ua2f.firewall.handle_mmtls=1 uci set ua2f.firewall.handle_intranet=1 uci commit ua2f service ua2f enable service ua2f start echo "设置完成!"
- 编辑 package/base-files/files/bin/config_generate
# 找到 set system.ntp.enable_server='0' 改为 set system.ntp.enable_server='1' # 找到 add_list system.ntp.server='0.openwrt.pool.ntp.org' # add_list system.ntp.server='1.openwrt.pool.ntp.org' # add_list system.ntp.server='2.openwrt.pool.ntp.org' # add_list system.ntp.server='2.openwrt.pool.ntp.org' 改为 add_list system.ntp.server='ntp.aliyun.com' add_list system.ntp.server='time1.cloud.tencent.com' add_list system.ntp.server='time.ustc.edu.cn' add_list system.ntp.server='cn.pool.ntp.org'
- 编辑 package/kernel/mac80211/files/lib/wifi/mac80211.sh
# 找到 set wireless.radio${devidx}.disabled=1,改为 set wireless.radio${devidx}.disabled=0 # 找到 set wireless.default_radio${devidx}.encryption=none 改为 set wireless.default_radio${devidx}.encryption=psk2 # 接着下一行添加(设置初始 WiFi 密码) set wireless.default_radio${devidx}.key=12345678
最终固件:
红米 AC2100: 20220924_openwrt22.03.0_redmi-ac2100
极路由 4 增强版: 20220924_openwrt22.03.0_hiwifi-hc5962
Newifi R6830: 20220924_openwrt22.03.0_newifi-r6830
Phicomm K2: 20220924_openwrt22.03.0_k2
刷入固件启动后,进入路由器管理 http://openwrt.lan,登录服务->终端,执行命令 ./setups 完成初始配置后即可使用。
2022.9.25
为一个校友适配的 DomyWifi DW22D(大麦),采用编译方案同 2022.9.24。
固件名:20220925-openwrt22.03.0-domiwifi-dw22d
2022.9.28
Phicomm K2p(20220928-openwrt-22.03.0-phicomm-k2p):新增固件,编译配置同 2022.9.24。
2022.9.29
新增 Newifi3 和 小米 3 Pro,编译配置同 2022.9.24,分别为:
- 20220929-openwrt-22.03.0-newifi3
- 20220929-openwrt-22.03.0-mi3pro
2022.10.1
- 在 2022.9.24 基础上,修改 files/root/setups 写入的内容,添加修改软件源的指令
#!/bin/ash # 时区设置 uci set system.@system[0].timezone=CST-8 uci set system.@system[0].zonename=Asia/Shanghai uci commit system # WiFi 区域设置 uci set wireless.radio0.country='CN' uci set wireless.radio1.country='CN' uci commit wireless wifi # UA2F 配置 uci set ua2f.enabled.enabled=1 uci set ua2f.firewall.handle_fw=1 uci set ua2f.firewall.handle_tls=1 uci set ua2f.firewall.handle_mmtls=1 uci set ua2f.firewall.handle_intranet=1 uci commit ua2f service ua2f enable service ua2f start # 将软件源修改为国内的阿里云 sed -i 's_downloads.openwrt.org_mirrors.aliyun.com/openwrt_' /etc/opkg/distfeeds.conf echo "设置完成!"
- 红米 AC2100 和极路由 4 增强版去除带宽监控器
固件名:
- 极路由 4 增强版: 20221001-openwrt-22.03.0-hiwifi-hc5962
- 红米 AC2100: 20221001-openwrt-22.03.0-redmi-ac2100
- 小米路由器 3 Pro: 20221001-openwrt-22.03.0-mi3pro
- Newifi 3: 20221001-openwrt-22.03.0-newifi3
- Phicomm K2p: 20221001-openwrt-22.03.0-k2p
2022.10.4
现在宽带似乎限制的是账号的总速度,而不是每个登录设备的速度。
刚才我电脑为了下载东西,切换了一个路由器连接,但是我室友使用的另外一个路由器,突然网络就变卡了。然后我用手机连接那个路由器测速,发现速度真的降了。然后这边我把下载限速之后,再测速,速度就上去了。
也不排除是因为我两个路由器网线连在同一个 AP 上,速度受到了影响。
另外前几天发现可以两个有线 + 一个无线登录同一个账号了
2022.10.5
突然意识到在 K2 上使用最新版的 OpenWrt 似乎不太合适,换下思路,改用旧版本,内核会更小,更为精简,或许就正常了。
这里采用 OpenWrt 19.07.10 版本
git clone https://github.com/openwrt/openwrt.git --depth=1 --branch=v19.07.10
因为这个版本的 OpenWrt 中 libnetfilter-queue 不符合 UA2F(20220902T135035)要求,编译会报错,需要进行一定的修改。所以我在安装 feeds 后,将原来的 package/libs/libnetfilter-queue 删除,然后从 OpenWrt 22.03.0 的 feeds/packages/libs/libnetfilter-queue 复制过来到 package/libs 目录下。
编辑 package/UA2F/files/ua2f.config,将 option enabled ‘0’ 改为 option enabled ‘1’,即默认启用 UA2F,刷好固件开机直接登录宽带使用就行。
Phicomm K2:20221005-openwrt-19.07.10-k2
Newifi R6830:20221005-openwrt-19.07.10-newifi-r6830(同上编译配置)
根据用户反馈,红米 AC2100 会出现死机的情况,在被检测出代理上网之前就会出现无法进入路由器管理页面的情况。
今天我测试的时候发现,在路由器一段时间内没有联入 Internet 时,也会发生死机。
然后我设置将系统日志保存到文件,以便死机再开机后能看到先前的日志内容,发现每次死机前都出现一堆下面箭头所指的内容。
后面推测是 mwan3 模块的问题,在软件包中搜索卸载掉 mwan3 和 macvlan 之后就没有出现死机的情况了。mwan3 和 macvlan 是之前测试多拨的时候添加的,macvlan 用来虚拟网卡,mwan3 用来负载均衡,主要问题应该就是 mwan3 的,不过 macvlan 留着也没啥用了,直接一起卸载了就是。
2022.10.6
针对红米 AC2100 和极路由 4 增强版进行调整,重新克隆源码进行配置编译。
不再添加 mwan3 和 macvlan,避免死机的问题。
大体编译配置同 2022.9.24,但将 /files/root/setups 改为 /files/root/start,编写内容如下:
#!/bin/ash uci set system.@system[0].timezone=CST-8 uci set system.@system[0].zonename=Asia/Shanghai uci commit system echo "已将时区设置为 Asia/Shanghai" uci set wireless.radio0.country='CN' uci set wireless.radio1.country='CN' uci commit wireless wifi echo "已将 WiFi 区域设置为中国" sed -i 's_downloads.openwrt.org_mirrors.aliyun.com/openwrt_' /etc/opkg/distfeeds.conf echo "已将软件源设置为阿里云镜像站"
修改 package/UA2F/files/ua2f.config,设置如下:
config ua2f 'enabled' option enabled '1' config ua2f 'firewall' option handle_fw '1' option handle_tls '1' option handle_intranet '1'
即默认开启 UA2F,不再需要刷机后手动启用。后面三个选项分别对应的含义:
- 自动为 UA2F 配置防火墙
- 对 443(https)端口流量也进行处理
- 对内网流量进行处理
再编辑 package/base-files/files/etc/banner,修改终端启动显示内容,添加提醒
执行 ./start 一键中国化配置(非必须)
红米 AC2100:20221006-openwrt-22.03.0-redmi-ac2100
极路由 4 增强版:20221006-openwrt-22.03.0-hiwfi-hc5962
2022.11.20
1.我测试的情况结合一位校友反馈的情况,目前 UDP 53 端口被关闭了,所以前面 2022.9.5 所说的“白嫖”方案行不通了
2.目前来说校园网在“严格度”上应该稳定下来了,刚开始启用的时候还在松紧上调整,比较严的时候可能每天都会被检测到一次,但是这系统本身也达不到预期的效果,本来说的是一个手机和一台电脑,结果有些用户出现不能同时在线的情况,又会给营业厅工作人员反馈,各种问题也很折腾工作人员。现在就比较宽松了,我这边差不多有一个月没有再出现被检测出的情况了,在此期间也没有用户反馈这个问题了。
3.在宽松的策略下,我测试可以三个设备同时登陆
4.网速方面,似乎会限制账号的总速度(宽带刚启用的时候没这种限制),最明显的现象就是我室友单独有线连接的电脑在下载东西的时候,我这边连接路由器使用的设备会严重掉速,或者我这边下载的时候他那边掉速。另一点就是关于实际速度的,不知道是不是学校限速系统有问题,我账号是 50M 的,有时候速度是正常的在这个点上,但有时候加加加,非常棒的速度。(这个是宽带一开始就有的现象)
2023.3.9
极路由 4 增强版本身是有 USB 接口的,但是考虑到一般的可能用不上,所以在尽可能简单的基础上,我没有编译 USB 支持。昨天一个朋友打算配置 USB 支持,在安装相关依赖包的过程中一直出现错误(添加 USB 支持是需要安装内核模块支持的),所以今天我在 2022.10.6 的基础上编译了新的固件,增加 USB 支持(https://blog.iyatt.com/?p=331)。
20230309-openwrt-22.03.0-hiwfi-hc5962
2023.3.14 Python 登陆脚本
去年新宽带刚开始启用的时候,我也试图写个脚本实现登陆,但是最终因为个人技术不足(不会 js,没完全搞懂登陆逻辑)以及时间不够放弃了。当时发现登陆时会对密码加密,并且和 MAC 有关联。今天有位兄弟说可以不用加密也行,我也想到当时研究时发现 POST 的数据中就有一个参数叫“passwordEncrypt”(密码加密),只是那时候以为不能设置成不加密。实际却是可以的,如果那个参数设置成 false,那么就不用考虑加密的问题,脚本登陆的实现就非常简单了。
下面是他写的 Python 代码
import requests
from urllib.parse import quote
import argparse
def login(username,provider,passwd):
url = "http://202.202.145.132/"
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
res = requests.get(url=url)
urlpre = res.text.split('href=\'')
url = urlpre[1].split('\'</script')
url = url[0]
referer = url.split('?')[1]
providerUrl = quote(provider)
header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '955',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
# 'Cookie': '', #一定不要带Cookie,不然短时间重复访问会导致需要验证码
'Host': '10.8.2.2',
'Origin': 'http://10.8.2.2',
'Referer': url, #从请求头中获取
'User-Agent': ua #一般无需修改
}
dataLogin = {
'userId': username, #填写post请求中的账号
'password': passwd, #填写post请求中加密过的密码
'service': providerUrl, #选择网络接入方式,在post请求中有
'queryString': referer,#从post请求中复制过来即可
'operatorPwd': '', #不用填
'operatorUserId': '', #不用填
'validcode': '', #不用填
'passwordEncrypt': 'false', #不用修改
#'userIndex': '' #填写post请求中的对应字段
}
loginUrl = 'http://202.202.145.132/eportal/InterFace.do?method=login'
res = requests.post(url=loginUrl,data=dataLogin,headers=header)
res.encoding = 'utf-8'
content2 = str(res.text.encode().decode("unicode_escape").encode('raw_unicode_escape').decode())
j = content2.find('"result":"')
isOk = content2[j+10:j+17]
if (isOk[0] == 's' and isOk[1] == 'u'):
print(isOk)
else:
print(content2)
def main():
parser = argparse.ArgumentParser(description="Auto Loging in Ruijie network")
parser.add_argument('-u', type=str, default='',
help='username')
parser.add_argument('-p', type=str, default='',
help='passwd')
parser.add_argument('-n', type=str, default='',
help='provider name')
args = parser.parse_args()
try:
login(args.u,args.n,args.p)
except:
print("failed, you may already login in network or this way faded!")
if __name__ == "__main__":
main()
我在 Windows 电脑上测试过,环境:Windows 11 22H2 专业工作站版;Python 3.11.2
也在路由器上测试过,环境:Redmi AC2100;openwrt 22.03.0;Python 3.10.9
主要说一下在路由器上,安装 python3、python3-pip,然后建议换一下国内源,再用 pip 安装 requests 模块,就可以运行上面的代码。
至于具体意义,如果以后校园网对长时间登陆的设备进行强制下线,那么可以让路由器定时自动登陆。或者电脑直接使用时,配置成开机自动运行,免手动登陆。
有兴趣研究的,可以看看下面的:
我这里用 Edge 浏览器做演示,地址栏打开登陆地址 http://202.202.145.132/
按 F12 打开调试,点开网络,选择全部,勾选保留日志
然后正常登陆宽带
在调试器中看到捕捉到 InterFace.do?method=login 项
标头就是 POST 的头
负载就是 POST 的表单数据,用户名、密码等等
2023.3.16 PowerShell 登陆脚本
Windows
我写了一个 PowerShell (PS)的登陆脚本,目前主流的 Windows 10/11 系统都预装了 PS,不需要依赖第三方环境,直接就能运行
测试环境:Windows 11 22H2 专业工作站版;PowerShell 7.3.3
#!/usr/bin/env pwsh
# 使用:
# Windows: .\campus_network_login.ps1 [学号] [密码] [服务编号]
# Linux: ./campus_network_login.ps1 [学号] [密码] [服务编号]
# 服务编号:
# 0 校园内网
# 1 中国电信
# 2 中国移动
# site:https://blog.iyatt.com/?p=6815(2023.3.16 PowerShell 登陆脚本)
function login($username, $passwd, $service)
{
$url = "http://202.202.145.132/"; # 校园网认证地址
$res = Invoke-WebRequest -Uri $url -Method "GET"
if ($res.Content -like "*登录成功*") # 根据请求内容判断是否已经登陆
{
Write-Output "已登录成功,请勿重复登陆!"
exit 1
}
$urlpre = "$res".Split("href='")[1]
$url = "$urlpre".Split("'</script>") # POST 请求头 Referer 参数设置这个
$referer = "$url".Split("?")[1] # POST 请求体 queryString 参数设置这个
# POST 请求头
$headers = @{
"Accept" = "*/*"
"Accept-Encoding" = "gzip, deflate"
"Accept-Language" = "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"
"Connection" = "keep-alive"
# "Content-Length" = "940" # 浏览器调试捕获到的值是 940,但是这里设置会出现错误。这个参数是请求体的长度,不设置会自动计算
"Host" = "202.202.145.132"
"Origin" = "http://202.202.145.132"
"Referer" = $url
}
# 通过传入的数字编号,设置服务
if ($service -eq 0)
{
$service = "校园内网"
}
elseif ($service -eq 1)
{
$service = "中国电信"
}
elseif ($service -eq 2)
{
$service = "中国移动"
}
else
{
Write-Output "服务编号选择错误,请选择: `n`n`t0 校园内网`n`t1 中国电信`n`t2 中国移动`n"
exit 1
}
$service = [System.Uri]::EscapeDataString($service) # URL 编码
# POST 请求体参数
$params = [ordered]@{
"userId" = $username
"password" = $passwd
"service" = $service
"queryString" = $referer
"operatorPwd" = ""
"operatorUserId" = ""
"validcode" = ""
"passwordEncrypt" = "false" # 不加密
}
# 根据捕获的信息,ContentType 为 application/x-www-form-urlencoded; charset=UTF-8
# 则请求体需要用 URL 编码后进行发送,参数间使用 & 符号连接
$body = ""
foreach ($key in $params.Keys)
{
$value = $params[$key]
if ($body -ne "") {
$body += "&"
}
$body += [System.Uri]::EscapeDataString($key) + "=" + [System.Uri]::EscapeDataString($value)
}
# POST 地址
$loginUrl = "http://202.202.145.132/eportal/InterFace.do?method=login"
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.41" # UA
$response = Invoke-WebRequest `
-UseBasicParsing `
-Uri $loginUrl `
-Method "POST" `
-WebSession $session `
-Headers $headers `
-ContentType "application/x-www-form-urlencoded; charset=UTF-8" `
-Body $body
$decodedContent = [System.Text.Encoding]::Default.GetString([System.Text.Encoding]::GetEncoding("iso-8859-1").GetBytes($response.Content)) # 解码
$contentObject = ConvertFrom-Json $decodedContent
if ($contentObject.result -eq "success")
{
Write-Output "登陆成功!"
}
else
{
Write-Output "登陆失败!"
Write-Output $contentObject.message
}
}
###########
# 开始执行
###########
login $args[0] $args[1] $args[2]
PowerShell 默认策略可能禁止执行脚本,修改参考:https://blog.iyatt.com/?p=10735
使用格式: 其中服务编号 0 校园内网,1 中国电信,2 中国移动
.\脚本文件名.ps1 账号 密码 服务编号
Ubuntu
PowerShell 基础参考:https://blog.iyatt.com/?p=8839
这里我以 Ubuntu 为例,演示一下脚本登录
环境:Ubuntu 20.04;PowerShell 7.3.3
2023.3.16 白嫖宽带的漏洞
这里说一个漏洞,就是手机卡停机或者注销后,都能一直使用宽带。
去年那一学期就有人停机偶然发现可以使用,就一直白嫖。这学期返校后,上个月最后一天 28 号我把手机卡注销了,到现在为止都还继续使用。
2023.3.26 今天宿舍停了一次电,不知道学校网络机房是不是停过电,再登陆账号就提示账号不存在了。我感觉是机房停过电,再启动就刷新了。
2023.4.21
有位兄弟在扫描校园网的时候,发现有不少电脑 guest 用户开着(没有密码),还有的 Administrator 用户密码简单甚至没有,都能连上去了
还有发现学校的服务器使用类似 cqutadmin 之类的弱密码,是打算向学校的网络中心反馈
另外发现有个服务:http://202.202.145.62 这个用内网下载的速度挺快的
2023.6.17 Windows 开机自动登录
测试环境:
- Windows 11 专业工作站版 22H2
- PowerShell 7.3.4
脚本
function login($username, $passwd, $service)
{
$url = "http://202.202.145.132/" # 校园网认证地址
$loginCount = 1 # 登录计数
Write-Output "正在准备登录......"
while ($true)
{
$res = Invoke-WebRequest -Uri $url -Method "GET"
if ($res.StatusCode -ne 200)
{
Write-Output "第 $loginCount 次尝试失败,正在等待网络连接,5 秒后将重试..."
Start-Sleep -Seconds 5
++$loginCount
}
else
{
break
}
}
if ($res.Content -like "*登录成功*") # 根据请求内容判断是否已经登陆
{
Write-Output "已登录成功,请勿重复登陆!"
Start-Sleep -Seconds 5
exit 0
}
$urlpre = "$res".Split("href='")[1]
$url = "$urlpre".Split("'</script>") # POST 请求头 Referer 参数设置这个
$referer = "$url".Split("?")[1] # POST 请求体 queryString 参数设置这个
# POST 请求头
$headers = @{
"Accept" = "*/*"
"Accept-Encoding" = "gzip, deflate"
"Accept-Language" = "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"
"Connection" = "keep-alive"
# "Content-Length" = "940" # 浏览器调试捕获到的值是 940,但是这里设置会出现错误。这个参数是请求体的长度,不设置会自动计算
"Host" = "202.202.145.132"
"Origin" = "http://202.202.145.132"
"Referer" = $url
}
# 通过传入的数字编号,设置服务
if ($service -eq 0)
{
$service = "校园内网"
}
elseif ($service -eq 1)
{
$service = "中国电信"
}
elseif ($service -eq 2)
{
$service = "中国移动"
}
else
{
Write-Output "服务编号选择错误,请选择: `n`n`t0 校园内网`n`t1 中国电信`n`t2 中国移动`n"
exit 1
}
$service = [System.Uri]::EscapeDataString($service) # URL 编码
# POST 请求体参数
$params = [ordered]@{
"userId" = $username
"password" = $passwd
"service" = $service
"queryString" = $referer
"operatorPwd" = ""
"operatorUserId" = ""
"validcode" = ""
"passwordEncrypt" = "false" # 不加密
}
# 根据捕获的信息,ContentType 为 application/x-www-form-urlencoded; charset=UTF-8
# 则请求体需要用 URL 编码后进行发送,参数间使用 & 符号连接
$body = ""
foreach ($key in $params.Keys)
{
$value = $params[$key]
if ($body -ne "") {
$body += "&"
}
$body += [System.Uri]::EscapeDataString($key) + "=" + [System.Uri]::EscapeDataString($value)
}
# POST 地址
$loginUrl = "http://202.202.145.132/eportal/InterFace.do?method=login"
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.41" # UA
$response = Invoke-WebRequest `
-UseBasicParsing `
-Uri $loginUrl `
-Method "POST" `
-WebSession $session `
-Headers $headers `
-ContentType "application/x-www-form-urlencoded; charset=UTF-8" `
-Body $body
$decodedContent = [System.Text.Encoding]::Default.GetString([System.Text.Encoding]::GetEncoding("iso-8859-1").GetBytes($response.Content)) # 解码
$contentObject = ConvertFrom-Json $decodedContent
if ($contentObject.result -eq "success")
{
Write-Output "登陆成功!"
start http://202.202.145.132
}
else
{
Write-Output "登陆失败!"
Write-Output $contentObject.message
}
Write-Output "5 秒后程序退出!"
Start-Sleep -Seconds 5
}
login 【学号】 【密码】 【服务编号】
把上面代码保存为后缀为 .ps1 的文件(最后一行填上登录信息,另外配置允许脚本执行,参考:https://blog.iyatt.com/?p=6815#toc-28 ),比如我命名为 login.ps1,路径 C:\Users\25143\login.ps1,打开注册表,进入路径 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,空白处右键新建字符串值,自己命名,然后在新建的值上右键修改。
另外要获取 PowerShell 解释器的路径,打开一个 PS 窗口,输入 $PSHOME 回车。 我是自己安装的 PowerShell 新版,结合路径,PS 绝对路径就是 D:\Program Files\PowerShell\7\pwsh.exe,如果是系统预装的就可能是 5.x,那么就是在路径后面加上 \powershell.exe
前面打开的注册表值就要填上 【PowerShell路径】 【登录脚本路径】,比如我这里
之后开机就可以实现自动执行登录脚本
代理问题 – 无法打开登录页面
这个是我在营业厅售后群看到问得较多的问题之一,时不时就有一个,基本上就是用梯子的,配置的设置系统代理,然后在关机的时候没有清除代理(关闭),导致开机后代理在,没法连接宽带认证页面。可以试着把梯子再开和关一次,直接点可以进系统的设置把代理关掉
登录报错说源 IP 和重定向中使用的 IP 不一致
这个也是看到问得比较多的,大概率是收藏了登录地址。打开 http://202.202.145.132 再登录就行,收藏也收藏这个地址,不要收藏浏览器打开这个地址后的链接
如果看过我前面的登录脚本的,应该就能懂了。正常登录过程会先向 http://202.202.145.132 发送 GET 请求,然后会返回一个链接(和登录环境有关,链接带有参数),这个返回的链接才是用来发送 POST 请求登录的。收藏打开后的链接就是把 GET 返回的链接收藏了,但是登录环境有变,参数不匹配的时候就会出现上面的错误
2023.6.18 自动登录配置修订
昨天写的自动登录配置方法在关机再开机后有效,但是如果是休眠恢复,睡眠唤醒等情况下就无效了,不属于开机启动的范畴,可以考虑使用计划任务,具体如下: (如果前面配置了注册表,记得删除自己创建的启动路径值)
右侧创建任务,名称和描述自己填
选项卡切换到触发器,新建触发器,选解锁时(即系统登录验证成功进入桌面时)
选项卡切换到操作,新建操作,程序或脚本就选使用的 PowerShell 解释器路径,添加参数就选脚本文件的路径
切换到设置选项卡,如果电源处勾选了使用交流电才启动就去掉勾选,否则笔记本电脑没插电源时就不会执行任务。
然后依次点确定完成保存,即设置完成
2023.6.27 宽带自动登录教程视频
https://www.bilibili.com/video/BV1BV411u7BW/?vd_source=9453a7920e4d389964b842511f86c189
2023.8.28 失效报告
昨天晚上有人反馈说宽带登录(路由器)两三分钟就被检测出来了,不过我毕业了,也没法继续研究测试。我也不清楚他是因为没配置好没生效,还是说校园网确实加大检测了。
我考虑了一下,前面采用的方案在常规上还可以注意一点,就是 MAC 地址。不知道校园网有没有判断登录设备(打开网页)和实际获得校园网分配 IP 的设备(路由器)两者的 MAC 一致。如果有的话,一个是可以把登录设备的 MAC 复制给路由器的 WAN 口,另外一种方案就是直接在路由器上完成登录,可以使用前面的 Python 登录脚本(还有效的话)。
如果校园网启用了流量分析的话,那单单一个路由器端就无解了。得像魔法上网一样操作了,在校园网外部部署一个公网可访问的服务端,在路由器上部署客户端,连接到路由器的流量全部经过加密传输到外面的服务端,再由服务端代理上网。那就得租用公网服务器了,或者家里有公网 IP 宽带的可以部署一个服务器。但是如果使用流量分析的话,学校的服务器压力就比较大了,可能出现同时上万台设备连接使用的情况,还要分别对每台设备的流量分析,这是不小的负载,应该就只是临时使用,或者只是随机抽样检测压力就小不少。
2023.9.17 Redmi AC2100 更新
前言
我有两个大学室友考研本校,他们在使用我之前的固件的时候,在十天内就被检测到两次,我不在学校了也不清楚具体的情况。这里我又重新编译的固件,采用的当前 OpenWrt 最新稳定版,以及最新的 UA2F。没想到 UA2F 后续又推出了很多更新,现在已经支持自定义 UA 了。
固件包名
20230917-openwrt-22.03.5-redmi-ac2100
固件编译
采用源码版本
OpenWrt v22.03.5
UA2F v4.3.3
源码修改
创建文件 /files/root/start,并添加可执行权限,写入(用于完成初始化工作)
#!/bin/ash
uci set system.@system[0].timezone=CST-8
uci set system.@system[0].zonename=Asia/Shanghai
uci commit system
echo "已将时区设置为 Asia/Shanghai"
uci set wireless.radio0.country='CN'
uci set wireless.radio1.country='CN'
uci commit wireless
wifi
echo "已将 WiFi 区域设置为中国"
sed -i 's_downloads.openwrt.org_mirrors.aliyun.com/openwrt_' /etc/opkg/distfeeds.conf
echo "已将软件源设置为阿里云镜像站"
# 启用 UA2F
uci set ua2f.enabled.enabled=1
# 自动添加防火墙规则
uci set ua2f.firewall.handle_fw=1
# 关闭 443 端口的流量处理(通常来说,流经 443 端口的流量是加密的,因此无需处理)
uci set ua2f.firewall.handle_tls=0
# 关闭微信的流量处理(微信的流量通常是加密的,因此无需处理。这一规则在启用 nftables 时无效)
uci set ua2f.firewall.handle_mmtls=0
# 关闭内网流量处理(如果你的路由器是在内网中,且你想要处理内网中的流量,那么请启用这一选项)
uci set ua2f.firewall.handle_intranet=0
# 应用配置
uci commit ua2f
# 开机自启
service ua2f enable
# 启动 UA2F
service ua2f start
echo "完成 UA2F 设置"
编辑 package/base-files/files/bin/config_generate,配置时间同步
# 找到 set system.ntp.enable_server='0' 改为
set system.ntp.enable_server='1'
# 找到 add_list system.ntp.server='0.openwrt.pool.ntp.org'
# add_list system.ntp.server='1.openwrt.pool.ntp.org'
# add_list system.ntp.server='2.openwrt.pool.ntp.org'
# add_list system.ntp.server='2.openwrt.pool.ntp.org' 改为
add_list system.ntp.server='ntp.aliyun.com'
add_list system.ntp.server='time1.cloud.tencent.com'
add_list system.ntp.server='time.ustc.edu.cn'
add_list system.ntp.server='cn.pool.ntp.org'
编辑 package/kernel/mac80211/files/lib/wifi/mac80211.sh,开启 WiFi,设置初始密码
# 找到 set wireless.radio${devidx}.disabled=1,改为
set wireless.radio${devidx}.disabled=0
# 找到 set wireless.default_radio${devidx}.encryption=none 改为
set wireless.default_radio${devidx}.encryption=psk2
# 接着下一行添加(设置初始 WiFi 密码)
set wireless.default_radio${devidx}.key=12345678
编译
(只提特殊修改的)
# 编译配置
make menuconfig
路由器平台
启用 UA2F 使用自定义代理
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
# 内核配置(耗时)
make kernel_menuconfig V=cs -j$(nproc)
Networking support ->Networking options ->Network packet filtering framework (Netfilter) 【要先选中再进去】->Core Netfilter Configuration -> 选中:
- Netfilter NFNETLINK interface
- Netfilter LOG over NFNETLINK interface
- Netfilter connection tracking support
- Connection tracking netlink interface
- NFQUEUE and NFLOG integration with Connection Tracking
# 下载依赖包
make download -j$(nproc) V=cs
# 编译
# 首次编译建议单线程,不要加 -j$(nproc)
make V=cs -j$(nproc)
使用提示
刷机后,进后台到终端里执行 ./start 完成初始化
2023.9.20 K2 更新
基于以前的路由器客户的需要更新固件
编译配置基于2023.9.17 Redmi AC2100 更新,但是因为 K2 只有 8M 闪存,所以主题使用的默认的,另外做了一点精简。因为手上没有 K2 的路由器所以没测试。
固件名:20230920-openwrt-22.03.5-k2
2024.6.5 关于学校宽带系统更新的说明(现有方案失效)
今天多个用户反馈无法登录。在尝试登录的时候会遇到下图的提示
尚不清楚怎么识别设备类型的,我离校差不多一年了,没法测试。根据找人测试的反馈,有较大几率排除 UA。早期的版本是统一替换为 FFFF…,但是找人测试替换为 Edge 浏览器 UA 的固件也不行。
解决方法探索
2024.6.5 路由器改 MAC
有位学弟尝试了把路由器 WAN 口的 MAC 改成电脑网卡的 MAC,然后网线连电脑登录,再把网线从电脑上拔掉,接到路由器上,这样路由器就是登录状态了。 登录状态是依靠 MAC 来保持的,这就是可行性,但是可能会不稳定,要是两个 MAC 相同且处于同级这种情况发生就会冲突。
2024.6.6
在宽带群,有位学弟提到荒野无灯的固件可以用(https://github.com/IYATT-yx/CQUT-Router/tree/main/1g ),找另外一位学弟试了下斐讯 K2 刷这个固件,确实能登陆上,设备被识别为电脑(这是个关键点)
所以怀疑是不是 OpenWrt 有什么特征被盯上了,非 OpenWrt 的固件或许可用,但是非开源的可能无法定制修改。虽然登录时不会被限制,但是多设备检测能不能过就不知道了。
那位学弟试了纯净版的 OpenWrt 也没问题,他提到可能是反检测屏蔽了过多的系统信息,校园网服务器检测不到信息就直接禁止登录。
考虑可行的设备分类方法,无非就是:①浏览器UA;②主机名;③MAC地址段
- 比如 OpenWrt 的固件默认主机名就是 OpenWrt,这就非常显眼,有位学弟测试了更改主机名后,似乎不掉线了
- 至于浏览器 UA,和原先方案考虑到的一样,用 UA2F 统一修改
- MAC 地址段,一个是校园网可能存在一个黑名单,已经认定是路由器的 MAC 被记录下来了,这种情况路由器网卡的 MAC 就废了,考虑把手机、电脑、USB 网卡等设备的 MAC 设置给路由器使用;另外一种情况,校园网服务器有 MAC 地址段的库(知道哪些地址段是分配给路由器网卡使用了),那同样需要把其它设备的 MAC 拿给路由器使用
(1)根据一位学弟的验证,一个临时的方案: ①套用 MAC:https://blog.iyatt.com/?p=6815#202465_%E8%B7%AF%E7%94%B1%E5%99%A8%E6%94%B9_MAC ②外加修改路由器主机名
(2)另外一位测试的方案是关掉 UA2F 就能登录了(也有测试关掉还是不行的),可能有其它因素,或者 UA2F 不是直接原因吧
2024.6.9 临时方案
使用没有 UA2F 的固件,可以自己找,或者采用下面的
OpenWrt 官方的固件下载:https://downloads.openwrt.org/releases/
我编译的 OpenWrt 固件:https://blog.iyatt.com/?p=11595
Padavan 固件:https://opt.cn2qq.com/padavan/
比如 OpenWrt 23.05.3 (当前的最新稳定版)的 MT7621 处理器的固件:https://downloads.openwrt.org/releases/23.05.3/targets/ramips/mt7621/
在里面可以看到小米 AC2100 和红米 AC2100的固件
方式一:
网线将校园网宽带连接到路由器 WAN 口,电脑连接路由器,正常登录
如果显示该设备类型不允许上网,尝试”方式二“
方式二:
1.查看电脑网卡 MAC 地址
打开 cmd
执行
ipconfig/all
比如我这里是三个网卡,根据“描述”来区分,第一个是我电脑内置的网口,第二个是USB扩展坞的网口,第三个是电脑内置的无线网卡
最终要使用哪个网卡来连接登录,就把对应网卡的“物理地址”那一串记下来,后面要用
2.设置路由器
电脑连接到路由器,进入后台
如果是 OpenWrt,参考我这里
①修改主机名
OpenWrt 固件默认的主机名就是 OpenWrt,这是很明显的特征,
可以复制电脑的主机名设置给路由器,或者编造一个
②修改 MAC
在”网络-接口“中,右侧看到 WAN 口,点击它的”修改“
在”高级设置“中,可以看到”重设MAC地址“,把前面记录的电脑网卡 MAC 地址复制过来,依次点保存应用
3.用网线把校园网宽带口连接到电脑的网口(前面记录MAC地址那个网卡),正常登录校园网后,把网线插电脑这边拔掉,插到路由器的WAN口上
4.其它所有设备直接连接路由器上网使用
注:后续重新登录,重复3步骤
2024.8.28
在读研的原大学室友反馈,登录界面变成办事大厅了,不再是通过独立的宽带账号进行认证,这样登录的逻辑也就变了。 估计出租账号的也会有顾忌了,毕竟要把自己的学生账号密码给出去。 现有方案是否有效我也不知道了,又一届毕业了,认识的在研究的也少了,还有放弃折腾的,看有没有人搞出新方案了。