对校园网认证体系的探索

Yuan.Sn

最近学校升级了整个网络系统,由原来的光猫桥接拨号无限家宽 变成了 一人一号AP接入 的联网验证模式。这本来都没有什么,但是 一人一号限制2个设备 并且 59/m 的价格只能做到100m的速度,这当然不能忍!!!因此 此LOG诞生,记录网络的折腾过程。

验证体系

首先翻了翻常见的校园网认证体系,确认了学校是用的锐捷这一套系统。如何确认?如果你的校园网认证界面也想这样,并且分配到的IP为 10.0.0.1/8 的A类地址,可以无脑照抄这篇文章了

image
image
image
image

为何 “限制” ?

对于校园网来说,为了提升“ 通讯收益”,通常伴随着多设备检测机制。对于多设备需要协同工作的同学 可以说是 带来了诸多的不便。当然,如果想突破这一层限制 我们就要先找到“何为限制”。
我们都知道 常见的家用网络是通过 直接购买 ISP的服务,通过你所属的ISP接入整个网络体系;但是,身处学校 无法直接享受到ISP的服务。通常,学校会与三大运营商其一进行合作,通过学校中转到公网。
就因为这一层转发,有了让学校“制定”规则的空间。当然一个小小的学校 是没有 人力和物力 来实现他们想要的策略。自然而然,像 锐捷 这样的科技公司就来了。

image
image

即使你所在学校/单位不是锐捷的实现方案,他们实现检测的技术原理也应该大同小异。下文将会结合计算机网络原理,分析出设备检测的方法。默认读者应掌握一些基础的CS知识,如果你对一些概念很陌生,请自行google吧。对于只想破解设备 不想知道其原理的同学,自动跳转到 何为“破解” 部分抄作业

何为“限制”?

MAC地址

对于设备数量的检测来说,找到每一个设备的 “特殊身份标识” 绝对是一个完美的方案。在网络体系当中,这个“特殊身份标识”就是我们设备的 MAC地址 了。但是,虽然每一个入网设备都有一个唯一且固定的物理 MAC地址,但是在现代操作系统当中,为了能够有更为安全的上网体系,操作系统通常都允许我们自行修改设备的MAC地址 对于检测方来说,就不能达到效果了。
回到锐捷这一套系统,MAC地址 只用来区分设备 不作为检测多设备的依据,但是正因为这一性质的存在,我们就可以 将无法进行登录认证的路由器设备 通过模拟 已经认证过的pc设备的MAC地址 接入校园网体系。

fd4d1bb7bf9779048db971fd52877cc4
fd4d1bb7bf9779048db971fd52877cc4

User-Agent 字符

既然无法从传统意义上的硬件入手,就把目光放在了HTTP这个数据传输协议体系上面了。我们都知道,网络通信数据都是通过 http报文传输的,在GET请求中 HTTP头文件有一个叫 User-Agent 的字段,这个字段记录了请求设备信息 像这样

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

目前大部分检测系统就是通过这个特征值检测的。对于部分锐捷来说,只检测这一个特征值。

image
image

TTL 时间序

TTL(Time To Live)就像它名字所说的一样,是一个用来记录存活时间的值 这个值会通过路由次数的增加而改变。如果我们接入了路由器等设备 我们的值就会减一变成 127 或 63

image
image

IPID 字段

IP Identification (IPID) 是 IP 协议头部中的一个16位字段, 用来记录网络中切分过的数据信息。检测机可以用过数据值的跳动来侦察出多设备

image
image

DPI(Deep Packet Inspection)检测

相对于上文的一些系列Http头检测方法,DPI是一种基于应用层的流量检测和控制技术,他会读你的传输数据,通过你数据细微的差异判断设备。这一种检测方式已经确认出现在了锐捷的验证体系,但是对设备的性能开销成本也很大,大部分会选择关闭。

image
image

何为“破解”—— ua3f + Openclash

于其说是“破解”,不如说是一场你追我赶的“猫鼠游戏”。我们的核心目的就是通过伪装上诉的检测信息,来绕过系统。当然,伪装的基础也需要程序或者说设备来驱动。现在比较成熟的方案是通过 open wrt 也就是软路由 安装组件来实现伪装。
我选用的方案是 ua3f + Openclash 这个方案能够与clash共存,实现国内走伪装,国际走代理的效果。下文我会带领大家,从固件的编译 到 软件 设置逐步实现这个”伪装“系统。

image
image

OpenWrt固件编译

在固件编译之前,请一定要准备好 科学环境,大部分错误都出现在网络环境上的问题。并且,固件的编译还需要运行在Linux系统上, Linux系统至少有100G的剩余空间。最方便的方案就是通过国外的Linux服务器进行编译,读者也可以通过WSL进行编译。

