使用UA3F来对抗校园网UA检测

FOXBALL-ONE Lv1

阅读前提

本文需要读者具备一定的计算机网络基础知识,能够理解相关术语的含义。

前言

本人所在的校区此前具有多设备检测和竞争认证机制(后来登录的设备会把最早登录的设备挤掉),但通过路由器进行NAT转发即可规避多设备检测。然而本学期加强了检测机制,单纯的NAT转发已无法满足需求,因此展开反检测研究。

网络环境

我的网络环境由J1900安装OpenWrt作为软路由,下挂一个硬路由(H3C NX30Pro)并开启有线中继(从效果上看,相当于一个带无线功能的交换机)。这套配置此前能满足需求,但现在已失效。

📝 注意:所有操作均基于OpenWrt实现!

以下将按照时间顺序记录研究过程,供大家参考。

1. 发现检测

在认证完成后,发现学校网络中心官网发布了一篇文章,大致内容是强化了路由器检测和多设备识别。对我而言,这是一个重大变化(J1900的局域网中有6个设备,但只能认证3个设备,且需要手动打开Web进行认证,非常不便)。

2. 开始研究检测原理

根据前辈们提供的参考资料,存在以下几种检测方式:

TTL,IPID,UA检测,时间偏移检测,深度数据包检测

前面4种检测方式都还能比较简单解决,但是最后一种只能认命了,只能把所有的数据进行加密并转发(容易被请去喝茶)。

2.1 TTL检测

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

不同操作系统预设的TTL值不同:

  • Windows默认为128
  • Linux默认为64
  • UNIX默认为255

当检测设备发现数据包中的TTL值不同时,即可判断存在多设备(例如我的笔记本电脑和手机发送出去的数据包到达J1900 WAN口网关时的TTL值不同,TTL值不同即认为存在多设备)。

这一问题可以通过让路由器在数据包转发到WAN口网关之前进行处理来解决(修改TTL为同一预设值)。

处理方式:防火墙修改

1. 确定防火墙类型

一般在OpenWRT 22.01版本以后(包括)自带防火墙是nftables,以前的版本为iptables。可以在网页的路由器管理后台”系统->概览”中看到固件版本。

OpenWRT防火墙类型

(如图所示,我的是OpenWRT 24,防火墙为nftables)

2. 修改防火墙规则
nftables 设置防火墙规则

⚠️ 重要提醒:操作之前请备份好配置,防止误操作!

通过SSH连接到路由器,推荐使用root权限。

创建用来修改所有流量包头TTL值的规则12-mangle-ttl-64(64可以改为128,分别对应Linux/Android和Windows默认的TTL值)

  1. 输入命令:cd /etc/nftables.d
    这个命令是进入nftables存档部分防火墙规则的文件夹

  2. 输入命令:nano 12-mangle-ttl-64.nft

  3. 输入如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    chain mangle_postrouting_ttl64 {
    type filter hook postrouting priority 300; policy accept;
    counter ip ttl set 64
    }

    chain mangle_prerouting_ttl64 {
    type filter hook prerouting priority 300; policy accept;
    counter ip ttl set 64
    }
  4. 保存并退出(先按Ctrl+O进行保存,再按Ctrl+X进行退出)

  5. 重启防火墙,输入命令:service firewall restart

iptables设置防火墙规则

进入 OpenWRT 网页后台管理页的防火墙设置,在 自定义设置 中填入以下内容,然后点击右下角保存并退出即可。

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

结果:失败,还是秒死

2.2 UA检测

User-Agent 请求标头是一个特征字符串,使得服务器和对等网络能够识别发出请求的用户代理的应用程序、操作系统、供应商或版本信息。

学校可以通过多次抓包来检测我们的数据包,然后查找UA是否同时出现两种不同设备的UA,从而判断存在多设备。所以我们需要消除掉能表示出设备类型的字段,或者是将所有设备的UA都提供为一个设备的。

这里我采用的是UA3F。至于为啥不使用UA2F,是因为我安装不了,固件编译用时长且均失败了,所以只好使用UA3F了。

具体的安装过程我就不展示了,请各位自行安装。

这是安装成功之后的界面展示:

注意:这里是旧版本

UA3F界面

⚠️ 注意:本教程只适用于服务模式为socks5 模式(http模式类似,都是需要外部工具辅助)

