这学期发现我们学校校园网(giwifi) 的检测貌似升级了,原来使用一个 root 软件就可以直接开热点共享设备的。现在几分钟就被检测到了。正好假期折腾了一个斐讯 k2p,对路由器也比较感兴趣,就花钱又买了 rax3000m, 目前也是比较稳定的在使用,所以就分享一下我折腾时的心得
格式写的很丑,惭愧

常用的检测手段

首先,我们要先知道校园网是怎么检测到你的异常行为的

参考于这篇博客关于某大学校园网共享上网检测机制的研究与解决方案

大致可以分为一下几种手段

  • TTL 字段检测:ttl 每经过一次路由器就会减一,如果校园网检测到不是常规的 ttl(Windows 是 128, macOS/iOS、Linux 是 64)。就会判定为异常
  • User-Agent 字段检测:HTTP 数据包请求头存在一个叫做 User-Agent 的字段,该字段通常能够标识出操作系统类型,例如:
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0
    如果校园网发现User-Agent 出现变动,也会判定异常
  • 基于 IPv4 数据包包头内的 Identification 字段的检测:IP 报文首部存在一个叫做 Identification 的字段,此字段用来唯一标识一个 IP 报文,在实际的应用中通常把它当做一个计数器,一台主机依次发送的IP数据包内的 Identification 字段会对应的依次递增,同一时间段内,而不同设备的 Identification 字段的递增区间一般是不同的,因此校园网可以根据一段时间内递增区间的不同判断出是否存在多设备共享上网。
  • DPI (Deep Packet Inspection) 深度包检测技术:这个检测方案比较先进,检测系统会抓包分析应用层的流量,根据不同应用程序的数据包的特征值来判断出是否存在多设备上网。但是很耗费性能,一般也不会使用
  • 基于网络协议栈时钟偏移的检测技术(NTP):不同主机物理时钟偏移不同,网络协议栈时钟与物理时钟存在对应关系,不同主机发送报文频率与时钟存在统计对应关系,通过特定的频谱分析算法,发现不同的网络时钟偏移来确定不同主机。
  • Flash Cookie 检测技术:几乎不使用

编译需要插件

如果你想要手动编译自己的插件,以下插件是必须的:

iptables-mod-filter 
iptables-mod-u32
iptables-mod-conntrack-extra
iptables-mod-ipopt
kmod-ipt-u32
kmod-ipt-ipopt
kmod-ipt-filter
iptables-mod-extra
kmod-ipt-extra
iptables-nft
ip6tables-nft
iptables-mod-nfqueue
kmod-ipt-nfqueue

# 以下为可选项
# 防ipid检测
kmod-rkp-ipid
# ua2f
ua2f

应对措施

既然常用的手段就这么几种,那我们就要见招拆招了

TTL 固定

解决方案:在防火墙固定 ttl 值
在OpenWRT 22.01 版本以后(包括)自带防火墙是 nftables ,以前的为 iptables。所以设置的手段有所不同。

nftables 设置防火墙规则

如果你是 nftables,那么你需要进入 ssh 来进行防火墙的修改或者使用 iptables-nft工具,可以自动将 iptable指令转换成 nftable指令,直接在系统->软件包然后搜索 iptables-nft然后安装即可。推荐使用 iptables-nft,比较方便。
创建用来修改所有流量包头TTL值的规则 12-mangle-ttl-128(128可以改成64,分别对应 windows 和 Linux/Android 默认的 TTL)

先进入终端,按下面操作进行

  1. 键入 cd /etc/nftables.d回车,该文件夹是 nftables 存档部分防火墙规则的文件
  2. 输入 vi 12-mangle-ttl-128.nft回车,以新建一个 nftables 的规则文件
  3. 轻敲键盘上字母 I键进入编辑模式
  4. 复制以下代码,再通过按 CTRL + Shift + V 来将代码粘贴进去
    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
    }

根据自己需求,64、128 都是可以的

  1. 完成后先按键盘上的 Esc 退出编辑模式,再输入 :wq 回车就可以退出并保存文件了。

iptables 设置防火墙规则

在网络-防火墙-自定义规则中加入这一行,或者终端直接执行即可

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

记得重启防火墙
service firewall restart

一种对 ttl 的理解思路

资料来源:百度贴吧
市面上方案都是设置为一个固定值,我觉得不是很对,之前设置为255ping上级网关3分钟就给我断了,可能ttl值异常也会ban,我把这部分改为了一下,大致是经过路由器的包ttl加1,同时禁止ttl为1的包进入,并将进入包ttl设置为2防止二级路由,这样在防止校园网路由跟踪的同时,将发出的包ttl控制在了正常值:

通过 iptables 修改 TTL 值  
iptables -t mangle -A POSTROUTING -j TTL --ttl-inc 1
#防路由跟踪
iptables -A INPUT -m ttl --ttl-eq 1 -j DROP
iptables -A FORWARD -m ttl --ttl-eq 1 -j DROP
iptables -t mangle -A PREROUTING -i pppoe-wan -j TTL --ttl-set 2