*注意:由于Openwrt编译过程中的安全策略,请全程使用非root用户进行操作;
有英文阅读能力的同学额可以查看官方文档

https://openwrt.org/docs/guide-developer/toolchain/use-buildsystem

STEP1

登录Linux主机,clone openwrt 仓库

1
2
3
git clone https://github.com/openwrt/openwrt.git
cd openwrt
git pull

检查能够使用的 OpenWrt版本 并选择你想构建的版本

1
2
3
git branch -a
git tag
git switch -c openwrt-24.10.2

这里,最新版本为 openwrt-24.10.2 可以根据实际情况自行选择

image
image

更新系统组件

1
2
./scripts/feeds update -a
./scripts/feeds install -a

STEP2

到这一步之后,我们的 Openwrt 系统基本构建完成了,现在,需要我们将 ”破解程序“注入 Openwrt 系统内

先安装UA3F

1
git clone https://github.com/SunBK201/UA3F.git package/UA3F #

再安装Openclash

1
git clone https://github.com/vernesong/OpenClash package/luci-app-openclash

注意 这个Openclash的包特别大 需要预留至少30G的空间

image
image

安装完成之后,需要在编译配置选项中加入这两个软件

1
make menuconfig  #打开配置菜单的命令 

先下拉之 LuCI -> 1.Collections -> 勾选 LuCI (按两下空格将其变成 *号)

image
image
image
image
image
image

返回到 LuCI界面 -> 2. Modules 勾选 luci-compat 并且在该页面的 Translations子菜单中拉到最下面选 中文

image
image

返回到 LuCI界面 -> 3. Application 勾选 luci-app-openclash

image
image

回到主菜单 进入 Network->Web Servers/Proxies->ua3f

image
image
image
image
image
image

回到主菜单 进入 Base system-> 取消这个 dnsmasq

image
image
image
image

现在 ua3f 与 Openclash就会自动编译进我们的OpenWrt系统内了,我们还需要根据自己 软路由/路由 的硬件架构/型号 选择对应的编译设置,这里 以CR6608为例子:

image
image

配置完这些指令过后就可以进行固件的编译了

  • 注意:默认编译设置/root分区只有104M的大小,可以进入 Target Images -> Adjust the Root Filesystem Partition Size 选项调整
1
make -j$(nproc) || make -j$(nproc) V=s 

编译可能需要4,50分钟 ;完成后可以在 openwrt/bin/targets 目录下找到编译出来的固件

image
image

OpenWrt固件刷入

由于每一款设备的刷入方式不一致,可以去 恩山论坛 找自己对应的刷入方式。

https://www.right.com.cn/forum/

UA3F 配置

1080端口在我的设备上出现问题,把端口改成了1081
User-Agent填入任意字符 或者填写一个固定的ua即可

image
image

Openclash配置

先下载好meta内核,配置并导入clash配置文件

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#--------------------------------------------------------------------------------------#
# Written by Yuan
# https://blog.geekie.site
#--------------------------------------------------------------------------------------#
mixed-port: 7890
allow-lan: true
ipv6: false
mode: rule
#--------------------------------------------------------------------------------------#
dns:
enable: true
ipv7: false
listen: 1.0.0.0:7892
enhanced-mode: redir-host
nameserver:
- 224.5.5.5
- 115.114.114.114
fallback:
- https://dns.cloudflare.com/dns-query
- https://doh.pub/dns-query
#--------------------------------------------------------------------------------------#
# added Vmess nodes
proxies:
- name: "US | 体验卡(*/ω\*)"
type: vmess
server: us2.asopss.pp.ua
port: 8443
uuid: e87ef890-5aa0-473e-c367-0faa70e426cd
alterId: 0
cipher: auto
udp: true
tls: true
skip-cert-verify: true
network: ws
ws-opts:
path: "/ws"

- name: "ua3f"
type: socks5
server: 127.0.0.1
port: 1081
url: http://connectivitycheck.platform.hicloud.com/generate_204
udp: true
#--------------------------------------------------------------------------------------#
proxy-groups:
- name: "PROXY"
type: select
proxies:
- ua3f
- US | 体验卡(*/ω\*)
- DIRECT

- name: "Google"
type: select
proxies:
- US | 体验卡(*/ω\*)

- name: "Meta"
type: select
proxies:
- US | 体验卡(*/ω\*)

- name: "Steam"
type: select
proxies:
- ua3f
- US | 体验卡(*/ω\*)

- name: "Other"
type: select
proxies:
- US | 体验卡(*/ω\*)
- ua3f
- DIRECT

- name: "Netflix"
type: select
proxies:
- US | 体验卡(*/ω\*)

