校园网防检测方案

本文建立在默认读者手上有OpneWrt系统的家用路由或者有路由刷机相关的经验基础之上

前言

大一时还能通过接普通路由来共享上网,大二伊始,GUT就实行一号两设备的限制,故有了我折腾的经历。为什么折腾校园网?一是为了稳定的上网环境,二是平均网费(GUT的校园网是500兆,足矣一窝网老虎使用),三是我始终认为手机开热点给电脑连是一种很妥协的方式。

经过了解,得知国内各高校校园网含有多种的检测方式(不一定全有),如下:

  1. 针对 IP 数据包的 TTL 字段的检测
  2. 针对 HTTP User-Agent 字段的检测
  3. 针对 TCP 时间戳计算时钟偏移的检测
  4. 针对部分应用特征的 DPI 检测(例如微信)

从上到下的检测力度和防检测难度依次加大。从社区中了解到大部分高校最多是UA检测,顶多再加个TTL检测,能上到深度包检测的高校少之又少。

User‑Agent 是 HTTP 请求头里的一行字符串,用来告诉服务器 “我是谁、用的什么浏览器 / 系统”。例如:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36

对同一账号或IP,学校网关统计 UA 标签:
若短时间内(或同时)出现 PC + 安卓 + iPhone的UA标识则被认定多设备共享。

而TTL检测:Windows=128、Linux / 安卓 = 64,同 IP 下 TTL 跳变→多设备。

应对的思路就有了:你看我的设备UA,那我就在路由器这一网关将所有局域网内设备的UA全部改成同一个,TTL也固定成一个合理的数值,比如63。那么在宿舍路由网关这一步处理完后到学校的网关这边看到的就是同一个UA和有一个不变动的TTL值–>学校网关判定这一账号只有一台设备在上网,就不会踢下线。
其实淘宝卖的那种“校园路由器”就是基于此原理,他的的机子都是二手收来,刷上闭源的gswifi(该系统由opnewrt魔改而来,同样,小米路由器的管理后台也是openwrt魔改的),就敢卖两三百,有这个钱不如去咸鱼淘个R2S软路由,180 左右,性能还更强、可玩性更高、生态更庞大!

经过几周的折腾,我确信GUT有且仅有UA检测,不混合其他的检测。

UA插件

UA3F
UAmask

个人更喜欢UAmask,UA3F还存在较多次被踢的情况,且UAmask的作者就是借鉴UA3F的思路优化而来,资源占用更低,被踢的概率小很多(不能说一次都没有被踢,配合下面的自动化认证脚本食用更佳,被踢马上重新登入)

可以用ssh工具连接到软路由,用以下任意一条命令查看架构,以便选择正确的安装包。

1
2
uname -m  
opkg print-architecture # OpenWrt专用(更精确)

f8c2dc20-e06f-40a3-a473-f00dcfc7c6c8.png
929750e6-7ab6-402f-83a1-abef26912dfa.png
例如上面分别是R2S和红米AC2100架构信息输出情况,则我可以下载、安装的包有:

  • arch64_generic.ipk和aarch64_cortex-a53.ipk都能装,推荐后者,前者是通用安装包。
  • AC2100则安装mipsel_24kc.ipk
  • 不要下载 .apk,应选择 .ipk
    52aef4f7-afca-46a3-bc0d-a014e0f10847.png

上传安装包刷新网页即可。
61276857-cb2a-457b-9256-8d9f24b6e5b6.png


启用插件以及配置

各设置项的含义

f91f8e07-a115-4b5b-b745-f2b60601ee18.png

9bc11f8d-7d29-4e06-b787-f7fb56ba1862.png

5f11e68d-207d-44b2-95c0-83f1147ba39c.png

最后保存应用即可。


