前言
在阅读本篇文章之前,推荐大家先看完该up主的视频,以便你对本篇文章有更深的理解,本篇文章需要一定基础的计算机网络理论知识,有不懂的地方可以直接问AI
现代大部分高校的校园网采用了portal页面认证+多设备检测的方案,防止共享网络和多设备使用
本篇将结合软路由OpenWrt系统,从技术原理到技术方案一一解析
⚠️ 教学前置免责声明:
本文所涉及的所有技术(包括 OpenClash 策略、Fake-IP 机制、DoH 加密及 TTL 协议栈重构)均仅在局域网(LAN)和国内标准骨干网(DIRECT直连)层面用于网络分流优化、阻断隐私泄露、以及校园网多设备合规性测试。
本文不提供、不涉及、亦不鼓励任何形式的跨境非法网络代理转发。请读者务必遵守《中华人民共和国计算机信息网络国际联网管理暂行规定》,规范使用网络。
检测多设备上网的方式
| 方法 | 常见程度 |
|---|---|
| MAC 数限制 | 非常常见 |
| 同账号在线数 | 非常常见 |
| TTL 检测 | 常见 |
| HTTP User-Agent 字段的检测 | 常见 |
| 时钟偏移的检测 | 常见 |
| 深度 DPI检测 | 少数高校 |
| IPID检测 | 罕见 |
| 针对 Flash Cookie 检测技术的解决方案 | 已过时 |
目前没有可以直接判断各校园网使用的检测方式的方法,只能一个一个实验、排查
安装OpenWrt
本篇教程以Cudy TR3000 256MB版本作为演示,安装KWrt固件(OpenWrt第三方发行版)
先找客服要一个刷机安装包
- 进入TR3000的管理界面,打开“高级设置”—“固件升级”页面

- 选择
cudy_tr3000-256mb-v1-sysupgrade.bin过渡固件刷写 - 刷写成功后使用
192.168.1.1,随机输入一个密码访问原生OpenWrt - 再次升级OpenWrt固件。在当前界⾯中选择:系统->备份与升级,在“刷写新的固件“选项中,刷写名为
kwrt-06.01.2025-mediatek-filogic-cudy_tr3000-v2-mod-squashfs-sysupgrade.bin的固件

