全新方案-懒人福音-无需手动编译修改UA-校园网防检测

date
Mar 3, 2021
slug
change-ua-by-proxy
status
Published
tags
Network
summary
type
Post
关于某大学校园网共享上网检测机制的研究与解决方案
关于本校的校园网,相信大家都知道是禁止单一账号下多设备同时访问互联网的,具体表现为 1 个账号只能同时让 1 台有线设备和 1 台无线设备接入互联网,这给我们一些拥有多设备的同学带来了很大的不便,因此不少同学想到了使用家用路由器的方式来解决这个为问题,然而校园网会进行共享上网检测,一旦发现一个 IP 下有多个不同设备的流量,就会封禁账号 2-8 小时不等,害的同学们怨声载道。 然而奇怪的是本校内竟无应对此检测的方案,俗话说得好,道高一尺魔高一丈,肯定是有办法解决这个问题的。 因此本人出于学术兴趣,针对本校校园网共享上网检测机制进行了研究分析,并针对该机制提出了一些解决方案。 校园网认证系统:Drcom Web Portal 认证 对于家用的上网资费,平均一年就要数百甚至上千元人民币,而校园网的资费一般都很低,如果一个宿舍只用一个账号一个路由器就可以实现全员上网的话,那ISP肯定要亏死,因此肯定会封禁像路由器这种设备的。 基于 IPv4 数据包包头内的 TTL 字段的检测 基于 HTTP 数据包请求头内的 User-Agent 字段的检测 DPI (Deep Packet Inspection) 深度包检测技术 基于 IPv4 数据包包头内的 Identification 字段的检测 存活时间(Time To Live,TTL),指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。 每当数据包经过一个路由器时,其存活次数就会被减一。当其存活次数为0时,路由器便会取消该数据包转发,IP网络的话,会向原数据包的发出者发送一个ICMP TTL数据包以告知跃点数超限。其设计目的是防止数据包因不正确的路由表等原因造成的无限循环而无法送达及耗尽网络资源。 这是一个比较有效且合理的检测技术,IPv4数据包下存在 TTL(Time To Live)这一字段,数据包每经过一个路由器(即经过一个网段),该TTL值就会减一。 不同的操作系统的默认 TTL 值是不同的,Windows
关于某大学校园网共享上网检测机制的研究与解决方案

阅读过上面两篇文章的同学可以发现,手动编译OpenWrt是一件很痛苦的事。 显然对于一些动手能力不强的同学来说,通过 UA2F 修改UA是比较困难的。而且,UA2F从设计层面上也存在一些问题,例如无法处理网卡分包等情况。
因此,我们需要一种更加简单的方案,既能无需编译OpenWrt,又能更好的满足我们的需求。
之前我曾经提到过我们可以通过加密流量来实现防检测,但我当时并没有采取这个策略,因为进行全局加密网络流畅度影响太大, 而进行部分加密目前市面上还没有很好的解决方案(之前是这么认为),目前大多数加密软件都是基于规则的加密,但支持的多为针对域名的加密。
然而我们的需求是针对http应用层的加密,这类加密方案目前支持的不多。
经过我深入了解,Clash 中 DstPort 是我们最理想的规则选项,我们可以指定代理目标端口为http的80端口从而实现http应用层的加密。
此外,除了针对http的加密外,我们还可以通过支持Mitm的网络调试工具对http中UA进行重写以达到修改UA的目的。
基于上面的分析,我总结了以下方案:

Windows 用户

使用Clash,添加规则:
- DST-PORT,80,proxy
加入以上规则即可实现针对80端口的加密

Andorid 用户

使用Clash,添加规则:
- DST-PORT,80,proxy
加入以上规则即可实现针对80端口的加密

iOS 用户

使用Quantumult X/Surge等支持重写的工具,添加重写规则:
# Quantumult X
^http:// url request-header (\r\n)User-[A|a]gent:.+(\r\n) request-header $1User-Agent: F$2
# Surge
^http:// header-replace User-Agent F
加入以上规则即可实现针对UA的重写

Mac 用户

使用Quantumult X/Surge等支持重写的工具,添加重写规则:
# Quantumult X
^http:// url request-header (\r\n)User-[A|a]gent:.+(\r\n) request-header $1User-Agent: F$2
# Surge
^http:// header-replace User-Agent F
加入以上规则即可实现针对UA的重写

OpenWrt 配置

使用OpenClash,添加规则:
- DST-PORT,80,proxy
如果在OpenWrt加入这条配置,那么就无需进行其他终端的配置了。

其他

对于 TTL 和 NTP 方面,我们无需进行手动编译,常见的OpenWrt固件都能够默认支持。 对于 IPID,我认为无需关注,基于IPID的检测我认为是不现实且很少见的。
如果有疑问可以加讨论组:

© SunBK201 2020 - 2026