Cudy TR3000 刷 OpenWrt + OpenClash 实操记录:从过渡固件到机场订阅跑通
Cudy TR3000 刷 OpenWrt + OpenClash 实操记录
一句话摘要:原厂固件 → Cudy 官方过渡固件 → OpenWrt 25.12.6,再手动装 OpenClash 0.48.002,填两个机场订阅。真正卡最久的不是安装,是 OpenClash 默认带的几条国外 DoH 在国内连不上,导致所有域名解析超时。
⚠️ 先说清楚 刷第三方固件可能失去保修,操作不当可能变砖,下文有救砖方法,但请自担风险。 在国内使用未经批准的代理服务有法律风险,请自行判断。 本文是我个人的一次操作记录,订阅链接、密码、Wi-Fi 名和家里的内网地址都已打码或换成占位符。
一、背景与准备
我的设备和网络
- 路由器:Cudy TR3000 v1(128MB 闪存版),一个 2.5G WAN 口 + 一个千兆 LAN 口。
- 上级网络:光猫 → 小米主路由(Mesh)。TR3000 的 WAN 口用网线接小米路由器的 LAN 口,自动拿地址。
- TR3000 自己的 LAN 用另一个网段(默认
192.168.1.1),再发一个独立的 Wi-Fi。只有连这个 Wi-Fi 的设备走代理,家里其他设备照常连小米,互不影响。 - 电脑:MacBook(主力,SSH 用它),手机和 iPad 用来开后台页面。
- 两个机场订阅,下文叫 机场订阅 A 和 机场订阅 B。
最开始我是让 TR3000 用 5G 无线中继小米(WISP),能用;后来为了稳定改成网线接小米,把中继接口删掉,5G 空出来给自己的 Wi-Fi 用。
要下载的文件
| 文件 | 去哪下 | 说明 |
|---|---|---|
| Cudy 过渡固件 | Cudy OpenWrt 下载页(指向 Google Drive) | 128MB 版:TR3000 V1.zip 解压出 cudy_tr3000-v1-sysupgrade.bin;256MB 版是单独的文件 cudy_tr3000-256mb-v1-sysupgrade.bin |
| OpenWrt 正式固件 | OpenWrt 固件选择器 | 搜 TR3000,平台 mediatek/filogic,下 SYSUPGRADE 那个 |
| OpenClash | OpenClash GitHub Releases | OpenWrt 25.12 用 .apk 包,我装的是 0.48.002 |
128MB 还是 256MB? 我这台机身标签和原厂后台都看不出来。办法是先刷过渡固件(两个版本的过渡固件选错会被拒绝,不会刷坏),刷完在 OpenWrt 后台「状态 → 概览」看「型号」:
- 显示
Cudy TR3000 v1→ 128MB 版 - 显示
Cudy TR3000 256MB v1→ 256MB 版
SSH 里也能查:
cat /tmp/sysinfo/model
dmesg | grep -i nand # 开机日志里写着 128 MiB 还是 256 MiB
带
ubootmod字样的固件不要选。 那是换引导程序的大分区方案,能把可用空间从约 45MB 扩到约 93MB,但要改 BL2/FIP,有变砖风险。我没走这条路。
补充:Cudy 官方公告说 2025 年 11 月起生产的部分 TR3000(序列号前四位 2543 及以后)换了新闪存,旧的过渡固件不兼容,要用 Google Drive 里更新过的过渡固件。刷之前先看一眼 Cudy 下载页的最新说明。
二、刷机步骤
第 1 步:刷 Cudy 过渡固件
- 网线把电脑接到 TR3000 的 LAN 口(千兆口,不是 2.5G 的 WAN 口)。
- 浏览器打开
192.168.10.1(原厂后台),点顶部「高级设置」,在「系统」一栏或页面底部找「固件升级」。我的后台在这里没找到时,Cudy 说明书里「基本设置」下也有一个「固件」入口。 - 点「浏览」选
cudy_tr3000-v1-sysupgrade.bin,点「继续 / 升级」,等两三分钟,全程别断电。 - 刷成功后路由器就变成 OpenWrt 了,地址变成
192.168.1.1,原厂那个等待页面会一直转,不用管,自己去开192.168.1.1。过渡固件的 Wi-Fi 默认是关的,必须用网线。
如果刷完 192.168.10.1 还是 Cudy 页面,说明过渡固件没刷进去:看一下原厂「系统状态」里的固件版本有没有变,没变就重新上传一次,上传后记得点「继续」。
第 2 步:刷 OpenWrt 正式版
- 打开
http://192.168.1.1,用户名 root,密码留空直接登录。 - 「状态 → 概览」看「型号」,按上面的规则去固件选择器下对应的 SYSUPGRADE(KERNEL / initramfs 那个只在 TFTP 救砖时用)。
- 「系统 → 备份/升级 → 刷写新的固件」,选文件,取消勾选「保留配置」,刷写,等约 3 分钟。
- 重新登录,在「系统 → 管理权」设好 root 密码。
我最后跑的是 OpenWrt 25.12.6。注意 25.12 起包管理器从 opkg 换成了 apk,LuCI 也换成了新的 ucode 版,网上很多 OpenClash 教程里的 opkg 命令要换成 apk 写法:
| 以前 | 25.12 起 |
|---|---|
opkg update |
apk update |
opkg install <pkg> |
apk add <pkg> |
opkg remove <pkg> |
apk del <pkg> |
第 3 步:接上级网络、开 Wi-Fi
- 网线一头插小米路由器 LAN 口,一头插 TR3000 WAN 口。
- 「网络 → 接口」确认
wan是 DHCP 客户端;如果之前做过无线中继,把中继用的接口(一般叫wwan)和「网络 → 无线」里那条中继删掉。 - 「网络 → 无线」启用 2.4G / 5G,各加一个接入点(AP),网络选
lan,加密选 WPA2-PSK 或 WPA3,设好密码。 - 手机连上 TR3000 的 Wi-Fi,能开百度就说明基础网络好了。
三、装 OpenClash(OpenWrt 25.12 / apk)
以下命令都在 路由器的 SSH 里执行。Mac 上先打开「终端」:
ssh [email protected]
看到 root@OpenWrt:~# 才是进了路由器。(我中途有一次把路由器命令敲在 Mac 自己的终端里,报了一串「no such file or directory」,没任何影响,但别犯这个错。)
1. 装 LuCI 兼容层
OpenClash 的界面还是老式 Lua 写的,25.12 的新 LuCI 默认不带 Lua 运行环境,缺这两个包菜单不会显示:
apk update && apk add luci-compat luci-lua-runtime
2. 下载 OpenClash apk
cd /tmp && wget -O openclash.apk https://github.com/vernesong/OpenClash/releases/download/v0.48.002/luci-app-openclash-0.48.002.apk && ls -lh openclash.apk
国内直连 GitHub 不稳,卡住就 Ctrl+C,在链接前面加一个 GitHub 加速镜像前缀再试(我准备的是 https://ghfast.top/,这次直连成功了,没用上)。
3. 换完整版 dnsmasq,再装 OpenClash
OpenClash 需要 dnsmasq-full,要先卸掉系统自带的 dnsmasq。顺序很重要:先把 dnsmasq-full 下载到本地,再卸旧的,这样卸完断网也不影响安装:
cd /tmp && apk fetch dnsmasq-full && apk del dnsmasq \
&& apk add --allow-untrusted ./dnsmasq-full*.apk \
&& apk add --allow-untrusted ./openclash.apk
apk info | grep -iE 'clash|dnsmasq'
最后应该列出 dnsmasq-full 和 luci-app-openclash。中间出现 udhcpc: no lease 之类的提示不影响。其他依赖 apk 会自动装上。
4. 看空间、重启
df -h /overlay; reboot
我这台 128MB 版装完后 overlay 是 44M,用了 19.1M,剩 22.7M。重启后重新登录 LuCI,「服务」菜单里就有 OpenClash 了。
5. 装 Mihomo(Meta)内核:放进内存
内核解压后 30 多 MB,闪存只剩 22MB 左右,放不下,所以把内核放在 /tmp(内存),只在 OpenClash 的内核目录里建一个软链接:
mkdir -p /tmp/core /etc/openclash/core && cd /tmp/core \
&& wget -O meta.tar.gz https://gh-proxy.com/https://raw.githubusercontent.com/vernesong/OpenClash/core/master/meta/clash-linux-arm64.tar.gz \
&& tar -xzf meta.tar.gz && chmod +x clash && rm meta.tar.gz \
&& ln -sf /tmp/core/clash /etc/openclash/core/clash_meta \
&& /etc/openclash/core/clash_meta -v
最后一行输出 Mihomo Meta 的版本号就成功了(TR3000 是 arm64)。gh-proxy.com 是第三方 GitHub 加速,换成别的可用镜像也行。
代价是重启后内核会丢,第五节有开机自动恢复的脚本。
6. 添加订阅、启动
- OpenClash →「配置订阅」→「添加」。
- 「配置别名(Config Alias)」用纯英文、不带空格和 @,比如
sub_a。它会被当成配置文件名。 - 粘贴订阅链接(只填在路由器页面里,别发给任何人,也别截进图里)。点「Commit Settings」。
- 回到「配置订阅」点「更新配置」,等十几秒,「运行状态」页的「配置文件」下拉框里会出现
sub_a.yaml。 - 选中配置,点切换按钮启动,状态显示「Meta Running」。
订阅里自带了节点分组和分流规则(国内 IP 直连、其他走代理),不用手动选节点,Fallback 之类的分组会自动测速挑能用的。
四、踩坑与解决
坑 1:过渡固件刷完,192.168.1.1 打开的却不是 TR3000
- 现象:刷完过渡固件去开
192.168.1.1,碰到的是别的设备。 - 原因:家里光猫/上级设备也在用
192.168.1.x,电脑同时连着家里的 Wi-Fi,请求跑到了别的设备上。 - 解决:刷机期间把电脑的 Wi-Fi 关掉,只用网线接 TR3000 的 LAN 口。还不行就按 Katorly 教程手动给电脑设一个同网段的固定 IP(例如
192.168.1.10,掩码255.255.255.0),刷完再改回自动获取。
坑 2:OpenClash 菜单不出现,打开页面报 403
- 现象:(第一次尝试时)LuCI 里一直没有「服务 → OpenClash」,手动打开
admin/services/openclash返回 403。 - 原因:两个问题叠在一起。一是 25.12 的新 LuCI 缺
luci-compat和luci-lua-runtime,Lua 界面挂不上;二是检查时发现 OpenClash 其实没装上,apk info | grep -i clash什么都没有。另外,负责权限的rpcd一般只在启动时读取插件的 ACL 文件,装完不重启的话,登录会话可能拿不到 OpenClash 的权限(这一点我没单独验证,我是直接整机重启解决的)。 - 解决:按第三节的顺序装依赖 → 换 dnsmasq-full → 装 OpenClash → 整机
reboot,再重新登录。不想重启整机的话,至少:
rm -rf /tmp/luci-*
/etc/init.d/rpcd restart
/etc/init.d/uhttpd restart
可以用这两条确认装好了:
apk info | grep -i clash
ls /usr/share/rpcd/acl.d/ | grep -i clash
坑 3:Mac 一直打不开路由器后台(两个原因)
- 现象:手机能上网,但 Mac 访问
192.168.1.1报 403,SSH 也被直接断开(Connection closed by 192.168.1.1 port 22)。 - 原因 1:Mac 连错了 Wi-Fi。 在 Mac 终端查一下自己的地址和网关就知道:
ipconfig getifaddr en0
route -n get default | grep gateway
我拿到的是小米那边网段(192.168.x.x)的地址,说明 Mac 连的是小米的 Wi-Fi,访问 192.168.1.1 碰到的是上级设备。切回 TR3000 的 Wi-Fi 后,地址变成 192.168.1.x,SSH 立刻就进去了。
- 原因 2:Mac 上开着小火箭(代理工具)。 连对 Wi-Fi 后 SSH 正常,但浏览器还是打不开后台,因为代理工具接管了系统网络,把局域网请求也转发走了。
- 解决:调试期间关掉 Mac 上的代理工具;或者在它的规则里把
192.168.0.0/16设为直连(DIRECT)/加入跳过代理列表。我当时图省事,后台在手机和 iPad 上点,SSH 命令照样在 Mac 终端跑(SSH 不受影响)。等 TR3000 上的 OpenClash 跑通,Mac 连它的 Wi-Fi 就能直接用,小火箭可以一直关着。
坑 4:在「版本更新」页点下载,内核下到了 iPad 上
- 现象:OpenClash「插件设置 → 版本更新」里,镜像列表 CORE 一栏的下载小图标一点,弹出的是 iPad 的下载。
- 原因:那个图标是把文件下载到你当前用的设备,不是下到路由器。
- 解决:让路由器自己下载,用第三节第 5 步的 SSH 命令。
坑 5:机场订阅 B 更新失败
- 现象:订阅 A 正常生成配置,订阅 B 一直提示更新失败;订阅链接本身没错,换了两个 User-Agent 也不行。
- 原因:订阅 B 返回的不是 Clash 能直接读的 YAML,而是通用格式的节点列表,换 UA 没用。
- 解决:编辑订阅 B,勾选 「Subscribe Convert Online」(在线订阅转换),User-Agent 改回
clash.meta,Commit 后再更新一次,成功。另一个办法是去机场后台复制专门的「Clash / Clash Meta 订阅链接」。 - 附带现象:走在线转换的订阅,面板上看不到流量和到期日,因为转换服务把带用量的响应头丢掉了。要看用量去机场后台看,不影响使用。
坑 6(最关键):国内能开,海外全打不开,日志里全是 dns resolve failed
- 现象:OpenClash 显示运行中,百度、网易正常,GitHub、YouTube、Google 全打不开。节点本身是通的。日志里一直刷:
dial Final (match Match/) ... error: dns resolve failed: all DNS requests failed,
first error: requesting https://dns.cloudflare.com:443/dns-query: ... context deadline exceeded
-
排查过程:
-
先确认节点通不通。直接让内核测延迟(只在命令里读取面板密码,不会打印出来):
S=$(uci -q get openclash.config.dashboard_password); for n in Fallback Proxies; do echo "== $n"; curl -s -m 8 -H "Authorization: Bearer $S" "http://127.0.0.1:9090/proxies/$n/delay?url=https://www.gstatic.com/generate_204&timeout=5000"; echo; done返回
{"delay":数字}就是通的。我这里Fallback和Proxies都有延迟,节点没问题。(用curl -x http://127.0.0.1:7893测会返回 407,那是代理端口要认证,不代表节点坏;分组名带 emoji 的话直接写纯文字会返回Resource not found,也不是节点问题。) -
确认防火墙规则在:
tail -n 30 /tmp/openclash.log; nft list ruleset | grep -c openclash计数不为 0 就说明转发规则生效了。
-
手机/iPad 这边的「私人 DNS」「iCloud 专用代理」「限制 IP 地址跟踪」我也都关了,不是根因,但调试时建议先关掉,排除干扰。
-
在「覆写设置 → DNS 设置」里勾选自定义上游 DNS,只留
223.5.5.5、119.29.29.29两条 UDP,fallback 全部取消启用、点「Apply Settings」——还是不行,日志里仍在请求dns.google和dns.cloudflare.com。 -
看订阅自带的 DNS 段,里面是国内的
223.5.5.5、119.29.29.29,没有dns.google:F=$(ls /etc/openclash/config/*.yaml | head -n1); echo "== $F" sed -n '/^dns:/,/^[a-z-]*:/p' "$F" | head -n 40 -
那 DoH 是谁加的?全盘搜一下:
grep -rln 'dns.google\|dns.cloudflare' /etc/openclash /etc/config/openclash 2>/dev/null uci show openclash | grep -E 'dns.google|cloudflare' | cut -c1-120结果在 OpenClash 自己的 UCI 配置里:
openclash.@dns_servers[...]有几条 DoH 记录(dns.google、Cloudflare)是启用的,OpenClash 启动时会把它们写进实际运行的配置,覆盖了订阅里的国内 DNS。
-
-
原因:OpenClash 默认带的几条国外 DoH 上游(dns.google、cloudflare)在国内被墙,内核要先解析域名才能决定走直连还是代理,解析一超时,连接就直接断了。
-
解决:把这几条 DoH 停用,再重启 OpenClash。下面的序号 19 / 24 / 25 是我这台机器上的,你的可能不同,先用上面的
uci show找到自己的序号:
for i in 19 24 25; do uci set openclash.@dns_servers[$i].enabled='0'; done
uci commit openclash
/etc/init.d/openclash restart >/dev/null 2>&1; sleep 15
grep -c 'dns.google\|dns.cloudflare' /etc/openclash/*.yaml # 应为 0
tail -n 5 /tmp/openclash.log | cut -c1-160 # 不再出现 dns resolve failed
输出里看到 OpenClash Start Successful!,之后的日志不再报 dns resolve failed,手机上 Google、YouTube 马上就能打开了。
五、最终配置要点
- 固件:OpenWrt 25.12.6,apk 包管理,ucode LuCI。
- 必装包:
luci-compat、luci-lua-runtime、dnsmasq-full(替换dnsmasq)、luci-app-openclash0.48.002。 - 内核:Mihomo Meta arm64,放在
/tmp/core/clash,软链接到/etc/openclash/core/clash_meta。 - DNS:停用 OpenClash 默认的国外 DoH 上游,用订阅自带或国内的
223.5.5.5/119.29.29.29。DNS 模式保持 fake-ip(解析出198.18.x.x是正常的假 IP)。 - 订阅:两个订阅各生成一个 yaml,OpenClash 一次只跑一个,在「配置文件」下拉框里切换。订阅 A 直接可用;订阅 B 要开「Subscribe Convert Online」。
开机自动恢复内核
内核在内存里,一断电就没了。在 /etc/rc.local 里加一段开机 20 秒后自动下载、解压、建软链接再重启 OpenClash 的脚本:
sed -i '/clash_meta/d;/^exit 0/d' /etc/rc.local
cat >> /etc/rc.local <<'EOT'
(sleep 20; mkdir -p /tmp/core && cd /tmp/core && wget -qO m.tgz https://gh-proxy.com/https://raw.githubusercontent.com/vernesong/OpenClash/core/master/meta/clash-linux-arm64.tar.gz && tar -xzf m.tgz && rm m.tgz && chmod +x clash && ln -sf /tmp/core/clash /etc/openclash/core/clash_meta && /etc/init.d/openclash restart) & # clash_meta
exit 0
EOT
tail -n 3 /etc/rc.local
开机时 OpenClash 还没起来,这一步是直连下载的,所以依赖那个加速镜像能访问。
切换节点(比如 Gemini 不支持香港)
我订阅里默认自动选的是香港节点,Gemini 不支持香港,需要手动换:
- OpenClash 首页「控制面板」点 Metacubexd,登录页直接确定。
- 进「代理」页,在可以手动选择的那个分组(如
Proxies/ 「节点选择」)里点一个台湾、日本或美国节点,立即生效,不用重启。 - 如果 Gemini 走的是
Fallback这种自动分组,它可能又把你切回香港,要在手动分组里选。 - 验证出口:手机或 iPad 浏览器打开
https://ip.sb或https://ipinfo.io,看显示的地区。别看 OpenClash 首页的「IP 地址」,那里查的是直连出口,永远是你本地运营商。
我选了台湾节点,ip.sb 显示台北,Gemini 能用了。
六、恢复与备忘
网页还能打开
只是某次刷写失败或配置乱了:重新走一遍「系统 → 备份/升级 → 刷写新的固件」,不保留配置。
完全进不去:TFTP 刷回原厂(我没实际用到,按官方文档整理)
Cudy 的引导程序自带 TFTP 恢复,但只接受 Cudy 官方签名固件,所以是先刷回原厂,再从第二节重来:
- 从 Cudy 下载中心下载 TR3000 对应版本的原厂固件,改名为
recovery.bin。 - Windows 上用 Tftpd64(Tftpd32),把
recovery.bin放进它的目录;关掉防火墙,以免 TFTP 被拦。 - 电脑网线接 TR3000 的 LAN 口,网卡手动设 IP
192.168.1.88,掩码255.255.255.0。 - 路由器断电,按住 RESET 再插电,继续按住至少 5 秒,它会自动从电脑拉
recovery.bin刷回原厂。 - 全程不要断电。
(另一条路是通过串口 UART 进 U-Boot 刷 initramfs,需要拆机,见 OpenWrt Wiki。)
备忘清单
- 刷机全程插稳电源,最大的风险是中途断电。
- 过渡固件刷完 Wi-Fi 是关的,必须网线。
- 所有路由器命令都在
root@OpenWrt里执行,别敲在电脑自己的终端里。 - 调试时先确认电脑连的是 TR3000 的 Wi-Fi,并临时关掉电脑上的代理工具。
- 订阅链接只填在路由器页面里;截图前遮掉订阅链接和代理端口的用户名密码。如果不小心露出来了,去机场后台重置订阅。
- 打不开海外网站先看
/tmp/openclash.log:满屏dns resolve failed基本就是 DNS 上游的问题。 - 内核在内存里,重启后靠
rc.local自动恢复;开机后一两分钟内代理还没起来是正常的。