- 升级完成后,使用
10.0.0.1访问Kwrt,默认密码是root。
联网与认证
联网
大部分高校主要有以下两种联网方式:
- PPPoE拨号上网
- DHCP自动获取ip地址(比较普遍)
认证
本篇文章以portal web页面认证作为演示
在此之前,请将路由器wan口接入校园网的ap面板,将lan口连接你电脑的网口或者使用接入路由器wifi
这里认证有两种方式:
- 访问你学校的portal认证页面输入账号密码登录
- 使用shell脚本登录
这里介绍第二种方法:
- 打开你们学校的portal认证页面
- F12打开开发者工具后找到
网络(network)一栏,在登录的瞬间,浏览器会发送一条get/post类型的 HTTP 请求 ,找到请求网址后喂给AI,生成一个自动认证脚本,上传到路由器 - 执行脚本
脚本示例:
#!/bin/sh
# 显式定义环境变量,确保计划任务(Cron)在后台运行时能正常找到系统命令PATH="/usr/sbin:/usr/bin:/sbin:/bin"export PATH
# =========================================================# 【时间控制策略】每周日到每周三 00:00 - 08:00 不执行自动登录# =========================================================# 获取当前是星期几(0 代表周日,1-3 代表周一到周三,4-6 代表周四到周六)NOW_WEEKDAY=$(date +%w)
# 获取当前小时(00-23)NOW_HOUR=$(date +%H)
# 去除前导 0,防止 OpenWrt 的 ash 环境将 08 或 09 误判为非法的八进制数字NOW_HOUR=${NOW_HOUR#0}NOW_HOUR=${NOW_HOUR:-0}
# 判断是否满足排除时间段:周一(1)到周四(4) 且 小时小于 6 (即 00:00 至 05:59)if [ "$NOW_WEEKDAY" -ge 1 ] && [ "$NOW_WEEKDAY" -le 4 ] && [ "$NOW_HOUR" -lt 6 ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - [免打扰] 当前处于周一到周四 00:00-06:00 断网时段,脚本跳过不执行。" exit 0fi
# =========================================================# 校园网认证核心配置# =========================================================# 账号与密码信息(已做 URL 编码)ENCODED_ACCOUNT="%2C0%2C学号%40telecom"USER_PASSWORD="密码"
# 国内标准的 204 联网探测源(使用华为源,确保校园网环境下精准识别拦截)CHECK_URL="http://connectivitycheck.platform.hicloud.com/generate_204"
echo "--- 校园网自动登录脚本 (时间控制版) ---"
# 检查当前网络状态,超时时间设为 3 秒status_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 3 "$CHECK_URL")
# 如果返回 204 状态码,说明网络已经畅通,直接退出if [ "$status_code" = "204" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 网络已通 (状态码: 204),无需重复登录。" exit 0fi
# 如果状态码不是 204,说明未联网或被网关拦截,开始执行登录echo "$(date '+%Y-%m-%d %H:%M:%S') - 网络未通 (状态码: $status_code),正在尝试自动认证..."
# 校园网登录的完整请求 URLLOGIN_FULL_URL="http://192.168.180.3:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=${ENCODED_ACCOUNT}&user_password=${USER_PASSWORD}&terminal_type=1"
# 发送登录请求并获取网关返回的响应内容resp=$(curl -s "$LOGIN_FULL_URL")
# 判断是否已经在线if echo "$resp" | grep -q "已经在线"; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 检测到已经在线,尝试注销重连..." LOGOUT_URL="http://192.168.180.3:801/eportal/portal/logout?callback=dr1004&login_method=1&ac_logout=0®ister_mode=0" logout_resp=$(curl -s "$LOGOUT_URL") if echo "$logout_resp" | grep -q "协议注销成功"; then echo "$(date '+%Y-%m-%d %H:%M:%S') - 注销成功,重新登录..." # 重新登录 new_resp=$(curl -s "$LOGIN_FULL_URL") if echo "$new_resp" | grep -qE '认证成功'; then echo "✅ 重新登录成功!" else echo "❌ 重新登录失败,响应内容:$new_resp" fi else echo "❌ 注销失败,响应内容:$logout_resp" exit 1 fielif echo "$resp" | grep -qE '认证成功'; then echo "✅ 自动登录请求成功发送!"else echo "❌ 登录失败,网关响应内容:$resp"fichmod +x login.sh./login.sh- 再在 openwrt-启动项-本地启动脚本 中在
exit 0之前写入以下命令,实现重启后自动联网
# 自动登录(sleep 15; /bin/sh /root/login.sh > /tmp/login_auto.log 2>&1) &- 此外,你可以在openwrt-计划任务中添加脚本
*/10 * * * * /bin/sh /root/login.sh >> /tmp/login_log.txt 2>&1以实现每十分钟执行一次登录脚本,防止意外断网
时钟偏移检测法
每个设备的时钟都不完全准确,因此设备会留下独特的“时间漂移特征”,可以被远程识别。
因此,我们需要在局域网中建立 NTP 服务器统一时间戳,并删除 TCP包首部携带的Timestamp
- 在 openwrt luci-系统-常规设置中,将时区调为
Asia/Shanghai,在时间同步里 启用NTP客户端并将lan口绑定NTP服务器
使用以下候选NTP服务器
ntp1.aliyun.com, time1.cloud.tencent.com, time.ustc.edu.cn, cn.pool.ntp.org在 openwrt luci-启动项-本地启动脚本 中添加以下配置脚本
# 防时钟偏移检测iptables -t nat -N ntp_force_localiptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_localiptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURNiptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURNiptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURNiptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.1.1# 最后的 192.168.1.1 需要修改为路由器网关地址若你的路由器通过NAT,lan口分配的局域网是A类网络,请将192.168.0.0/16改为10.0.0.0/8,并将192.168.1.1修改为路由器网关地址
- 安装
UA3F模块后,在L3重写中打开删除 TCP 时间戳
TTL检测法
TTL(Time To Live,生存时间)是 IP 数据包中的一个字段,用来限制数据包在网络中的存活时间,防止数据包在网络中无限循环转发。
这里防TTL检测有两种方法:
- 在 openwrt luci-启动项-本地启动脚本 中添加以下配置脚本
# 强制将所有试图流向外网(WAN口)的 UDP 53 端口流量,重定向到路由器本地的 53 端口iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53# 强制将所有试图流向外网(WAN口)的 TCP 53 端口流量,重定向到路由器本地的 53 端口iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
# 通过 iptables 修改 TTL 值iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64- 安装
UA3F模块后,在L3重写中打开固定TTL
验证:在cmd中 ping 任意一个外网查看到达本机的TTL是否被固定为64
⚠️你从本机(无论是电脑还是手机)去ping 一个网址,在终端里看到的那个TTL值,是由目标服务器(或CDN节点)发回给你的 ICMP Reply(回显应答)报文中的 TTL 值。若需要抓取ICMP Request(去程)数据包,请使用wireshark进行抓包。

