起因#
因为去年校园网升级到了千兆网,当时心动办了校园网。虽然校园网的有线网速度很快,但是限制设备数量为两台。而我的设备比较多,两台肯定不够用,并且校园网就只有有线网的速度可以。于是我了解了一下,决定使用红米 AC2100 路由器然后安装 OpenWRT 来实现校园网认证并共享网络给我的舍友。买路由器之前看了一些讨论,说他们学校有什么多设备检测之类的,但我当时安装路由器后并没有出现被检测到的现象,当时还在暗暗窃喜。
于是就在前几天喜提多设备检测。当天刚刚起床,舍友就给我说网没法用了,看了一下,说什么检测到分享网络,冻结 30 分钟。我人懵了,用了这么久咋突然被检测到了,后来去贴吧里一看才发现是突然加的,我的专业需要使用一些虚拟机,而且一些安卓模拟器也会被误报,真的十分影响体验。之后和吧里一位兄弟讨论得出大概是用的ttl检测(后来似乎加了其他的检测方式,不排除有很逆天的深度包检测)。于是去搜了一下多设备检测的绕过方法,在这里记录一下。
大致了解#
校园的多设备检测方式主要有 TTL 检测和 UA 检测。
这两种检测方式都是能很快查出来我们的流量是否是一个设备的,服务器只需要解析我们数据的包头就能知道我们的 TTL 值和 UA 了。所以我们要想办法让我们的数据包在到学校服务器的时候 TTL 值和普通的电脑一样(至少看起来一样),还要让我们的UA无法被识别,或者路由器下面所有设备通过路由器后统一成为同一个UA。
TTL修改#
存活时间(英语:Time To Live,简写TTL)是电脑网络技术的一个术语,指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。 每当数据包经过一个路由器时,其存活次数就会被减一。 当其存活次数为0时,路由器便会取消该数据包转发,IP网络的话,会向原数据包的发出者发送一个ICMP TTL数据包以告知跃点数超限。 其设计目的是防止数据包因不正确的路由表等原因造成的无限循环而无法送达及耗尽网络资源。
TTL 是最简单的多设备检测方式,因为 TTL 每过一个路由值都会 -1,所以只需要抓包然后读出我们的包头里面的 TTL 值是否是一般情况下系统默认的 128 或者 64 就可以判断我们是否共享了网络。但在 OpenWRT 中我们可以简单的通过添加 iptables 或者 nftables 防火墙规则来实现路由器下所有设备 TTL 值的统一。
我们需要先确定自己路由器防火墙的类型。一般在 OpenWRT 22.01 版本以后(包括)自带防火墙是 nftables ,以前的为 iptables。可以在网页的路由器管理后台 系统->概览 看到固件版本。
确认了防火墙类型后,我们就可以开始设置防火墙了。
nftables 设置防火墙规则#
如果你是 nftables,那么你需要进入 ssh 来进行防火墙的修改或者使用 iptables-nft
工具,可以自动将 iptable
指令转换成 nftable
指令,直接在 系统->软件包 然后搜索 iptables-nft
然后安装即可。推荐使用 iptables-nft
。
如果你还是想使用 nftables
规则的话,以下是如何进入路由器的 ssh 的简单教程。
在自己电脑上利用终端(Windows Terminal)或者 cmd 键入以下命令。也可以使用更专业的 ssh 工具。
ssh root@<路由器网关地址>
回车后输入路由器管理员账户的密码(这里在输入时不会显示任何值,这是正常的,输入完成后回车即可)。然后就进入了路由器的ssh界面。
创建用来修改所有流量包头TTL值的规则 12-mangle-ttl-128
(128可以改成64,分别对应 windows 和 Linux/Android 默认的 TTL)
- 键入
cd /etc/nftables.d
回车,该文件夹是 nftables 存档部分防火墙规则的文件 - 输入
vi 12-mangle-ttl-128.nft
回车,以新建一个 nftables 的规则文件 - 轻敲键盘上字母
I
键进入编辑模式 - 复制以下代码,再通过按
Shift + Insert
(Insert在有的键盘上写的是Ins)来将代码粘贴进去
chain mangle_postrouting_ttl128 {
type filter hook postrouting priority 300; policy accept;
counter ip ttl set 128
}
chain mangle_prerouting_ttl128 {
type filter hook prerouting priority 300; policy accept;
counter ip ttl set 128
}
- 完成后先按键盘上的
Esc
退出编辑模式,再输入:wq
回车就可以退出并保存文件了。
完成后在命令行使用 service firewall restart
来重启防火墙即可。效果如图(图是之前截的,所以设置的值并不是128)。
iptables设置防火墙规则#
进入 OpenWRT 网页后台管理页的防火墙设置,在 自定义设置 中填入以下内容,然后点击右下角保存并退出即可。
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 128
UA 隐藏#
User-Agent 请求标头是一个特征字符串,使得服务器和对等网络能够识别发出请求的用户代理的应用程序、操作系统、供应商或版本信息。
学校可以通过多次抓包检测我们的数据包然后查找 UA 是否有同时出现两种不同的设备来判定我们是否有共享网络,所以我们需要消除可以识别设备类型的字段,或者统一所有设备的 UA 都是同一个设备的。
我这里使用的是 Zxilly 的 UA2F
Change User-Agent to F-string on OpenWRT router to prevent being detected.
先去 Releases 找到对应你路由器架构的 .ipk
包,下载后通过 OpenWRT 中的 系统->软件包 中的 上传软件包,然后点击安装。路由器的架构依旧可以在网页的路由器管理后台 系统->概览 看到 cpu 架构。当然你还是不知道你的路由器是什么架构的话可以去 系统->软件包 ,找到 配置opkg… 按钮,点击后在 /etc/opkg/distfeeds.conf
项中的镜像源地址会有 packages/
的字样,后跟的就是的路由器 cpu 架构,比如我的就是 mipsel_24kc
。
src/gz openwrt_core https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/targets/ramips/mt7621/packages
src/gz openwrt_base https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/packages/mipsel_24kc/base
src/gz openwrt_luci https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/packages/mipsel_24kc/luci
src/gz openwrt_packages https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/packages/mipsel_24kc/packages
src/gz openwrt_routing https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/packages/mipsel_24kc/routing
src/gz openwrt_telephony https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/packages/mipsel_24kc/telephony
下载并安装后需要进行一些设置,请参考 UA2F 的 uci command 部分进行设置。
然后就是需要关掉软件分流和全锥型NAT,有 TurboACC
的话也请尽量不要使用,不然 rkp-ipid
和 ua2f
可能会失效。
最终效果如图。
最终#
网络开发出来就是让我们来使用的,学校总是会以一些很让人不可理喻的理由来限制我们上网,这次加了检测的理由是去年有人使用学校的 IP 被诈骗了(说实话我猜不到是怎么用 IP 被骗了的),然后就来限制我们的网络自由。就算是限制成4台设备我可能都不会为了这个东西搞这么久。希望校园网越来越好吧。
参考#
- 知乎 鶴唳 的文章《适用于 Nftables 的 TTL 修改》
- 博客园 夜读春秋 的文章《iptables对报文中TTL的操作》
- Zero’s Record博客站 zero 的文章《校园网多设备检测绕过》
本文作者: 褐瞳さん
本文链接: https://hetong-re4per.com/posts/multi-device-detection/
版权声明: 本文文字在未特别注明下默认使用 CC BY-NC-SA 4.0 许可协议。