banner
MoeMagicMango

MoeMagicMango

Seeker, In searching of darkness.
github
steam

关于锐捷校园网下防代理检测的思路和解决记录

感谢国家教育部和相关部门的大力支持下,校园网的发展从一人一号,已经发展成了一号一终端的情况

本文档有较大更新,此文档按照锐捷官方说明编写,感谢 SunBK 和 Rusyneir 大佬帮助

前言#

虽然说我们这边的情况是百兆年费 180,不过有一说一,一号一终端的设备情况下实在是过于麻烦,如果通过电脑开热点的方式来解决此问题,就会出现被封禁 15 分钟黑名单的情况,属实是过于难受了。不知道哪个没🐴的人想出来的

不过根据校内的情况来说,貌似除了某宝购买校园网版路由器的使用情况外 (又贵又麻烦,质量还低),貌似没有对付校园网对于共享热点封禁的较好解决方案。道高一尺魔高一丈,上有政策下有对策,于是根据我的实战经验,分析了本校可行的共享实验方案


首先呢,我先挂上我们学校的校园网认证验证页面:
campusnetworkindex

如果你们校园网的认证界面和我们这边界面一致,恭喜你,这是他妈的锐捷校园网认证服务

RG-SAM: https://www.ruijie.com.cn/cp/yyxt-yygl/samx/
如果按照正常的方式去利用电脑热点来躲开校园网的限制:
血压升高
image

原理#

校园网检测,无非也就是判断基于 NAT 子网共享的情况,检测一个 IP 下对于多个设备的识别特征能力

根据服务器算力的情况,校园网的检测应该是根据心跳事件进行随机抽取检查数据包的,并非即时反馈:

有目前两种反馈情况:

一种是基于 UA

UA 中带有操作系统名,如果同时出现多个,那么就能判断出一个设备联网共享给多个设备使用。

校园网是随机抽查部分用户检测,只要检测到一次,那么后面就会专门盯着你的账号。

分析上网特征也是要消耗服务器资源的,对全部上网用户同时检测服务器负载严重。校园网经常炸的原因

一些人在使用模拟器时也可能会被检测到代理上网,原理很简单。你登录的电脑把网络共享给安卓模拟器使用,两边的网络服务通信时,UA 可能不一样,特征和使用路由器很像,校园网可能会被识别到。

另一种是不明显但已经被用于技术上实现的技术

DPI (Deep Packet Inspection) 深度包检测技术

目前做的比较好的有 --> 深信服

根据一部分高校对于校园网共享的实战,已经总结出下列的情况:

  • 基于 IPv4 数据包包头内的 TTL 字段的检测
  • 基于 HTTP 数据包请求头内的 User-Agent 字段的检测
  • DPI (Deep Packet Inspection) 的深度包检测技术
  • 基于 IPv4 数据包包头内的 Identification 字段的检测
  • 基于网络协议栈时钟偏移的检测技术
  • Flash Cookie 检测技术

根据官方文档证实,已经确定使用 DPI 技术 + UA 检测手段

基于 IPv4 数据包包头内的 TTL 字段的检测#

存活时间(Time To Live,TTL),指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。
每当数据包经过一个路由器时,其存活次数就会被减一。当其存活次数为 0 时,路由器便会取消该数据包转发,IP 网络的话,会向原数据包的发出者发送一个 ICMP
TTL 数据包以告知跃点数超限。其设计目的是防止数据包因不正确的路由表等原因造成的无限循环而无法送达及耗尽网络资源。

这是一个比较有效且合理的检测技术,IPv4 数据包下存在 TTL(Time To Live)这一字段,数据包每经过一个路由器(即经过一个网段),该 TTL 值就会减一。

不同的操作系统的默认 TTL 值是不同的,Windows 是 128, macOS/iOS、Linux 是 64。

因此如果我们自己接入路由器到校园网,我们的通过路由器的数据包会变为 127 或 63,一旦校园网抓包检测到这种数据包 TTL 不是 128 或 64,就会判定为用户接入了路由器。

基于 HTTP 数据包请求头内的 User-Agent 字段的检测#

HTTP 数据包请求头存在一个叫做 User-Agent 的字段,该字段通常能够标识出操作系统类型,例如:

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

Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)
AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405

校园网会通过多次抓包检测此字段,若发现同时出现例如 Windows NT 10.0 iPad 的字段,则判定存在多设备上网。

DPI (Deep Packet Inspection) 深度包检测技术#

