软件

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 WAN 口
DHCP 自动获取

小米 Wi-Fi

TR3000 的 Wi-Fi

OpenClash 分流

光猫

小米主路由
192.168.x.x 网段

Cudy TR3000
OpenWrt + OpenClash
LAN 192.168.1.1

家里其他设备
不走代理

Mac / 手机 / iPad
192.168.1.x,走代理

国内直连
海外走机场节点

最开始我是让 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 下载页的最新说明。

二、刷机步骤

高级设置 → 固件升级
上传 cudy_tr3000-v1-sysupgrade.bin

状态 → 概览 看「型号」
决定下 128MB 还是 256MB 包

Cudy TR3000 v1

Cudy TR3000 256MB v1

网页进不去 / 变砖

原厂 Cudy 固件
后台 192.168.10.1

Cudy 过渡固件
其实就是带签名的 OpenWrt
地址变成 192.168.1.1,Wi-Fi 默认关

型号

128MB 版 sysupgrade

256MB 版 sysupgrade

系统 → 备份/升级 → 刷写新的固件
取消勾选「保留配置」

OpenWrt 正式版
我最后用的是 25.12.6,apk 包管理

设 root 密码 → 配 WAN/Wi-Fi → 装 OpenClash

TFTP 刷回原厂
见第六节

第 1 步:刷 Cudy 过渡固件

  1. 网线把电脑接到 TR3000 的 LAN 口(千兆口,不是 2.5G 的 WAN 口)。
  2. 浏览器打开 192.168.10.1(原厂后台),点顶部「高级设置」,在「系统」一栏或页面底部找「固件升级」。我的后台在这里没找到时,Cudy 说明书里「基本设置」下也有一个「固件」入口。
  3. 点「浏览」选 cudy_tr3000-v1-sysupgrade.bin,点「继续 / 升级」,等两三分钟,全程别断电。
  4. 刷成功后路由器就变成 OpenWrt 了,地址变成 192.168.1.1,原厂那个等待页面会一直转,不用管,自己去开 192.168.1.1。过渡固件的 Wi-Fi 默认是关的,必须用网线。

如果刷完 192.168.10.1 还是 Cudy 页面,说明过渡固件没刷进去:看一下原厂「系统状态」里的固件版本有没有变,没变就重新上传一次,上传后记得点「继续」。

第 2 步:刷 OpenWrt 正式版

  1. 打开 http://192.168.1.1,用户名 root,密码留空直接登录。
  2. 「状态 → 概览」看「型号」,按上面的规则去固件选择器下对应的 SYSUPGRADE(KERNEL / initramfs 那个只在 TFTP 救砖时用)。
  3. 「系统 → 备份/升级 → 刷写新的固件」,选文件,取消勾选「保留配置」,刷写,等约 3 分钟。
  4. 重新登录,在「系统 → 管理权」设好 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. 添加订阅、启动

  1. OpenClash →「配置订阅」→「添加」。
  2. 「配置别名(Config Alias)」用纯英文、不带空格和 @,比如 sub_a。它会被当成配置文件名。
  3. 粘贴订阅链接(只填在路由器页面里,别发给任何人,也别截进图里)。点「Commit Settings」。
  4. 回到「配置订阅」点「更新配置」,等十几秒,「运行状态」页的「配置文件」下拉框里会出现 sub_a.yaml。
  5. 选中配置,点切换按钮启动,状态显示「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
  • 排查过程:

    1. 先确认节点通不通。直接让内核测延迟(只在命令里读取面板密码,不会打印出来):

      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,也不是节点问题。)

    2. 确认防火墙规则在:

      tail -n 30 /tmp/openclash.log; nft list ruleset | grep -c openclash

      计数不为 0 就说明转发规则生效了。

    3. 手机/iPad 这边的「私人 DNS」「iCloud 专用代理」「限制 IP 地址跟踪」我也都关了,不是根因,但调试时建议先关掉,排除干扰。

    4. 在「覆写设置 → DNS 设置」里勾选自定义上游 DNS,只留 223.5.5.5、119.29.29.29 两条 UDP,fallback 全部取消启用、点「Apply Settings」——还是不行,日志里仍在请求 dns.google 和 dns.cloudflare.com。

    5. 看订阅自带的 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
    6. 那 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-openclash 0.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 不支持香港,需要手动换:

  1. OpenClash 首页「控制面板」点 Metacubexd,登录页直接确定。
  2. 进「代理」页,在可以手动选择的那个分组(如 Proxies / 「节点选择」)里点一个台湾、日本或美国节点,立即生效,不用重启。
  3. 如果 Gemini 走的是 Fallback 这种自动分组,它可能又把你切回香港,要在手动分组里选。
  4. 验证出口:手机或 iPad 浏览器打开 https://ip.sb 或 https://ipinfo.io,看显示的地区。别看 OpenClash 首页的「IP 地址」,那里查的是直连出口,永远是你本地运营商。

我选了台湾节点,ip.sb 显示台北,Gemini 能用了。

六、恢复与备忘

网页还能打开

只是某次刷写失败或配置乱了:重新走一遍「系统 → 备份/升级 → 刷写新的固件」,不保留配置。

完全进不去:TFTP 刷回原厂(我没实际用到,按官方文档整理)

Cudy 的引导程序自带 TFTP 恢复,但只接受 Cudy 官方签名固件,所以是先刷回原厂,再从第二节重来:

  1. 从 Cudy 下载中心下载 TR3000 对应版本的原厂固件,改名为 recovery.bin。
  2. Windows 上用 Tftpd64(Tftpd32),把 recovery.bin 放进它的目录;关掉防火墙,以免 TFTP 被拦。
  3. 电脑网线接 TR3000 的 LAN 口,网卡手动设 IP 192.168.1.88,掩码 255.255.255.0。
  4. 路由器断电,按住 RESET 再插电,继续按住至少 5 秒,它会自动从电脑拉 recovery.bin 刷回原厂。
  5. 全程不要断电。

(另一条路是通过串口 UART 进 U-Boot 刷 initramfs,需要拆机,见 OpenWrt Wiki。)

备忘清单

  • 刷机全程插稳电源,最大的风险是中途断电。
  • 过渡固件刷完 Wi-Fi 是关的,必须网线。
  • 所有路由器命令都在 root@OpenWrt 里执行,别敲在电脑自己的终端里。
  • 调试时先确认电脑连的是 TR3000 的 Wi-Fi,并临时关掉电脑上的代理工具。
  • 订阅链接只填在路由器页面里;截图前遮掉订阅链接和代理端口的用户名密码。如果不小心露出来了,去机场后台重置订阅。
  • 打不开海外网站先看 /tmp/openclash.log:满屏 dns resolve failed 基本就是 DNS 上游的问题。
  • 内核在内存里,重启后靠 rc.local 自动恢复;开机后一两分钟内代理还没起来是正常的。

参考