UA3F配置步骤

  1. 勾选上方的启用,端口默认不用修改(如果端口被占用,请自行修改)
  2. 绑定地址推荐使用本地回环的 127.0.0.10.0.0.0 有泄漏风险
  3. 日志等级为 info 即可
  4. User-Agent那里推荐填写你上网认证时使用的UA(也就是你上网登录时用的哪个浏览器对应的UA,我这里是用QQ浏览器,所以推荐的UA是 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.569.400 QQBrowser/19.7.6765.400
  5. 剩下的都不用修改,点击右下角的保存并退出即可

这样UA3F就配置好了,但是还没完。

UA2F的使用是嵌入到防火墙的处理链中,所以能自己借助防火墙捕获流量并进行处理,但是UA3F仅提供一个socks5服务,需要借助其他工具捕获流量并进行处理。

在UA3F的作者给出的教程中,使用的是openclash来实现流量的导流,具体操作请去对应的教程查阅,这里就不再赘述了。

优化建议

如果你是已经正在使用OpenClash,那么稍微修改一下配置文件即可:

  1. 新增一个socks5节点,地址为127.0.0.1,端口为UA3F的监听端口,类型为tcp,节点名看你喜欢是啥就是啥(不需要验证,这也是为什么我不推荐监听地址为0.0.0.0的原因)
  2. 在直连节点组(例如全球直连之类的)中添加这个节点,在规则组选择节点时选择这节点
  3. 在规则中添加一规则:绕过进程名为UA3F的流量,具体请去参考教程和官方wiki
  4. 在规则中看到路由选择为DIRECT的都改为使用这个节点(有些配置是GEO-CN直接为DIRECT,不走直连节点组)

实现效果:其他流量正常走,只有国内方向的流量需要全部导向UA3F进行UA处理

⚠️ 免责声明:以下内容仅供学习参考,请勿用于非法用途,并且需要一定的相关基础才能理解。(仅仅提供一个思路,具体实现请自行查阅wiki)

我的解决方案

之所以没用OpenClash,是因为在我的实际使用中,UA3F处理不过来,体验不佳(开个网页转半天,感觉自己跟互联网有300ms+的延时)。

随后我想是UA在http中使用最为广泛,那么学校的检测方式多半也是基于http的,那我只需要让UA3F处理目标地址为国内并且协议是http的流量即可,其他的国内方向的数据直接不经过UA3F就好了(例如https和dns的数据其实是不需要经过UA3F)。

然后我就发现虚空终端内核并不支持根据协议作为路由选择条件,所以只能用其他方式实现。

这就是我的方案了:UA3F + 唱歌盒子

唱歌盒子的内核是支持根据协议作为路由选择条件的,正合我意。

⚠️ 注意:内核版本必须要是1.11+,因为1.11以上才支持协议嗅探

具体操作过程
  1. 添加节点:跟上文Openclash添加节点一样,这里不再赘述(请根据wiki进行配置)

  2. 添加绕行规则:添加进程绕行规则,防止重复代理(建议这一段规则放在最前面)

    1
    2
    3
    4
    5
    6
    {
    "process_name": [
    "ua3f","tailscaled"
    ],
    "outbound": "DIRECT"
    }
  3. 启用协议嗅探并配置路由选择

    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
    {
    "action": "sniff",
    "sniffer": [
    "http",
    "tls",
    "dns"
    ]
    },
    {
    "protocol": "dns",
    "action": "hijack-dns"
    },
    {
    "type": "logical",
    "mode": "and",
    "rules": [
    {
    "rule_set": "geoip-cn"
    },
    {
    "protocol": "http"
    }
    ],
    "outbound": "HTTP"
    }

配置解释

  • "rule_set": "geoip-cn" 是为了匹配流量为国内的,这里可以改成自己规则中的geoip-cn规则(反正就是匹配流量为国内的)
  • "protocol": "http" 为匹配http协议
  • "outbound": "HTTP" 是指定前面流量为国内,并且协议类型为http的走这一个出站(出站组的tag为 http )

⚠️ 注意:在outbound这里要么填写UA3F节点的tag,要么填写节点组的tag。我这里是新建了一个节点组,所以这里填写的是节点组的tag(这个节点组的tag是http,并且节点组中含有UA3F节点)

  1. 保存配置文件并启动内核进行上网测试

访问测试网站:http://ua.233996.xyz/ 查询结果

结果:主播已经用这套方案爽完了2个月了,全程没寄过(只有一次是因为持续登录时间过长,被临时kick了)

主播在这里祝大家早日脱离苦海吧。傻逼校园网,都沟槽成这样了还是高这么多限制

参考来源

向先行者们致意!

  • 标题: 使用UA3F来对抗校园网UA检测
  • 作者: FOXBALL-ONE
  • 创建于 : 2025-11-23 08:47:28
  • 更新于 : 2025-12-16 09:24:49
  • 链接: https://blog.utf-8.fun/2025/11/23/使用UA3F来对抗校园网UA检测/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论