这个检测方案比较先进,检测系统会抓包分析应用层的流量,根据不同应用程序的数据包的特征值来判断出是否存在多设备上网。

具体可参考:基于 dpi 技术的网络共享设备检测方法及系统

此种方式已确认在锐捷相关设备上应用,当由于此项功能极耗费性能,因此有些学校可能不会开启此项功能。

基于 IPv4 数据包包头内的 Identification 字段的检测#

IP 报文首部存在一个叫做 Identification 的字段,此字段用来唯 一标示一个 IP 报文,在实际的应用中通常把它当做一个计数器,一台主机依次发送的 IP 数据包内的 Identification 字段会对应的依次递增,同一时间段内,而不同设备的 Identification 字段的递增区间一般是不同的,因此校园网可以根据一段时间内递增区间的不同判断出是否存在多设备共享上网。

具体可以参考此专利:基于 ipid 和概率统计模型的 nat 主机个数检测方法

不过经过我的抓包分析,Windows 的 TCP/IP 协议栈对 Identification 字段的实现是递增,而 iOS 的实现是保持全 0,因此校园网是否使用了该检测机制有待商榷。

基于网络协议栈时钟偏移的检测技术#

不同主机物理时钟偏移不同,网络协议栈时钟与物理时钟存在对应关系,不同主机发送报文频率与时钟存在统计对应关系,通过特定的频谱分析算法,发现不同的网络时钟偏移来确定不同主机。

具体可以参考此专利:一种基于时钟偏移的加密流量共享检测方法与装置

此种方式具有一定的实验性,因此我不认为此种方式投入了商用。

Flash Cookie 会记录用户在访问 Flash 网页的时候保留的信息,只要当用户打开浏览器去上网,那么就能被 AC 记录到 Flash Cookie 的特征值,由于 Flash Cookie 不容易被清除,而且具有针对每个用户具有唯一,并且支持跨浏览器,所以被用于做防共享检测。

(经证实,本校使用了此类技术)

根据判断来说,锐捷校园网会使用 扫描全局端口 (重点 80 和 8080 非加密流量) + UA 审查 + DPI Wechat UnionID 加密方案

个人认为对 80 和 8080 端口进行加密是较好的选择方案

根据锐捷的文档,确定了此项目会使用 UA 检测手段 + 微信 UnionID 方式扫描,对症下药

方案#

临时解决方案 (ADB Revese)#

很抱歉,此类方法仅适合安卓 | 鸿蒙平台的设备不支持 Apple 下的 ipad & iphone 设备
这类方法是使用了Gnirehtet项目,可以通过 adb 的方式以隧道网络沟通的方式实现和电脑的连接
因为这种连接是自带加密属性的,所以可以用作于临时方案
这边我们使用晨钟酱的 GUI 版本 (有线上网器) https://jamcz.com/wirenet/
貌似不需要多介绍的,只需要有数据线连接电脑,从开发者工具打开 adb 调试即可使用

不过值得注意的是,在一层 NAT 环境下,仍然会有一定几率抓到

路由器配置方案 (OpenWRT + Clash)#

这是目前解决校园网不允许共享的路由器解决方案,不过这个方案仅可使用同号微信终端 (不同的号会被 DPI 抓到)

首先,你需要一台合适的路由器来安装我们所需的配置,这边使用的网件 WNDR 4300v2 ,在某鱼上只需要 50r 就可以收到一个成色不错的样式。如果预算较低可以选择 k2p,k2p 在固件上折腾的人数较多,有较多的教程可以参考。

同时,你需要一个可以用于加密的服务器,来帮助你加密未加密的方案,这边需要自备 x 自己摸索

[collapse status="false" title="Hide"] 找一下国内的免流机场 一般便宜且流量大 [/collapse]

OpenWRTFirmWare

↑ ↑ ↑

请在此处查找适合你路由器的框架,部分路由器不支持直接安装,如果必要,请按照 “xxx 安装 Openwrt” 的方式搜索安装

[scode type="yellow"] 请注意,麻烦试着查找您的路由器的不死固件 (Breed), 这能保护你的路由器不会因为一些误操作立刻变成一块砖头 | 虽然不是必选,不过为了安全建议优先刷入[/scode]

部分路由器可能需要进行 Factory+Sysupgrade 的方式安装

Openwrt 上的调试#

解决检测 TTL 问题#

方法很简单:修改 TTL 为固定值

通过 SSH 的方式连入后台,输入

# 在 OpenWrt 路由器上安装必要的软件包
opkg update && opkg install iptables-mod-ipopt kmod-ipt-ipopt

