GL.iNet 路由器在国内销售有区域锁,限制使用某些VPN功能。解锁是把设备工厂分区中的市场标识由 CN 改为国际版标识,从而让固件按国际版本加载相关菜单。本文记录在 GL.iNet Flint 3E(GL-BE6500)、固件 4.8.8 上将设备区域从中国永久改为美国,以及让简体中文管理界面显示 VPN 与 AdGuard Home 菜单。
本教程旨在指导用户如何在 GL-BE6500 路由器上更改区域设置。由于操作涉及直接写入闪存,存在一定风险。操作前请确保充分理解每一步骤,并小心谨慎地执行。
写在前面
GL-BE6500 的地区信息不只存在于普通 OpenWrt 配置中,还写在无线校准数据所在的 ART 制造分区里。仅执行 「uci set wireless.*.country=US」 可以改变当前无线配置,但恢复出厂设置或重新刷机后可能回到原区域。
本文涉及直接修改 ART 分区中的两个字节。ART 同时保存无线校准和设备硬件信息,错误的分区号或偏移量可能导致无线功能异常,甚至使设备难以恢复。因此必须先确认型号、分区布局和原始字节,并完整备份 ART。无线监管域必须与设备实际使用地一致。
设备信息
- 设备:GL.iNet Flint 3E(GL-BE6500)
- 固件:4.8.8
- 管理地址:192.168.8.1
- SSH 用户:root
- 系统:OpenWrt 23.05-SNAPSHOT
- ART 分区:mtd11,名称 0:ART,大小 2 MiB
- 地区字段偏移:十进制 136
不同型号、硬件批次或固件的闪存布局可能不同。不要把本文中的 mtd11和偏移 136套用到其他设备。
更改区域
1.确认分区与地区字段
通过 SSH 登录路由器:
ssh [email protected]
查看 MTD 分区:
cat /proc/mtd
本机相关输出为:
mtd11: 00200000 00040000 "0:ART"
读取偏移 128 开始的内容:
hexdump -C -n 256 -s 128 /dev/mtdblock11
修改前的关键部分:
00000080 ff ff ff ff ff ff ff ff 43 4e ff ff ff ff ff ff |........CN......|
43 4e 是 ASCII 字符 CN,位于 0x80 + 8,即十进制偏移 136。写入前还要精确读取这两个字节:
dd if=/dev/mtdblock11 bs=1 skip=136 count=2 2>/dev/null
只有结果准确为 CN时才能继续。如果显示其他内容,应立即停止,重新核对型号和偏移。
2.完整备份 ART
在路由器上创建备份:
dd if=/dev/mtd11 of=/tmp/GL-BE6500-ART-before-US.bin bs=256k sha256sum /tmp/GL-BE6500-ART-before-US.bin
ART 备份应为 2,097,152 字节。随后把文件复制到电脑并妥善保存。新版 OpenSSH 默认使用 SFTP,而 GL.iNet 固件可能没有 sftp-server,此时可使用旧版 SCP 协议:
scp -O [email protected]:/tmp/GL-BE6500-ART-before-US.bin ./
复制后再次计算 SHA-256,确认本地文件与路由器上的校验值一致。
3.永久修改地区
确认备份和偏移无误后,只写入两个字节:
printf 'US' | dd of=/dev/mtdblock11 bs=1 seek=136 count=2 conv=notrunc sync
立即回读验证:
dd if=/dev/mtdblock11 bs=1 skip=136 count=2 2>/dev/null hexdump -C -n 32 -s 128 /dev/mtdblock11
预期结果:
US 00000080 ff ff ff ff ff ff ff ff 55 53 ff ff ff ff ff ff |........US......|
同时更新当前 OpenWrt 无线配置,使修改立即生效:
uci set wireless.wifi0.country='US' uci set wireless.wifi1.country='US' uci commit wireless wifi reload
重启后检查:
iw reg get
本机两个无线 PHY 均显示:
country US: DFS-FCC
由于地区字节写入了 ART 制造分区,该值通常可以跨普通固件升级和恢复出厂设置保留。刷写会覆盖 ART 的完整镜像或手动恢复 ART 备份时除外。
菜单修改
1.菜单文件
完成地区修改后,英文或繁体中文界面已经显示 VPN 和 AdGuard Home,但切换到简体中文后菜单仍然消失。检查菜单定义发现,这不是软件包未安装,而是相关 JSON 中存在明确的语言隐藏规则:
"lang_hide": [ "zh-cn" ],
涉及六个文件:
/usr/share/oui/menu.d/adguardhome.json /usr/share/oui/menu.d/vpndashboard.json /usr/share/oui/menu.d/ovpnclient.json /usr/share/oui/menu.d/ovpnserver.json /usr/share/oui/menu.d/wgclient.json /usr/share/oui/menu.d/wgserver.json
对应菜单包括:
- VPN 仪表盘
- OpenVPN 客户端与服务端
- WireGuard 客户端与服务端
- AdGuard Home
2.取消隐藏
先备份菜单文件:
mkdir -p /root/menu-backup-zhcn cp /usr/share/oui/menu.d/adguardhome.json \ /usr/share/oui/menu.d/vpndashboard.json \ /usr/share/oui/menu.d/ovpnclient.json \ /usr/share/oui/menu.d/ovpnserver.json \ /usr/share/oui/menu.d/wgclient.json \ /usr/share/oui/menu.d/wgserver.json \ /root/menu-backup-zhcn/
删除六个文件中的 lang_hide段:
for f in adguardhome vpndashboard ovpnclient ovpnserver wgclient wgserver; do
sed -i '/"lang_hide"/{N;N;d;}' "/usr/share/oui/menu.d/$f.json"
done
逐个验证 JSON,并确认隐藏规则已经消失:
for f in adguardhome vpndashboard ovpnclient ovpnserver wgclient wgserver; do p="/usr/share/oui/menu.d/$f.json" jsonfilter -i "$p" -e '@.view' grep -E 'lang_hide|zh-cn' "$p" && echo "仍有隐藏规则:$p" done
重启 Web 服务:
sync /etc/init.d/nginx restart
退出管理后台并刷新页面后,简体中文界面就会显示上述菜单。
一键脚本
为了方便固件升级后重新处理菜单,我把检查、备份、修改和验证整合成脚本:
gl-be6500-unlock.sh
在 macOS 或 Linux 终端中运行:
./gl-be6500-unlock.sh
脚本默认连接 192.168.8.1,只提示输入一次管理员密码,不会把密码保存在文件中。它会自动完成:
1. 核对设备主机名、ART 分区名称和大小;
2. 确认偏移 136 只能是 CN 或 US;
3. 完整备份 ART 并生成 SHA-256;
4. 幂等执行 CN → US,已经是 US`时不会重复写入;
5. 更新两个无线设备的 UCI 国家代码;
6. 备份六个菜单文件;
7. 删除简体中文隐藏规则并逐个解析 JSON;
8. 检测 AppleDouble 文件,发现异常时拒绝重启 Web 服务;
9. 重启 Nginx 使新菜单生效。
也可以只执行某一部分,只更改区域或菜单:
./gl-be6500-unlock.sh region ./gl-be6500-unlock.sh menus
路由器地址不是默认值时,可以执行以下操作(例如:192.168.10.1):
ROUTER_HOST=192.168.10.1 ./gl-be6500-unlock.sh
备份文件会保存在脚本目录下:
backups/年月日-时分秒/
恢复方法
如果只是菜单异常,可把备份文件复制回菜单目录,然后重启 Nginx:
cp /root/menu-backup-zhcn/*.json /usr/share/oui/menu.d/ /etc/init.d/nginx restart
ART 恢复属于高风险操作。不要在没有确认设备型号、分区大小和备份校验值的情况下直接把镜像写回闪存。菜单恢复与 ART 恢复不是同一等级的操作,前者只是 Web 配置,后者涉及无线校准数据。