3202 字
9 分钟
校园网多设备检测原理浅析与方案
2026-06-21

前言#

在阅读本篇文章之前,推荐大家先看完该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

这里认证有两种方式:

  1. 访问你学校的portal认证页面输入账号密码登录
  2. 使用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 0
fi
# =========================================================
# 校园网认证核心配置
# =========================================================
# 账号与密码信息(已做 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 0
fi
# 如果状态码不是 204,说明未联网或被网关拦截,开始执行登录
echo "$(date '+%Y-%m-%d %H:%M:%S') - 网络未通 (状态码: $status_code),正在尝试自动认证..."
# 校园网登录的完整请求 URL
LOGIN_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&register_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
fi
elif echo "$resp" | grep -qE '认证成功'; then
echo "✅ 自动登录请求成功发送!"
else
echo "❌ 登录失败,网关响应内容:$resp"
fi
chmod +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

  1. 在 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_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
# 最后的 192.168.1.1 需要修改为路由器网关地址

若你的路由器通过NAT,lan口分配的局域网是A类网络,请将192.168.0.0/16改为10.0.0.0/8,并将192.168.1.1修改为路由器网关地址

  1. 安装UA3F模块后,在L3重写中打开删除 TCP 时间戳

TTL检测法#

TTL(Time To Live,生存时间)是 IP 数据包中的一个字段,用来限制数据包在网络中的存活时间,防止数据包在网络中无限循环转发

这里防TTL检测有两种方法:

  1. 在 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
  1. 安装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,更改软件源配置

SunBK201
/
UA3F
Waiting for api.github.com...
00K
0K
0K
Waiting...

点击上面

  • 安装所需依赖
opkg update
opkg install kmod-nft-queue kmod-nft-tproxy

  • 在github release中找到符合你路由器架构的ipk包,下载到本地
  • 在openwrt luci界面,找到 软件包-上传软件包,上传ipk包 安装

安装完成后,UA3F支持多种配置方案:

  1. NFQUEUE(最推荐)
  2. TPROXY
  3. SOCKS5 (需要搭配openclash使用,性能开销较大,不推荐)

启动之前,在 网络-防火墙中,把流量卸载类型改为

这三种配置方案都需要打开全局重写,然后修改User-Agent,可以直接修改为FFFFF

可点击此处查看修改是否生效—UA3F验证生效网站 或者 查看UA

IPID检测法#

IPID(Internet Protocol Identification)是 IPv4 头部中的一个 16 位标识字段,最初用于在 IP 数据包发生分片时帮助接收端重新组装数据。许多操作系统会按照一定规律(如递增或伪随机)生成 IPID,因此不同设备往往具有不同的 IPID 变化特征。IPID 检测法就是通过观察同一公网 IP 发出的数据包中 IPID 的变化规律,判断其背后是否存在多台设备。例如正常情况下 IPID 应连续增长,而如果检测到多个互不相关的增长序列交替出现,就可能推断该公网 IP 后面存在 NAT 共享上网的多台设备,从而被用于设备指纹识别或多设备检测。

EOYOHOO
/
rkp-ipid
Waiting for api.github.com...
00K
0K
0K
Waiting...

需要固件编译支持 kmod,需要将插件和固件的源代码一起编译

opkg install kmod-rkp-ipid

Flash 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 DROP

QUIC#

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 update
opkg 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
vernesong
/
OpenClash
Waiting for api.github.com...
00K
0K
0K
Waiting...

下载github release中最新版的openclash ipk软件包,在openwrt luci界面,找到 软件包-上传软件包,上传ipk包安装

Releases · MetaCubeX/mihomo

手动下载 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: 7890
allow-lan: true
mode: rule
log-level: warning
ipv6: 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-querydns.alidns.com/dns-query,最后保存配置
  • 在网络-DHCP/DNS中,将Dnsmasq 的 唯一授权 打开
  • 在 网络-接口-lan-编辑-高级设置 中,关闭自动获取 DNS 服务器

在路由器上可使用tcpdump抓包分析是否开启成功

tcpdump -i eth0 -w /tmp/wan_out.pcap

可行性分析#

使用tcpdump抓包,使用wireshark分析

在主包使用此方案两周期间,都没有产生封禁,因此可以肯定该方案是有效的

写在最后#

每个高校的校园网情况不一样,大家根据自己学校的情况选择对应的解决方案,在折腾的路上一定会遇到新的问题,善用AI和了解更多理论知识可以帮你更快地解决问题。在“攻克”校园网方面,前人也已苦校园网久矣,开发了一个又一个模块,至今没有一个彻底解决所有网络问题的方案,这本质是一场技术人对阵技术人的“博弈”。

参考文章:

关于某大学校园网共享上网检测机制的研究与解决方案

OpenWrt “破解“校园网共享,误区以及大致方向以及解决思路

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

校园网多设备检测原理浅析与方案
https://blog.litkg.com/posts/校园网多设备检测原理浅析与方案/
作者
南栀
发布于
2026-06-21
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录