使用 UA3F 修改 UA
请先使用ssh连上路由器,opkg update 更新软件包列表,若出现更新报错,请在 openwrt-软件包-配置opkg中查看distfeeds.conf,更改软件源配置

点击上面
- 安装所需依赖
opkg updateopkg install kmod-nft-queue kmod-nft-tproxy
- 在github
release中找到符合你路由器架构的ipk包,下载到本地 - 在openwrt luci界面,找到 软件包-上传软件包,上传ipk包 安装
安装完成后,UA3F支持多种配置方案:
- NFQUEUE(最推荐)
- TPROXY
- SOCKS5 (需要搭配openclash使用,性能开销较大,不推荐)
启动之前,在 网络-防火墙中,把流量卸载类型改为无
这三种配置方案都需要打开全局重写,然后修改User-Agent,可以直接修改为FFFFF
可点击此处查看修改是否生效—UA3F验证生效网站 或者 查看UA
IPID检测法
IPID(Internet Protocol Identification)是 IPv4 头部中的一个 16 位标识字段,最初用于在 IP 数据包发生分片时帮助接收端重新组装数据。许多操作系统会按照一定规律(如递增或伪随机)生成 IPID,因此不同设备往往具有不同的 IPID 变化特征。IPID 检测法就是通过观察同一公网 IP 发出的数据包中 IPID 的变化规律,判断其背后是否存在多台设备。例如正常情况下 IPID 应连续增长,而如果检测到多个互不相关的增长序列交替出现,就可能推断该公网 IP 后面存在 NAT 共享上网的多台设备,从而被用于设备指纹识别或多设备检测。
需要固件编译支持 kmod,需要将插件和固件的源代码一起编译
opkg install kmod-rkp-ipidFlash Cookie 检测技术
Flash Cookie 会记录用户在访问 Flash 网页的时候保留的信息,只要当用户打开浏览器去上网,那么就能被 AC 记录到 Flash Cookie 的特征值,由于 Flash Cookie 不容易被清除,而且具有针对每个用户具有唯一,并且支持跨浏览器,所以被用于做防共享检测。
已过时,不建议添加
# iptables 拒绝 AC 进行 Flash 检测iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " src=\"http://1.1.1." -j DROPQUIC
QUIC 是谷歌开发的一种跑在 UDP 协议之上的下一代网络传输协议(也是 HTTP/3 的核心),它通过将连接与加密握手合二为一实现了 0-RTT 极速建连,并利用独立的信道彻底解决了 TCP 致命的队头阻塞和切网断连的痛点。
在最新的 UA3F 版本中(针对 eBPF 和 QUIC 的特性更新中),作者提供了一个核心解决方案:通过丢弃或拦截 UDP 443 流量强行禁用(Block)QUIC,逼迫浏览器退回到 HTTP/1.1 或 HTTP/2,然后再进行 UA 的修改。
但是,因为QUIC携带的数据包是加密的,校园网网关也并不能识别到HTTP的UA字段。但是,在 HTTP/3 建立连接时,其明文部分依然会暴露目标网站的 SNI 域名和TLS握手指纹。如果你的学校采用此种方法判断多设备检测,禁用QUIC是有效的,但是据我看来 这种方法还有待商榷。
DPI深度包检测法
解决思路:使用加密服务器
基本配置
⚠️ 根据相关规定,只有经过批准的跨境网络访问方式属于合法使用范围,个人未经许可使用“翻墙”工具访问境外网络通常被视为违规行为。
因此,本文中所使用的 OpenClash 仅用于本地网络流量的分流与规则管理,不作为跨境代理或非法网络转发工具使用。
安装OpenClash:
安装所需依赖
opkg updateopkg install bash iptables dnsmasq-full curl ca-bundle ipset ip-full iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base下载github release中最新版的openclash ipk软件包,在openwrt luci界面,找到 软件包-上传软件包,上传ipk包安装
手动下载 Clash内核 后解压到 /etc/openclash/core/文件夹,并将二进制文件命名为clash_meta
进入openclash的web控制台,会自动识别到clash_meta内核已就绪运行模式
- 插件设置-模式设置:运行模式强烈建议切换为fakeip(TUN混合)模式

