kenzok8/openwrt-clashoo/clashoo-user-guide
Claude Code and agent skill by kenzok8/openwrt-clashoo
- community
Checking that the SKILL.md file is still in the repository.
Clashoo 功能与排障专家指南。Clashoo 是 OpenWrt 上的双内核(mihomo / Smart / sing-box)代理管理插件。回答「某功能怎么开/关」「为什么不通」「日志报错什么意思」「内核怎么选」「sing-box 配置怎么搞」等问题时使用本指南。回答前先读 AI 行为准则:对照源码、给 LuCI 操作路径而非裸命令、区分 mihomo(YAML) 与 sing-box(JSON)、先看日志再下结论。用户向 how-to 查 references/*.md,排障/日志类用本文件的架构、启动流程、防火墙与 DNS、日志报错章节。
Install
npx vskill@latest install kenzok8/openwrt-clashoo/clashoo-user-guideSKILL.md
Clashoo 专家指南
Clashoo 是 kenzok8 维护的 OpenWrt 代理管理插件,一个界面管三种内核:mihomo(稳定/Alpha)、Smart、sing-box(稳定/Alpha)。mihomo/Smart 走 YAML,sing-box 走 JSON,同一套 UCI 配置自动适配两端。
本指南分两层:
- 本文件:AI 排障要用、但用户向 Wiki 不该有的东西——系统架构、启动流程、防火墙/DNS 内部机制、日志报错解码、双内核内幕、排障方法论。
- `references/`:13 篇用户向 how-to(安装、导入配置、选内核、各页操作),与项目 GitHub Wiki 同源。回答「怎么操作」时查这里。
AI 行为准则
回答 Clashoo 问题前,先守住这几条:
- 验证优先,不臆测。拿不准就查源码:核心逻辑在
clashoo/files/usr/share/clashoo/和clashoo/files/etc/init.d/clashoo,UI 选项的真名在clashoo/files/etc/config/clashoo(UCI),界面在luci-app-clashoo/htdocs/luci-static/resources/view/clashoo/*.js。 - 给 LuCI 操作路径,而非裸命令。用户多数不是工程师,先说「服务 → Clashoo → 概览 / 配置 / 系统」里点哪里,再在必要时补命令行。
- 先看日志再下结论。三类日志(见下方「日志报错解码」);让用户先贴
概览状态行 +系统 → 日志,再判断。 - 双内核分开对待。同一个问题在 mihomo 和 sing-box 下机制不同(配置格式、DNS 接管、预检命令都不一样)。先确认
核心类型 = mihomo/Smart 还是 sing-box,再回答。 - 隐私意识。让用户贴日志时提醒打码订阅链接、节点地址、
dash_pass等敏感信息。
系统架构速查
数据流向
关键目录与文件
| 路径 | 作用 | |
|---|---|---|
/etc/config/clashoo | UCI 配置,所有界面选项的真实存放处 | |
/etc/init.d/clashoo | 主控脚本:启停、双内核调度、健康检查、bootstrap、core-only | |
/etc/clashoo/config.yaml | mihomo 运行配置(由所选订阅/配置文件加工而来) | |
/etc/sing-box/config.json | sing-box 运行配置(由所选 profile normalize 而来) | |
/usr/share/sing-box/ | sing-box 工作目录,含 cache.db(fake-ip 反查表) | |
/usr/share/clashoo/runtime/ | 运行时脚本:clashoo.sh、mixin.uc、dns_helpers.sh、iprules.sh、backup.sh、restore.sh | |
/usr/share/clashoo/net/ | 网络层:fw4.sh(防火墙)、dns_auto_setup.sh、access_check*.sh、log_format.awk | |
/usr/share/clashoo/lib/ | sing-box 转换链:yaml2singbox.uc、normalize_singbox_config.uc、migrate_singbox.uc、templates/default.json | |
/usr/share/clashoo/update/ | 更新脚本:内核/面板/GeoIP/订阅/组件/LightGBM | |
/usr/share/clashoo/clashoo.txt | 插件日志(用户在「日志」页看到的主日志) | |
/usr/share/clashoo/clashoo_real.txt | 单行状态(界面状态行的来源) | |
/var/log/clashoo/core.log | 内核进程 stdout(mihomo/sing-box 原生日志、预检报错) | |
/tmp/clashoo/runtime_state | 运行时状态机:健康状态、生效模式、降级标记 |
内核选择的两套字段(重要)
界面选内核写的是 `core_type` + `dcore`,启动时再同步出一个遗留字段 `core` 供老逻辑用(见 sync_legacy_core_field):
| 用户选择 | core_type | dcore | 同步出的 core | 实际二进制(按优先级探测) | |
|---|---|---|---|---|---|
| Smart | mihomo | 1 | 1 | /usr/bin/smart → /etc/clashoo/clash → /usr/bin/clash | |
| mihomo 稳定版 | mihomo | 2 | 2 | /usr/share/clashoo/bin/mihomo-stable(手动更新,新版本优先)或 /usr/libexec/clashoo/mihomo-stable(随包安装) | |
| mihomo Alpha | mihomo | 3 | 3 | /usr/share/clashoo/bin/mihomo-alpha(手动更新或从旧包迁移) | |
| sing-box 稳定版 | singbox | 4 | 4 | /usr/bin/sing-box ← 软链到 /usr/bin/sing-box-stable | |
| sing-box Alpha | singbox | 5 | 5 | /usr/bin/sing-box ← 软链到 /usr/bin/sing-box-alpha |
排障要点:新安装默认选 mihomo 稳定版;/usr/bin/mihomo和/usr/bin/clash-meta是随包稳定版的兼容软链。旧配置选 Alpha 时必须存在独立 Alpha 文件,否则启动前会提示缺少内核。sing-box 稳定/Alpha 通过软链/usr/bin/sing-box共存切换。
procd 进程身份(为什么不能 pidof)
OpenClash / nikki / passwall 可能和 Clashoo 共用同名二进制(mihomo、sing-box)。Clashoo 从不用 `pidof` 判断进程,一律查 ubus call service list:
- mihomo 路线:进程注册在 procd 服务名 `clashoo` 下(
_clashoo_instance_pid)。 - sing-box 路线:Clashoo 不自己拉起,而是托管系统的 `/etc/init.d/sing-box`(procd 服务名
sing-box,_singbox_instance_pid),启动前把sing-box.main.enabled置 1、停止时置 0。boot()阶段会先把它强制置 0,避免它在 Clashoo 准备好配置/防火墙前抢跑。
系统启动完整流程
/etc/init.d/clashoo start → start_service(),按所选内核分两条路。
公共前置
sync_legacy_core_field:由core_type/dcore同步出core。_detect_selected_core:按上表探测可用二进制。cleanup_legacy_startup_backups+migrate_legacy_clash_dir:清理历史残留、把老的/etc/clash迁到/etc/clashoo。resolve_effective_tp_modes:算「生效的」TCP/UDP 模式。选了 TUN 但设备无 `/dev/net/tun` → 自动降级(TCP→redirect、UDP→tproxy),并在状态机记degraded=1。runtime_state_record_preflight:把生效模式、是否有 tun、降级原因写进/tmp/clashoo/runtime_state。
mihomo / Smart 路线
select_config:把所选配置文件拷为/etc/clashoo/config.yaml,空/缺直接失败。_require_runtime_network_stack:检查fw4 / nft / ip齐全。_start_validate_core:对应内核二进制不存在就报错退出。_start_prepare_config(core-only 模式跳过整段):
check:把Proxy:/Rule:等老式大写键名 sed 成标准proxies:/rules:。- 展开 YAML merge anchor(
<<:,yq 4.53+ 会破坏,先explode(.))。 yml_change:用runtime/mixin.uc生成 mixin 片段,yq深合并进 config.yaml(端口、allow-lan、external-controller、DNS 等运行参数注入)。dns_mihomo_apply_leak_protect:若开 DNS 防泄漏,改写 DNS 段。smart_inject:仅 `core=1`(Smart) 时把url-test/load-balance组改成type: smart并注入policy-priority / prefer-asn / uselightgbm / collectdata / sample-rate、profile.smart-collector-size、顶层lgbm-*。非 Smart 内核会反向清除这些字段。_prepare_geo_bootstrap_mode:若配置需要 GeoIP/GeoSite 但本地数据缺失/损坏,临时剥离 geo 规则先启动(bootstrap 模式),并记/var/run/clashoo_bootstrap_pending。yml_dns_change:按dnsforwader/dnscache/listen_port改 dnsmasq(先backup_dnsmasq_state存原状)。- 拷到工作目录 +
ip_rules。
_start_launch_core:
- `mihomo -t` 预检(15s 看门狗)。失败不碰防火墙/dnsmasq;超时(退出码 124)多半是在下载 geo 数据,会异步补 geo 并稍后重试。
procd_open_instance拉起内核(disable_quic_gso=1时注入QUIC_GO_DISABLE_GSO=1,只影响 quic-go GSO;core-only 注入SAFE_PATHS=/)。- 非 core-only:
fw4.sh apply→ 重启 dnsmasq →restore→add_cron。 - 后台看门狗等内核出现:出现则跑健康检查 + 立即触发访问检查 + 完成 bootstrap geo 补全;超时未出现则 `_rollback_failed_start` 回滚防火墙与 DNS(否则会留下指向无人监听端口的劫持 DNS)。
sing-box 路线
start_singbox_service:
_sync_singbox_binary:按dcore把/usr/bin/sing-box软链到 stable/alpha。prepare_singbox_runtime:把所选 profile 拷为/etc/sing-box/config.json,删旧cache.db;非 core-only 用ucode normalize_singbox_config.uc改写端口/routing_mark=6666/DNS 端口/面板端口密码/tun 探测;core-only 只跑migrate_singbox.uc做版本迁移。写sing-box.main(conffile/workdir/user)。- `sing-box check` 预检(15s 看门狗)。失败/超时不碰防火墙与 DNS。
/etc/init.d/sing-box start。
- 非 core-only:
fw4.sh apply→singbox_dns_change→add_cron。 _wait_core_alive ... sing-box:窗口内死掉就_rollback_failed_start。- 健康检查(settle 异步复检)。
启动等待窗口
_compute_start_wait:TUN 模式 15s、其它 6s(TUN 要等 utun 建好 + fake-ip 池初始化)。慢设备可 uci set clashoo.config.start_wait_secs=N 覆盖。
core-only(仅内核)模式
core_only=1 时 Clashoo 只保活内核进程,原样运行用户导入的配置,不接管防火墙/DNS/cron,并放宽 SAFE_PATHS=/(信任用户自带配置里的绝对路径,如 OpenClash 的 external-ui)。详见 references/仅内核.md。
防火墙与 DNS 内部机制
fw4 防火墙(net/fw4.sh)
只支持 fw4 + nft(无 iptables 后端)。通过 UCI firewall.* include 段挂三张表,apply/remove 成对操作:
| include 段 | 挂载位置 | 内容 | |
|---|---|---|---|
clash_fw4_sets | table-pre | 命名集合:本地网段、中国 IP(clashoo_china/6)、旧版 ACL 集合和 TUN ACL 子链 | |
clash_fw4_dstnat | dstnat 链 | DNS 劫持(53→53)+ redirect 模式的代理重定向 | |
clash_fw4_mangle | mangle_prerouting 链 | TProxy 模式的 TCP/UDP 打标转发 |
另有本机出站表 clashoo_local(ip 族,仅 redirect 模式),让路由器自身流量也走代理。
QUIC 两个开关不重叠:
disable_quic_gso=1:启动 mihomo / Smart 时注入QUIC_GO_DISABLE_GSO=1,关闭 quic-go 的 GSO 批量发送能力。它是核心兼容性开关,用来绕过部分内核、网卡、虚拟化环境的 UDP GSO 问题,不会阻断 QUIC。block_quic=1:创建防火墙表clashoo_quic,拒绝走代理链路里的 UDP 443,让客户端尽快回落 TCP。它是访问兼容性开关,只在下载、视频或应用卡在 QUIC 时尝试。
QUIC 阻断表 `clashoo_quic`(block_quic=1 时建,inet 族,prerouting hook priority mangle - 1 + forward hook priority -10):ip daddr <fake-ip 段> udp dport 443 reject with icmpx type port-unreachable。
- 必须 reject 发 ICMP,不能 drop:drop 与「机场黑洞掉 UDP 443」无法区分,客户端照样干等。mihomo 规则里的
REJECT对 UDP 也是静默丢包,同样无效。 - 优先级要抢在 fw4 之前:mihomo 的 auto-redirect 会在 fw4 forward 链顶部 accept 所有 tun 流量。
- 只挂 forward,不能挂 output:output 会打死内核自己连 Hysteria2/TUIC 节点的 UDP 443。
- 限定 fake-ip 目标 = 只拦走代理的 QUIC,国内直连 QUIC 不受影响(非 fake-ip 模式回退用
clashoo_china集合排除)。
两个关键 fwmark(不能混用):
PROXY_FWMARK = 0x162:入站 TProxy 标记 →ip rule fwmark 0x162 table 0x162→local 0.0.0.0/0 dev lo。CORE_ROUTING_MARK = 0x1a0a(=6666):内核出站 SO_MARK(= mihomorouting-mark/ sing-boxrouting_mark)。- 两者必须不同,否则内核出站被拉回
lo→ 全网不可达。改其一须同步fw4.sh与normalize_singbox_config.uc。
透明代理模式如何落到规则:
redirect:DSTNAT 链redirect to :redir_port(默认 7891)。tproxy(TCP/UDP):mangle 链tproxy to :tproxy_port(默认 7982)+ 打0x162+ip rule/ip route。tun:内核自己接管;启用分组 ACL 时 nft 只写分组匹配和直连绕过标记,无 tun 设备时自动回落 redirect/tproxy。tcp_mode、udp_mode和stack是独立字段;stack只在 TCP 或 UDP 至少一个为tun时生效。常见组合:默认TCP Redirect + UDP TProxy + gVisor,也可用TCP Redirect + UDP TUN + Mixed,或TCP TUN + UDP TUN + System/Mixed/gVisor。
绕行(bypass):本地网段、中国 IP(bypass_china=1 控制 IPv4 geoip_cn.nft,bypass_china_ipv6=1 控制 IPv6 geoip6_cn.nft;IPv6 字段缺失时回退旧 bypass_china)、分组 ACL、自定义端口(bypass_port_mode:all/common/custom)、DSCP、fwmark。分组 ACL 按从上到下匹配,行内 IPv4、IPv6、MAC 任一命中即采用该组的 DNS 和代理开关;空匹配项代表全部设备,未命中默认接管 DNS 并走代理。旧白名单会迁移成“名单代理 + 其余直连”,旧黑名单会迁移成“名单直连 + 其余代理”。共存:自动把 passwall(0x1)/passwall2(0xff)/nikki(tproxy/tun mark) 的标记并入 bypass,避免互相截流。
三个 IPv6 / 绕过开关怎么选(回答用户提问用)
| 开关 | UCI 字段 | 作用 | |
|---|---|---|---|
| IPv6 DNS | enable_ipv6 | 内核认不认 IPv6。写入 mihomo 的 ipv6 与 dns.ipv6。关掉则凡是进代理的 v6 流量一律降级成 IPv4 | |
| 大陆 IPv4 绕过 | bypass_china | 国内 IPv4 目标在防火墙层直接放行,不进内核 | |
| 大陆 IPv6 绕过 | bypass_china_ipv6 | 国内 IPv6 目标在防火墙层直接放行,不进内核 |
IPv6 DNS 必须开(默认已是 true)。它关着而 ipv6_proxy=1 时,防火墙把 v6 交给内核、内核却不认 v6,境内外 IPv6 全部失效。
两个绕过必须同开或同关,不要一开一关:混搭会让同一站点的 v4 走直连、v6 走代理,对外露出两个不同源地址。
| 都勾(默认) | 都不勾 | ||
|---|---|---|---|
| 国内流量 | 防火墙直连,省 CPU、延迟低 | 全进内核 | |
| 设备公网 IPv6 | 保留设备自己的 GUA | 由路由器代发 | |
| 分流依据 | GeoIP 地址段,CDN 可能误判 | 内核规则(域名级,更准) | |
| 面板日志/统计 | 看不到国内连接 | 完整 | |
| 适合 | 一般情况;大流量、在意设备 GUA | 低端设备 CPU 吃紧;需要完整统计 |
「都勾」成立的前提:「Fake-IP 过滤域名」里要有 rule-set:cn_domain(默认带)。它让国内域名返回真实 IP,从而与游戏等下发的硬编码 IP 走同一条直连路径;缺了它国内域名会走 fake-ip 进内核,同一应用的连接被分到两条路上,端游可能偶发掉线。
DNS 接管
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.github/skills/clashoo-user-guide/SKILL.md
Popularity
- Repository stars
- 278
- Repository forks
- 27
- 7-day trend score
- 28
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/kenzok8/openwrt-clashoo/clashoo-user-guide)