自动化认证脚本(可选,兜底)

  • 目的:在被踢时自动登入校园网,不用手动到网页认证。
  • 原理:通过抓包得到一个HTTP 请求脚本,就能做成脚本,模拟浏览器发请求,用 curl 模拟浏览器登录校园网 Dr.COM(哆点认证)
  1. 浏览器输入172.16.2.2打开GUT认证页,在登入前按 F12 打开控制台,填好账号和密码。
    6dde9522-794b-48cb-8929-b49af17f47ee.png

  2. 点击登入,找到名为login?backcall的请求。
    0b269e62-908c-4039-b2c9-26bb0053a84c.png

  3. 右键复制URL(base)到记事本备份。
    6e4054266527b7f4ed481da0f1aaedaa.png
    1dfaf2ac-c0f5-4508-a7de-4348e3c5cfa7.png

  4. 把上面的请求命令全部粘贴到下面的登入执行函数的花括号之中,其他的参数默认即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/sh
# ==================== 集中配置区====================
# 日志文件路径(默认/root目录,重启不丢失)
LOG_FILE="/root/auto_login.log"
# 日志最大保留行数,超过自动清空
MAX_LINES=5000
# 网络检测用的域名(可替换为更稳定的地址)
CHECK_HOST="www.baidu.com"
# ping检测超时时间(秒)
PING_TIMEOUT=3
# ping检测包数量
PING_COUNT=3
# 触发限速后的重试等待时间(秒)
RETRY_WAIT=5

# ==================== 函数区====================
# 统一日志输出函数
log() {
local level="$1"
local msg="$2"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${level} ${msg}" >> "$LOG_FILE"
}

# 登入执行函数
do_login() {
【URL粘贴在这里!!!(推荐在curl和hppt之间加一个参数-s,注意参数-s前后都有一个空格)】
}

# 登录结果判断函数(兼容新登入成功/已在线两种情况)
is_login_success() {
local resp="$1"
echo "$resp" | grep -E '"result":1|clientip online' > /dev/null 2>&1
return $?
}

# ==================== 主逻辑====================
# 1. 网络连通性检测
ping -c $PING_COUNT -W $PING_TIMEOUT "$CHECK_HOST" > /dev/null 2>&1
if [ $? -ne 0 ]; then
log "⚠️" "网络断开,尝试登入..."

# 2. 首次登入执行
RESPONSE=$(do_login)
log "" "登录响应: $RESPONSE"

# 3. 特殊情况:恰好碰到断网3秒内的时刻(此时无法登入,要等待三秒之后才能登入),等待几秒后再次重试
if echo "$RESPONSE" | grep -q "error5"; then
log "⚠️" "等待$RETRY_WAIT秒后重试..."
sleep $RETRY_WAIT
RESPONSE=$(do_login)
log "" "重试登录响应: $RESPONSE"
fi

# 4. 最终登录结果判断
if is_login_success "$RESPONSE"; then
log "✅" "登录成功!"
else
log "❌" "登录失败!"
fi

else
log "网络正常!"
fi

# ==================== 自动日志清理 ====================
if [ -f "$LOG_FILE" ]; then
LINE_COUNT=$(wc -l < "$LOG_FILE")
if [ "$LINE_COUNT" -gt "$MAX_LINES" ]; then
> "$LOG_FILE"
log "" "日志已清空,重新记录(超过 $MAX_LINES 行)"
fi
fi

最后把文件的后缀从 .txt 改成 .sh,文件名自定义,在ssh工具中拖放在/root下即可。

  1. 在OpenWrt后台的系统–>计划任务中添加两条规则:
1
2
3
* 7-22 * * * /root/auto_login.sh  #格式是: 分 时 日 月 周 执行的命令,每天的7:00-22:59的每一分钟都执行一次root目录下的自动认证脚本

40 6 * * * /sbin/ifdown wan && sleep 5 && /sbin/ifup wan # 每天6:40重启wan口,以防路由器进入假死
  1. 提权
1
chmod +x /root/auto_login.sh
  1. 查看日志
1
cat /root/auto_login.log

参考&致谢

UA3F作者:
https://github.com/SunBK201/UA3F
https://blog.sunbk201.site/posts/crack-campus-network
UAmask作者:https://github.com/Zesuy/UA-Mask
blbl@正二三月:https://www.bilibili.com/video/BV1Yf421o779/?share_source=copy_web&vd_source=36ed1d2e47ac14f687ed1e9f8afd9c10