fakeip模式原理如图(ChatGPT生成)
OpenClash通过在前面强行嵌套了一层 Fake-IP NAT,在路由器内部建立了一个中间人缓冲区。流量在这里被完全拆解、重组、清洗。在最终冲向校园网网关时,它不仅隐藏了 IP 数量,更把所有手机特有的高危指纹,全部洗成了软路由本身。
- 插件设置-流量控制:打开路由本机代理和禁用QUIC
- 覆写设置-DNS设置:打开
Fake-IP 持久化
最后再在配置管理导入如下配置文件(全部走直连)
mixed-port: 7890allow-lan: truemode: rulelog-level: warningipv6: false
profile: store-selected: true store-fake-ip: true
proxies: - name: DIRECT type: direct
proxy-groups: - name: DIRECT type: select proxies: - DIRECT
rules: - MATCH,DIRECT在启用之前,建议禁用路由器的IPv6的DHCP,避免连接异常
然后再回到OpenClash运行状态,将代理模式改为规则,关闭DNS代理、流媒体解锁。最后即可启用OpenClash
⚠️到此步已可以解决大部分高校的多设备检测问题,如果你所在的高校使用了更高级别的DPI检测法,我的解决思路是:合法购买使用国内的云服务器搭建加密隧道、开启加密DNS服务器、防止DNS污染。接下里我仅对开启DNS加密服务介绍一下
开启DNS加密服务器
通常情况下 **OpenWrt 刚连接校园网(WAN 使用 DHCP)时,WAN 口获得的 DNS 服务器就是校园网 DHCP 下发的 DNS。 **
- 插件设置-DNS设置:本地DNS劫持选择 使用
Dnsmasp转发 - 覆写设置-DNS设置:打开自定义上游 DNS 服务器,并在
nameserver中启用doh.pub/dns-query和dns.alidns.com/dns-query,最后保存配置 - 在网络-DHCP/DNS中,将
Dnsmasq的 唯一授权 打开 - 在 网络-接口-lan-编辑-高级设置 中,关闭
自动获取 DNS 服务器
在路由器上可使用tcpdump抓包分析是否开启成功
tcpdump -i eth0 -w /tmp/wan_out.pcap可行性分析
使用tcpdump抓包,使用wireshark分析


在主包使用此方案两周期间,都没有产生封禁,因此可以肯定该方案是有效的
写在最后
每个高校的校园网情况不一样,大家根据自己学校的情况选择对应的解决方案,在折腾的路上一定会遇到新的问题,善用AI和了解更多理论知识可以帮你更快地解决问题。在“攻克”校园网方面,前人也已苦校园网久矣,开发了一个又一个模块,至今没有一个彻底解决所有网络问题的方案,这本质是一场技术人对阵技术人的“博弈”。
参考文章:
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