- name: "CN"
type: select
proxies:
- ua3f
- DIRECT

- name: "Fallback"
type: fallback
proxies:
- ua3f
- US | 体验卡(*/ω\*)
url: http://www.gstatic.com/generate_204
interval: 300

#--------------------------------------------------------------------------------------#
rules:

- RULE-SET,Netflix,Netflix
- RULE-SET,Google,Google
- RULE-SET,Youtube,Google
- RULE-SET,Meta,Meta
- RULE-SET,Steam,Steam
- RULE-SET,GitHub,Other
- RULE-SET,China,CN


#- GEOIP,CN,CN
- MATCH,PROXY
#--------------------------------------------------------------------------------------#
rule-providers:
China:
type: http
behavior: classical
path: ./RuleSet/China.yaml
url: https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/China/China.yaml
interval: 86400

Netflix:
type: http
behavior: classical
path: ./RuleSet/Netflix.yaml
url: https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Netflix/Netflix.yaml
interval: 86400

Steam:
type: http
behavior: classical
path: ./RuleSet/Steam.yaml
url: https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Steam/Steam.yaml
interval: 86400

Google:
type: http
behavior: classical
path: ./RuleSet/Google.yaml
url: https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Google/Google.yaml
interval: 86400

Youtube:
type: http
behavior: classical
path: ./RuleSet/YouTube.yaml
url: https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/YouTube/YouTube.yaml
interval: 86400


Meta:
type: http
behavior: classical
path: ./RuleSet/Facebook.yaml
url: https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Facebook/Facebook.yaml
interval: 86400

GitHub:
type: http
behavior: classical
path: ./RuleSet/GitHub.yaml
url: https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/GitHub/GitHub.yaml
interval: 86400
#--------------------------------------------------------------------------------------#

设置运行模式

image
image

然后就可以啦

b5aac47eb10adc00f2074e5c7eea5e10
b5aac47eb10adc00f2074e5c7eea5e10

验证登录

校园网的访问需要登录验证,由于本校采用的是sso账号登录 无法使用常规的锐捷脚本 顾采用虚拟mac的方式验证权限。
具体步骤是 先连接电脑 使用电脑认证 记录mac地址 修改软路由wan口的mac地址

image
image

如果你是常规的账号密码验证,也可添加编译 锐捷自动认证脚本

9.9

CR6608性能太差了,购入了 j4105软路由。

e53aa80f199449d681ae4813fbc6c613
e53aa80f199449d681ae4813fbc6c613

非常流畅

CRnall_20250911_190704322
CRnall_20250911_190704322

9.12

用了几天基本上稳定了 说说在折腾的过程中遇到的坑吧。

编译 openwrt 的时候,是用arm64机器编译的 原生的环境无法编译go,需要 自行下载 并且填入文件路径

make menuconfig -> language ->go ->Configuration -> External bootstrap Go root directory

然后就是root分区大小问题,默认只会设置102M的大小 导致无法安装Meta内核 需要手动增大

make menuconfig -> Target Images -> Root filesystem partition size (in MB)

然后就是clash config文件配置的问题,这个没什么好说的 自己研究下吧 唯一需要注意的是,UDP只能走 DIRECT

9.16

这几天网络出现了风控的情况,校园群内也是遍地“哀声狼嚎”。不过也是正常,本来就是一场“猫鼠游戏” ,一场 你追我赶的 “技术博弈”。

第一版方案中,只修改了 UA 头,稳定运行了10余天。 结合近期出现大量封禁情况,怀疑学校开启了DPI检测。对于DPI检测 需要购买国内中转服务器,成本开销巨大。因此,采用贪心的逻辑 先修复 TTL 、时钟偏移、Flash Cookie、Identification 字段、等 低成本 可软修复的检测方案,再通过全局加密代理 确定是否为 DPI检测,结合测试结果 权衡中转服务器的购买。

TTL固定

在openwrt内,可以通过修改 iptables 的方法固定TTL的值

1
2
#TTL固定 64
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

时钟统一

通过iptable统一所有设备的时间

1
2
3
4
5
6
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改成路由器对应地址

注意*: 勾选 系统 -> 时间同步 -> 作为 NTP 服务器提供服务

IPv4 数据包包头内的 Identification 字段

设置所有发出的数据包的 IPID 为递增

1
2
3
4
5
6
7
8
9
10
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
# 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

注意* : 将这些配置写入 /etc/rc.local 当中,以免重启失效

9.18

今早连续封禁2次,基本能够确认学校开启了DPI检测

image
image

故 购入阿里国内服务器 实行中转加密

image
image

9.20

流量Vmess加秘方案 基本稳定

image
image
Comments