前言
我们学校的校园网用的是 GiWifi 认证,套餐限制得很死——同时只能一个有线 + 一个无线设备在线。手机、平板、笔记本、Switch、智能家居……设备一多根本不够用,每次切换还要重新登录,烦得很。
折腾了一圈,最终用一台刷了 OpenWrt 的路由器搞定了多设备共享。核心思路就是:让路由器代替所有设备完成 GiWifi 认证,然后在路由器上做 NAT 转发,同时伪装流量特征,让校园网检测不到下面挂了多台设备。
本文记录完整的实现过程,包括检测原理分析和具体配置步骤。
一、GiWifi 是什么
GiWifi 是国内高校常用的一套校园网认证系统,采用 Web Portal 认证:
- 设备连上校园网后,获取 IP 但无法上网;
- 访问任意 HTTP 网站会被 302 重定向到 GiWifi 登录页(
http://10.100.100.2/gportal/web/login); - 输入账号密码提交,认证通过后即可上网;
- 服务端绑定认证设备的 MAC 和 IP,限制同时在线设备数量。
认证接口用的是 HTTP 明文传输(因为认证前还没联网),只是对登录参数做了 AES-128-CBC 加密(key 固定为 1234567887654321)。所以理论上可以写脚本自动登录,但这解决不了多设备限制的问题——因为 GiWifi 是按设备数限制的,不是按认证次数。
二、校园网怎么检测多设备
要绕过检测,得先知道检测原理。常见的手段有以下几种:
2.1 TTL 字段检测
IP 包头有个 TTL(Time To Live)字段,每经过一个路由器减 1。不同操作系统的默认初始 TTL 不同:
| 系统 | 默认 TTL | 经过路由器后 |
|---|---|---|
| Windows | 128 | 127 |
| Linux / Android / iOS / macOS | 64 | 63 |
如果校园网网关收到同一个 IP 的数据包,TTL 一会儿是 127、一会儿是 63,就说明下面挂了多台设备。
2.2 User-Agent 字段检测
HTTP 请求头里的 User-Agent 字段能标识客户端类型。比如:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/140.0.0.0Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 ...) ... Safari/604.1如果同一个 IP 下同时出现 Windows 和 iPhone 的 UA,就判定为多设备共享。注意:HTTPS 加密了请求体,但 TLS 握手前的 SNI 和部分 HTTP 头仍是明文,所以这个检测对 HTTPS 也部分有效。
2.3 IPID 字段检测
IP 包头的 Identification 字段用来唯一标识一个 IP 报文。不同系统的递增规律不同:
- Windows:全局连续递增(每次 +1)
- Linux:按协议独立递增(TCP/UDP 各算各的)
- iOS/macOS:未分片时固定为 0
- Android:随机化或按协议递增
同一时间段内不同设备的 IPID 递增区间不同,据此可判断是否存在多设备。
2.4 NTP 时钟偏移检测
不同设备的硬件时钟误差不同(通常 ±0.5 秒到 5 秒)。通过分析 NTP 请求的时间戳,如果同一 IP 下存在多个时钟源特征,就判定共享。
三、整体方案
针对上述检测手段,逐个击破:
| 检测手段 | 应对方案 | 工具 |
|---|---|---|
| TTL 检测 | 把所有出站包的 TTL 固定为 64 | iptables TTL 模块 |
| User-Agent 检测 | 把所有 HTTP 请求的 UA 统一改成同一个 | UA2F |
| IPID 检测 | 把所有出站包的 IPID 改成递增 | rkp-ipid 内核模块 |
| NTP 时钟偏移 | 把 NTP 请求重定向到路由器本地 | iptables DNAT |
核心工具:
- UA2F:在 OpenWrt 上修改 HTTP User-Agent 的插件
- rkp-ipid:修改 IP Identification 字段的内核模块
- iptables:修改 TTL、重定向 NTP
四、准备工作
4.1 硬件
需要一台能刷 OpenWrt 的路由器。我用的是之前那台 红米 AC2100(已经刷了 ImmortalWrt),其他支持 OpenWrt 的路由器也都可以,比如:
- 红米 AC2100 / AX6 / AX3000
- 斐讯 K2P
- 中兴 AX3000M
- 各类 x86 软路由
图:我用的红米 AC2100,已刷 ImmortalWrt
TIP如果路由器性能较弱(比如 MT7621),UA2F 处理 HTTP 流量会占用一定 CPU,千兆带宽下可能跑不满。建议用 MT7981 及以上的型号。
4.2 软件
- OpenWrt / ImmortalWrt 固件(建议 21.02 及以上)
- UA2F 的 ipk 安装包(从 GitHub Release 下载对应架构)
- 依赖包:
iptables-mod-nfqueue、iptables-mod-ipopt、kmod-ipt-ipopt、kmod-rkp-ipid
五、配置步骤
步骤 1:路由器连校园网
把校园网网线插到路由器的 WAN 口,LAN 口连电脑。
进 OpenWrt 后台(默认 192.168.1.1),网络 → 接口 → WAN,协议改成 DHCP 客户端,保存应用。
这时候 WAN 口会拿到校园网分配的 IP(比如 10.x.x.x),但还上不了网——因为还没认证。
步骤 2:完成 GiWifi 首次认证
用连接路由器 LAN 口的电脑,打开浏览器访问任意 HTTP 网站(比如 http://neverssl.com),会自动跳转到 GiWifi 登录页。
输入账号密码登录,认证成功后路由器就能上网了。此时认证的是路由器 WAN 口的 MAC 地址。
TIP后续可以写脚本自动登录 GiWifi,实现路由器开机后自动认证,避免每次手动登录。脚本原理就是模拟 POST 请求到
/gportal/Web/loginAction,参数用 AES-128-CBC 加密。
步骤 3:安装 UA2F
从 UA2F Release 下载对应架构的 ipk 包。查看路由器架构:
opkg print-architecture比如红米 AC2100 是 mipsel_24kc,就下载 ua2f_x.x.x-1_mipsel_24kc.ipk。
上传到路由器 /tmp 目录,然后安装:
# 安装依赖opkg updateopkg install iptables-mod-nfqueue iptables-mod-ipopt kmod-ipt-ipopt
# 安装 UA2Fopkg install /tmp/ua2f_x.x.x-1_*.ipk验证安装:
ua2f --version步骤 4:配置 UA2F
SSH 登录路由器,执行以下命令:
# 启用 UA2Fuci set ua2f.enabled.enabled=1
# 自动添加防火墙规则uci set ua2f.firewall.handle_fw=1
# 处理内网流量(学校有内网网站需开启)uci set ua2f.firewall.handle_intranet=1
# 自定义 User-Agent,统一伪装成 Windows Chromeuci set ua2f.main.custom_ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
# 应用配置uci commit ua2f
# 开机自启并启动service ua2f enableservice ua2f start
# 查看日志确认运行logread | grep UA2F步骤 5:固定 TTL
在 网络 → 防火墙 → 自定义规则 中添加:
# 固定出站 TTL 为 64(Linux/Android 默认值)iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64或者 SSH 直接执行:
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64重启防火墙生效:
service firewall restart验证:用电脑 ping 一个网站,看 TTL 是否恒为 64:
ping baidu.com# 应显示 TTL=64NOTE也可以设成 128(Windows 默认值),看个人偏好。64 和 128 都可以,关键是所有设备的 TTL 要统一。
步骤 6:(可选)安装 rkp-ipid 防 IPID 检测
如果学校检测比较严,还可以装 rkp-ipid 来修改 IP 报文的 Identification 字段。
rkp-ipid 是内核模块,需要编译进固件或找到对应版本的 ipk。安装后添加防火墙规则:
# 创建 IPID 修改链iptables -t mangle -N IPID_MODiptables -t mangle -A FORWARD -j IPID_MODiptables -t mangle -A OUTPUT -j IPID_MOD
# 跳过内网地址iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURNiptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURNiptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURNiptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN
# 标记需要修改 IPID 的包iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10步骤 7:(可选)防 NTP 时钟偏移检测
把所有 NTP 请求重定向到路由器本地:
# 创建 NTP 重定向链iptables -t nat -N ntp_force_localiptables -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 RETURNiptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURNiptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
# 重定向到路由器自身iptables -t nat -A ntp_force_local -j DNAT --to-destination 192.168.1.1确保路由器开启了 NTP 服务(系统 → 时间同步)。
步骤 8:让防火墙规则持久化
上面的 iptables 命令重启后会丢失,需要写入自定义规则。
在 OpenWrt 后台 网络 → 防火墙 → 自定义规则 中,把步骤 5、6、7 的 iptables 命令全部粘贴进去,保存并应用。
或者直接编辑 /etc/firewall.user 文件。
六、验证效果
配置完成后,把手机、平板、笔记本都连到路由器的 Wi-Fi,然后:
- 多设备同时上网:所有设备都能正常联网,不会被踢下线;
- 检查 TTL:每台设备 ping 外网,TTL 都应该是 64;
- 检查 UA:访问 http://www.useragentstring.com/(注意要用 HTTP,不是 HTTPS),所有设备显示的 UA 应该都是你设置的那个。
如果一切正常,GiWifi 服务端看到的就是「一台 Windows 电脑」在上网,不会触发多设备检测。
七、常见问题
| 问题 | 原因 / 解决 |
|---|---|
| 装了 UA2F 还是被检测 | 检查 UA2F 是否在运行(service ua2f status),以及防火墙规则是否生效 |
| TTL 改了但 ping 还是 63 | 规则没生效,检查是否加在了 POSTROUTING 链,防火墙是否重启 |
| 网速变慢 | UA2F 处理 HTTP 流量消耗 CPU,弱性能路由器可能跑不满带宽 |
| 某些网站打不开 | UA2F 可能破坏了某些特殊 HTTP 请求,试试关闭 handle_intranet |
| 认证掉线 | GiWifi 有时长限制,需要写脚本定时重新认证 |
八、写在最后
这套方案本质上是伪装流量特征,让校园网的检测系统误判为单设备。技术实现不算复杂,但要注意:
- 不同学校的 GiWifi 检测严格程度不同,有些只查 TTL,有些全套都上;
- 建议先只开 TTL + UA2F 试试,不行再加 IPID 和 NTP;
- 如果学校用了 DPI(深度包检测),这套方案可能无效,需要更高级的对抗手段。
技术本身是中性的,怎么用是个人选择。我主要是在宿舍内部使用,让自己的多台设备能同时上网,没有对外共享。如果学校明令禁止,还请遵守规定。
参考资料:
发现错误或想要改进这篇文章?
在 GitHub 上编辑此页