同时,在防火墙的自定义设置中,配置

iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

这一步保存后即可完成

UA 检测 (Clash 加密手段)#

这一步就是需要使用 Clash 的方法来处理

https://github.com/juewuy/ShellClash/blob/master/README_CN.md

配置好后,通过 sftp 的方式进入文件后台 或者事先配置好 (或者按照你喜欢的方式 只要能摸到后台文件就行)

在已经配置好的 config 文件里面 在 Rule 第一条上加入如下规则

- DST-PORT,80,Proxy
- DST-PORT,8080,Proxy
# WeChat & QQ 
- DST-PORT,80,Proxy
- DST-PORT,5222,Proxy
- DST-PORT,5223,Proxy
- DST-PORT,5228,Proxy
- DST-PORT,8000,Proxy # UDP
- DST-PORT,8001,Proxy # UDP
- DST-PORT,8080,Proxy
- DST-PORT,14000,Proxy

这边的 Proxy 是你的加密服务器,也就是你的 clash 服务,请按照情况进行配置

[scode type="yellow"] 如果配置成功的话,你的非加密接口应该是走的内核网络,实现了加密 [/scode]

基于网络协议栈时钟偏移的检测技术#

此步骤需要在局域网中建立 NTP 服务器统一时间戳

进入 OpenWRT 系统设置

勾选 Enable NTP client(启用 NTP 客户端)和 Provide NTP server(作为 NTP 服务器提供服务)

NTP server candidates(候选 NTP 服务器)填写:

ntp.tuna.tsinghua.edu.cn | ntp1.aliyun.com | ntp.tencent.com | time.windows.com

其实这四个源都是可用的 看你心情 x

进入 OpenWrt 防火墙设置,在 自定义设置 中填入以下内容

# 防时钟偏移检测
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 需要修改为路由器网关地址

确认效果:

在 Windows 电脑上,打开控制面板,在右上角查看方式处选择小图标,然后点击 “日期和时间”。点击 Internet 时间 -> 更改设置,点几次 “立即更新”,直到提示 “时钟在 xxx 与 xxx 同步成功”。

这时,暂时地拔掉墙上接口与路由器之间的网线(断开了外网的连接),再点一次 “立即更新”,应该仍然提示成功,这说明 NTP 请求已经被劫持到了路由器自身而不是外网。然后把网线插回

重定向#

自定义防火墙配置如下

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

即可

主路由 (OpenWRT + Clash + TTL + NTP + Flash) + 侧路由 ( OpenWRT + UA2F ) (二级 NAT)#

此可以对付多微信情况下的 DPI 穿透检测问题,是目前最稳定的手段,同时也避免了 UA2F 和 Clash 使用冲突

这个大概不是很麻烦,但是需要两个路由进行防检测,且两个路由器需要都可以支持 OpenWRT 使用

在第一个路由器上部署 OpenWRT+Clash+TTL+NTP+Flash 方案 ————> 作为主路由,连接校园网交换机
在第二个路由器上部署 OpenWRT+UA2F 方案 ————> 作为旁路由,作为无线设备共享

在第一个路由器上关闭 wifi 功能,作为交换机连接第二级路由
在第另一个路由器上配置好 UA2F 后,可以将所需要的设备共同连接上

[scode type="red"] 已知问题:如果宿舍内有王者玩家,请勿双方同时使用 wifi 功能进行游戏 (UDP 防检测无效)[/scode]

UA2F 编译#

这边使用 immortalwrt 源,自带编译包

Link 中 找到适合自己路由器的固件 ,在 "自定义预安装软件包" 中添加 ua2f 后进行 请求构建即可

如果不出意外的话 应该是这个样子的

builder

之后按照 openwrt 的安装方式安装即可

或者可以自编译到 OpenWRT 中,不过上手难度较高,建议查看相关教程。

总结#

经过上述的配置,可以达到预期的效果,实现在校园网环境下使用共享上网的方案

也有一种方案是 UA2F 的配合方案,此方案尝试过会在几小时内出现封号情况,不知是否是因为何种原因,不建议使用仅 UA2F 的方案。
如果想配置此方案 建议参考:

https://sunbk201public.notion.site/sunbk201public/OpenWrt-f59ae1a76741486092c27bc24dbadc59

https://learningman.top/archives/304

本文也经过了一系列的参考 根据实际学校情况编写.

Reference#

此文由 Mix Space 同步更新至 xLog
原始链接为 https://lemonkoi.one/posts/tech/6


加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。