校园网防检测: UA3F - 新一代 UA 修改方法

前言

目前众多高校依旧对校园网络共享行为进行严格限制,具体表现为:

为了能够绕过校园网的接入设备数量的限制,有众多同仁对校园网的共享检测机制进行研究,我也在 关于某大学校园网共享上网检测机制的研究与解决方案 一文中归纳总结出校园网的共享检测常见方法:

其中上述的一部分方法随着历史原因与技术的迭代已经被废弃:

而剩下的时钟偏移的检测实际落地应用场景有待考证,DPI 检测技术由于会对网络设备造成过高的负载压力,因此部分高校可能不会开启此功能。

对于 TTL 字段的检测,目前已有成熟有效的方法能够绕过检测,即利用 netfilter/iptables 对 TTL 进行修改即可。 那么目前防检测方案唯一有待优化的就是剩下来的 HTTP User-Agent 头部检测,而 User-Agent 头部检测也是目前各大高校最常用的防共享检测方案之一。 在之前的工作中,有同仁提出了 XMURP-UA,一个用于修改 User-Agent 的内核模块,但是存在性能以及无法处理 80 端口以外的流量等问题;为了弥补 XMURP-UA 的端口覆盖不全的问题,UA2F 被提出,其最大的贡献在于借助 libnetfilter_queue 将 TCP Flow 进行 HTTP 解析并将 UA 修改,该方法能够处理任意端口流量。

但是经过长期的实践,UA2F 存在以下问题:

UA3F: 新一代 UA 修改方法

为了解决上述 UA2F 存在的问题,我提出一种全新的 HTTP User-Agent 修改方法: UA3F

UA3F

由上图所示,UA3F 依赖于 Clash 等基于规则的代理工具,UA3F 本身最为一个 SOCKS5 代理对本机提供服务,借助 Clash,UA3F 能够捕获入站全部流量,由 Clash 向 UA3F 转发的全部潜在的 HTTP 流量,这里值得注意的是,UA3F 可以接受任何基于 TCP 协议的流量,但是只关注于 HTTP,UA3F 会尝试解析 TCP 流并判断当前连接是否承载 HTTP 流量,如果判定非 HTTP 连接,则直接转发,如果判定为 HTTP 连接,则进行 HTTP 流量解析并定位修改 User-Agent 头部。

通过上述方式,UA3F 可以做到:

UA3F 使用

# 无参数执行,默认监听端口为 1080,默认 UA 修改为 FFF
./ua3f

# 可以修改监听端口与自定义 UA
# 以下通过下面参数可以让 UA3F 监听端口为 8080,UA 修改为 HELLO
./ua3f -p 8080 -f HELLO

UA3F 作为一个 SOCK5 服务,Clash 可以十分方便进行配接入,下面提供一个 Clash 的配置用于接入:

proxies:
  - name: "ua3f"
    type: socks5
    server: 127.0.0.1
    port: 1080
    url: http://connectivitycheck.platform.hicloud.com/generate_204

rules:
  - PROCESS-NAME,ua3f,DIRECT
  - MATCH,ua3f

这里值得注意的是,请确保 PROCESS-NAME,ua3f,DIRECT 置于规则列表的最顶部。 对于部分用户有代理加密需求的用户,可以在上述 2 条规则之间加入自定义的加密代理规则,例如:

rules:
  - PROCESS-NAME,ua3f,DIRECT
  - DOMAIN-SUFFIX,google.com,Proxy
  - MATCH,ua3f

通过与加密代理的配合,可以实现:

结束

校园网防共享检测的需求对我来说已经消失,但是观察到目前现有方法的限制与问题,我进行了 UA3F 的初步实现,目前已经开源: https://github.com/SunBK201/UA3F,UA3F 的实现处于初级阶段,可能存在一些问题,因此欢迎各位同学进行反馈与指正。

欢迎加入讨论组进行讨论交流:Telegram