UA 隐藏

目前常用的隐藏 UA 的手段是 UA2F 或者 UA3F
二者主要的差异有几点:

  1. ua2f 一般来说需要在编译固件的时候加进去,无法直接安装使用。ua3f 则可以快速安装配置
  2. ua3f 需要配合 openclash 或者 shellclash 使用,ua2f 则不需要
  3. ua2f暂时无法正则匹配UA,在某些验证UA的网页或应用上可能体验不好(但影响不大)
  4. 更多的差异可以自己使用体会,不多叙述

UA2F

首先你得有安装好 ua2f 的固件,无论是从恩山论坛上找,还是自己编译。我自己用的是在 openwrt.ai 上快速编译的,不用自己下环境,导入插件了。(但是据说有后门什么的,见仁见智吧)
推荐再配合一个 lucikap/luci-app-ua2f。可以实现 ua2f 的图形化界面,比较方便。
没有用终端执行下面的命令进行配置。

# 启用 UA2F
uci set ua2f.enabled.enabled=1

# 可选的防火墙配置选项
# 是否自动添加防火墙规则
uci set ua2f.firewall.handle_fw=1

# 是否尝试处理 443 端口的流量, 通常来说,流经 443 端口的流量是加密的,因此无需处理
uci set ua2f.firewall.handle_tls=1

# 是否处理微信的流量,微信的流量通常是加密的,因此无需处理。这一规则在启用 nftables 时无效
uci set ua2f.firewall.handle_mmtls=1

# 是否处理内网流量,如果你的路由器是在内网中,且你想要处理内网中的流量,那么请启用这一选项
uci set ua2f.firewall.handle_intranet=1

# 使用自定义 User-Agent
uci set ua2f.main.custom_ua="Test UA/1.0"

# 禁用 Conntrack 标记,这会降低性能,但是有助于和其他修改 Connmark 的软件共存
uci set ua2f.main.disable_connmark=1

# 应用配置
uci commit ua2f

# 开机自启
service ua2f enable

# 启动 UA2F
service ua2f start

# 读取日志
logread | grep UA2F

PS:我记得在使用的时候,处理 443 端口还是内网的话会导致无法进入校园网认证网页,因为我们学校的是 http 网页。仅供参考

UA3F

ua3f 支持多种方式部署,这里我就直接安装了。终端执行命令

opkg update
opkg install curl libcurl luci-compat
export url='https://blog.sunbk201.site/cdn' && sh -c "$(curl -kfsSl $url/install.sh)"
service ua3f reload

ua3f 自带图形化页面,安装后刷新页面启用即可。
使用路由器实现校园网多设备防检测-202502252212|500
但还需要进行代理的配置,建议参考作者给出的教程,非常详细。
详见: UA3F 与 Clash 从零开始的部署教程

PS:如果安装后发现无法生效,可能你需要添加这两行规则

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
DNS 问题

在 ua3f 中,可能会出现部分网页打不开,游戏进不去等情况。可能是路由器的 dns 出现了问题。
以 shellclash 为例,进入管理面板,内核功能设置–切换dns运行模式–dns进阶设置–禁用dns劫持,然后退出重启服务,随后开启其他dns服务,例如chinadns-ng,或者smartdns。如果你没有装其他dns服务的话就把dnsmasq转发打开,这样似乎也行。这样问题就解决了。

参考于酷安-墨染_nlx 的帖子
补充smartdns 配置教程:OpenWrt安装并配置SmartDNS - Forever Young

某些网页或应用异常

如果你把隐藏 UA 设置成正常 UA 或者别的格式,可能会导致某些网页或应用异常。比如酷安图片无法加载。解决方案详见:支持更多正则表达式功能 · Issue #40 · SunBK201/UA3F

测试是否成功

进入 User-Agent Display 或者 UA检测-HTTP 查看,如果发现服务器 UA 出现 FFF,证明 UA 隐藏成功

IPID 检测

解决方案:修改所有数据包的 ID 字段为递增。
首先你的固件要编译进 rkp-ipid 模块
在路由器防火墙或者终端中输入以下命令

# 若没有加入rkp-ipid模块,此部分不需要加入
iptables -t mangle -N IPID_MOD
iptables -t mangle -A FORWARD -j IPID_MOD
iptables -t mangle -A OUTPUT -j IPID_MOD
iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN
#由于本校局域网是A类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网
# iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10

所以高版本的 openwrt 还是推荐下个 nft软件包,不然没法设置(但好像安装这个模块会直接加进去 QWQ)

NTP 防时钟偏移检测

解决方案:在局域网中建立 NTP 服务器统一时间戳路由器设置

  1. 进入 OpenWrt 系统设置, 勾选 Enable NTP client(启用 NTP 客户端)和 Provide NTP server(作为 NTP 服务器提供服务)
    候选 NTP 服务器分别填写:

    ntp1.aliyun.com, time1.cloud.tencent.com, stdtime.gov.hk, pool.ntp.org
  2. 防火墙规则添加

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

Flash 检测

虽然是几乎不用,但还是记录一下

# iptables 拒绝 AC 进行 Flash 检测
iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " src=\"http://1.1.1." -j DROP

全部代码

# @SunBK201 - https://blog.sunbk201.site
# ua2f开启自动添加防火墙功能会自动加入,不过还是自己加一下吧
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

# 通过 rkp-ipid 设置 IPID
iptables -t mangle -N IPID_MOD
iptables -t mangle -A FORWARD -j IPID_MOD
iptables -t mangle -A OUTPUT -j IPID_MOD
iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN
# 由于本校局域网是A类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网
# iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10

# ua2f 改UA
iptables -t mangle -N ua2f
# 由于本校局域网是A类网,所以我将这一条注释掉了,具体要不要注释结合你所在的校园网
# iptables -t mangle -A ua2f -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A ua2f -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A ua2f -d 192.168.0.0/16 -j RETURN # 不处理流向保留地址的包
iptables -t mangle -A ua2f -p tcp --dport 443 -j RETURN # 不处理 https
iptables -t mangle -A ua2f -p tcp --dport 22 -j RETURN # 不处理 SSH
iptables -t mangle -A ua2f -p tcp --dport 80 -j CONNMARK --set-mark 44
iptables -t mangle -A ua2f -m connmark --mark 43 -j RETURN # 不处理标记为非 http 的流 (实验性)
iptables -t mangle -A ua2f -m set --set nohttp dst,dst -j RETURN
iptables -t mangle -A ua2f -j NFQUEUE --queue-num 10010

iptables -t mangle -A FORWARD -p tcp -m conntrack --ctdir ORIGINAL -j ua2f
iptables -t mangle -A FORWARD -p tcp -m conntrack --ctdir REPLY


# 防时钟偏移检测
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

# 通过 iptables 修改 TTL 值
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

# iptables 拒绝 AC 进行 Flash 检测
iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " src=\"http://1.1.1." -j DROP

# 重启防火墙
service firewall restart

giwifi 防 mac 配置

我们学校的 giwfi 会通过 mac 地址来检测是否是多个设备,所以需要在连接校园网 WiFi 的时候手动设置 mac 地址为自己认证设备的 mac 地址

在路由器探索中的其他问题

使用 ssh 连接路由器

ssh [用户名]@[路由器IP地址] -p [端口]
#例如ssh root@192.168.20.1 -p 22
一个小问题

问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!-CSDN博客
原因是我重置路由器后虽然地址一样,但是 ssh 密钥不一样,重置一下就好了

ssh-keygen -R 192.168.20.1

更新软件包前最好先执行这个

opkg update  

uboot 刷固件

  1. 准备一根网线,固件
  2. 网线连接路由器和电脑,先按住 reset 再接通电源
  3. 打开控制面板–网络和共享中心–更改适配器设置,找到以太网,打开属性找到有 ipv4 的
  4. 将 IP 设置为 192.168.1. x
  5. 网关设置为 192.168.1.1(必须,uboot 默认地址。不然进不去)
  6. 此时浏览器在进入192.168.1.1 就到 uboot 界面了,上传固件就可以安装了

分区表坏了咋办

自己按上面教程进 uboot,然后登陆 http://192.168.1.1/gpt.html
然后上传分区表,重刷即可

参考来源

校园网防止多设备检测指北 · 瞳のBlog
基于UA3F的校园网防检测指南 - 九月的生活
openwrt ua2f校园网固件插件使用方法-OPENWRT专版-恩山无线论坛
路由器开启OpenClash国内访问变慢。 · Issue #300 · vernesong/OpenClash

NTP 设置

校园网禁止多终端共享上网解决方案

换主题

OpenWrt主题安装 | Forever Study

配置 docker

我自己还加了 docker,使用的时候发现了不少问题,这里记录一下

修改 docker 镜像源

网上教程都是要修改 /etc/docker/daemon.json 中的配置,但是我发现怎么修改都没有办法应用。
后面终于是找到了解决办法

  1. 找到 /etc/init.d 目录
  2. 编辑里面的 dockerd 文件
  3. 修改如下:procd_set_param command /usr/bin/dockerd --config-file= 后面的变量改为配置所在路径
    start_service() {
    local nofile=$(cat /proc/sys/fs/nr_open)
    process_config
    procd_open_instance
    procd_set_param stderr 1
    if [ -z "${DOCKERD_CONF}" ]; then
    procd_set_param command /usr/bin/dockerd
    else
    procd_set_param command /usr/bin/dockerd --config-file="/etc/docker/daemon.json"
    fi
    procd_set_param limits nofile="${nofile} ${nofile}"
    procd_close_instance
    }
    然后重启 docker:/etc/init.d/dockerd restart
    如图,镜像已经修改为我们配置的了
    ![[Pasted image 20250306130027.png]]
挂载路径

自带的 docker 空间给的很小,可以自己修改根路径

{
"data-root": "/opt/docker",
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"]
}

![[使用路由器实现校园网多设备防检测-202503071019.png]]