Skip to main content Home Creators vernesong openclash openclash-user-guide
openclash-user-guide OpenClash 用户功能指南。用于回答用户关于 OpenClash 插件如何启用/关闭各项功能的问题,包括:运行模式切换、代理开关、DNS 设置、流量控制、访问控制黑白名单、IPv6 开关、规则/GEO 更新、自动重启、仪表盘设置、订阅管理、覆写设置等。每个选项均标注了对应的 UCI 配置项、修改的 Mihomo YAML 配置段、以及触发的脚本。Use when user asks how to enable, disable, configure, or troubleshoot any OpenClash feature on OpenWrt.
Jump to install Skills Marketplace Discover and explore AI skills built by the community.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Copy promptShow prompt details A direct command skips the review prompt. Inspect the source before running it.
npx skills add https://github.com/vernesong/OpenClash --skill openclash-user-guideThe command stays on one line. Scroll horizontally to inspect it before copying.
Prefer a local copy? Download the files currently available to SkillsMP.
Download Zip Downloading...
Related occupations SOC
Based on SOC occupation classification
name openclash-user-guide description OpenClash 用户功能指南。用于回答用户关于 OpenClash 插件如何启用/关闭各项功能的问题,包括:运行模式切换、代理开关、DNS 设置、流量控制、访问控制黑白名单、IPv6 开关、规则/GEO 更新、自动重启、仪表盘设置、订阅管理、覆写设置等。每个选项均标注了对应的 UCI 配置项、修改的 Mihomo YAML 配置段、以及触发的脚本。Use when user asks how to enable, disable, configure, or troubleshoot any OpenClash feature on OpenWrt. instructions You are an OpenClash expert assistant. OpenClash is a LuCI plugin for OpenWrt that manages the Mihomo (Clash Meta) proxy kernel.
When answering user questions about OpenClash:
1. When users report any issue (cannot access internet, DNS failure, startup failure, etc.), FIRST ask them to generate a debug log — either via LuCI (运行日志 → 生成日志) or SSH (`/usr/share/openclash/openclash_debug.sh`). The debug log contains dependency checks, config, firewall rules, and system info in one step.
2. If the debug log is insufficient to pinpoint the issue, give users precise CLI commands from 第七部分 (诊断命令与 CLI 参考), ask them to run on the router and paste back the output.
3. Once the root cause is identified, provide LuCI web UI navigation paths (e.g. 服务 → OpenClash → 插件设置 → 流量控制) to fix the configuration.
4. For feature configuration questions (how to enable/disable/set options), provide LuCI paths directly — no debug log needed.
5. Explain underlying principles (firewall chains, YAML transformation logic) — not just steps.
6. Never guess — if information is not covered in this document, actively query: Mihomo Wiki (https://wiki.metacubex.one/config/), Meta-Docs (https://github.com/MetaCubeX/Meta-Docs), OpenClash source code (https://github.com/vernesong/OpenClash/tree/dev), Mihomo core source code (https://github.com/MetaCubeX/mihomo/tree/Alpha), Smart core source code (https://github.com/vernesong/mihomo/tree/Alpha). For bugs/errors, also search: OpenClash Issues (https://github.com/vernesong/OpenClash/issues) for plugin-side problems, Mihomo Issues (https://github.com/MetaCubeX/mihomo/issues) for core-side problems.
7. Cite sources when information comes from external queries.
type knowledge-base tags ["openclash","openwrt","mihomo","clash","proxy","networking"] argument-hint 询问 OpenClash 功能如何开启/关闭 user-invocable true disable-model-invocation false
OpenClash 完整功能参考指南
AI 行为总则
本文档是 AI 的知识库,而非给用户看的说明书。任何 AI 模型(Copilot / Claude / ChatGPT / Gemini / DeepSeek 等)在回答 OpenClash 相关问题时均应遵循以下原则。
排查优先级(从快到慢,逐层递进) :
① 先要日志 — 用户报告问题时,首先让用户生成调试日志(包含依赖检查、配置、防火墙规则、系统信息等 20+ 章节)
② 日志不足时给命令 — 对照第七部分决策树,给精确 CLI 命令让用户执行
③ 确定根因后给路径 — 定位问题后,给 LuCI 操作路径指导修复配置
④ 仍未解决查外部 — 查 Issues / 源码 / Mihomo Wiki
原则 说明 主动查证,不猜测 遇到本文档未覆盖的 Mihomo 配置字段或实现细节时,禁止编造 。必须使用工具主动查询外部资源(Mihomo Wiki / Meta-Docs / Mihomo 核心源码 / OpenClash 源码 / Smart 核心源码),整理后告知用户。详见文档末尾「超出本文档范围的查询」节。 查源码,不只查文档 当用户询问"为什么某选项不生效"、"底层实现逻辑是什么"时,不能仅依赖 [Mihomo Wiki] 和 [Meta-Docs] 的配置文档。必须进一步查阅 Mihomo 核心源码 、OpenClash 源码 和 Smart 核心源码 中的对应脚本/函数,理解实际执行逻辑。 先要日志,不盲猜 用户报告任何异常(无法上网、DNS 异常、启动失败、节点不通等)时,第一步总是先让用户生成调试日志 ,而非猜测或直接给诊断命令。调试日志一键包含依赖检查、运行状态、防火墙规则、系统信息等 20+ 章节,比逐条执行诊断命令高效得多。生成方式:① LuCI 页面 :「运行日志」→「生成日志」按钮;② SSH 命令 :/usr/share/openclash/openclash_debug.sh(输出 /tmp/openclash_debug.log)。拿到日志后对照「日志与错误信息速查」和第七部分决策树进行诊断。 日志不足再给命令 仅当调试日志不足以定位问题时,才按第七部分的诊断决策树给用户精确的 CLI 诊断命令。优先使用 🟢 安全查询命令,对 🟡/🔴 命令附带风险说明。用户执行后粘贴输出,AI 分析结果决定下一步。 配置给路径,修复给步骤 功能配置(如何开启/关闭/设置选项)和问题修复 → 给出 LuCI Web 界面操作路径(如「服务 → OpenClash → 插件设置 → 流量控制」),而非命令行。仅在用户明确要求 CLI 操作或 LuCI 不可用时才提供终端命令。 解释原理,不只给步骤 说明配置选项背后的工作原理(如防火墙规则链、YAML 转换逻辑),帮助用户理解后再操作,降低误操作风险。 引用来源 当信息来自外部查询(Mihomo Wiki、源码、Issues 等),在回复末尾注明来源,让用户知道信息的权威性。 查 Issues,不闭门造车 当用户遇到的功能问题在本文档中未覆盖,或报错信息在错误速查表中无匹配项时,必须主动搜索 Issues 查找是否存在相同或相似的问题:① 插件配置/订阅/防火墙/UI 相关问题 → 搜索 OpenClash Issues ;② 内核级问题(代理协议/TUN/DNS 解析/规则引擎等 Mihomo 核心行为) → 搜索 Mihomo Issues 。优先参考:作者/维护者的回复 (OpenClash 标有 Owner 标签的 vernesong;Mihomo 标有 Contributor/Collaborator 标签的回复)——代表官方立场或已知 bug; ——代表经过验证的有效方案; (如 、 、 等)——可直接复用于用户的问题排查。搜索时使用用户报错中的关键错误信息或功能描述作为关键词。
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub 高赞反应(👍)的社区回复
同类问题中的诊断命令
nft list set
dig
uci show
资源 URL 用途 Mihomo Wiki https://wiki.metacubex.one/config/Mihomo YAML 配置字段文档 Meta-Docs https://github.com/MetaCubeX/Meta-DocsMihomo 配置字段权威参考 OpenClash Issues https://github.com/vernesong/OpenClash/issues搜索插件侧已知问题、社区方案、作者回复 Mihomo Issues https://github.com/MetaCubeX/mihomo/issues搜索内核侧已知问题(代理协议/TUN/DNS/规则引擎等) Mihomo 核心源码 https://github.com/MetaCubeX/mihomo/tree/AlphaMihomo 核心实现(代理协议/规则引擎/DNS/TUN 等 Go 源码) OpenClash 源码 https://github.com/vernesong/OpenClash/tree/dev插件实现逻辑(Shell/Ruby/Lua 脚本) Smart 核心源码 https://github.com/vernesong/mihomo/tree/AlphaSmart 策略、LightGBM 模型实现
完整依赖清单与故障排查
AI 行为指引 : 当用户报告启动失败、功能异常时,AI 应先让用户生成调试日志 (LuCI「运行日志」→「生成日志」或 SSH openclash_debug.sh),然后对照日志中的 #===== 依赖检查 =====# 段检查依赖完整性。对于缺失的依赖,指导用户在 LuCI 的「系统 → 软件包」中搜索安装。
固件提醒 : 推荐使用 ImmortalWrt 或 OpenWrt 官方固件(需自行将 dnsmasq 替换为 dnsmasq-full)。不推荐使用第三方魔改/高大全固件、以及已停止维护的旧版固件。旁路由组网存在固有的网络层面缺陷,强烈建议采用主路由架构部署 OpenClash。
一、包依赖总览(来自 Makefile DEPENDS 和 init.d 运行时检查) OpenClash 依赖以下软件包,由 opkg/apk 在安装时自动拉取。若手动卸载了其中某个包,会导致对应功能异常。
依赖包 作用 缺失症状 安装命令 (LuCI) dnsmasq-fullDNS 转发与劫持(必须用 full 版,非精简版) DNS 劫持失效、客户端无法解析域名 「系统→软件包」搜索 dnsmasq-full bash所有 Shell 脚本的解释器 启动脚本执行失败 搜索 bash curlHTTP/HTTPS 下载(订阅、GEO、Dashboard) 订阅更新失败、GEO 下载报错 搜索 curl ca-bundleCA 证书包(curl HTTPS 验证) curl SSL 证书错误 搜索 ca-bundle ip-full策略路由和 ipset/nftset 操作 路由表操作失败 搜索 ip-full rubyYAML 解析与配置生成 yml_change.sh 报错、配置无法生成搜索 ruby ruby-yamlRuby YAML 库 Ruby YAML 解析报错、订阅处理失败 搜索 ruby-yaml ruby-psychRuby YAML 解析引擎(新版依赖) 同上,日志提示 "Ruby Works Abnormally" 搜索 ruby-psych ruby-pstoreRuby 持久化存储(订阅缓存) 订阅配置缓存异常 搜索 ruby-pstore kmod-tunTUN 虚拟网卡内核模块 TUN 模式无法启动 搜索 kmod-tun kmod-inet-diag进程名诊断(PROCESS-NAME 规则) PROCESS-NAME 规则不生效 搜索 kmod-inet-diag unzip解压 Dashboard/GEO 等压缩包 Dashboard 下载后无法加载 搜索 unzip luci-compatLuCI >= 19.07 兼容层(新版 LuCI 必装) LuCI 页面布局错乱、JS 报错 搜索 luci-compat
二、防火墙相关依赖(按 fw4/fw3 自动区分) 环境 依赖包 作用 缺失症状 安装命令 (LuCI) fw4 (nftables) kmod-nft-tproxynftables TPROXY 透明代理(UDP) UDP 无法代理、启动日志报 "nft_tproxy module not found" 搜索 kmod-nft-tproxy fw3 (iptables) kmod-ipt-tproxyiptables TPROXY 模块 UDP 无法代理、日志报 "xt_TPROXY" 搜索 kmod-ipt-tproxy fw3 (iptables) iptables-mod-tproxyiptables TPROXY 用户态工具 TPROXY 规则无法创建 搜索 iptables-mod-tproxy fw3 (iptables) kmod-ipt-extraiptables 扩展匹配模块 高级规则匹配失败 搜索 kmod-ipt-extra fw3 (iptables) iptables-mod-extraiptables extra 用户态工具 同上 搜索 iptables-mod-extra fw3 (iptables) kmod-ipt-natiptables NAT 内核模块 REDIRECT/DNAT 规则失败 搜索 kmod-ipt-nat fw3 (iptables) ipsetIP 集合管理工具 中国 IP 绕行、黑白名单失效 搜索 ipset
三、dnsmasq 特殊要求 要求 说明 必须使用 dnsmasq-full OpenWrt 自带的 dnsmasq 精简版缺少 ipset/nftset 支持,OpenClash 的 DNS 劫持和 chnroute 旁路依赖此功能 ipset 编译选项 dnsmasq --version 输出需包含 ipset(fw3 环境必需)nftset 编译选项 dnsmasq --version 输出需包含 nftset(fw4 环境,影响 chnroute_pass 的 nftset 集成)
诊断方法 : 先在 LuCI 的「运行日志」页面生成调试日志,在日志的依赖检查段确认 dnsmasq 版本。如需手动确认,可在路由器终端执行 dnsmasq --version | head -1。
如果不是,在 LuCI 的「系统 → 软件包」中卸载 dnsmasq 然后安装 dnsmasq-full。
四、内核模块加载机制(check_mod() 函数) init.d/openclash 的 check_mod() 函数以四级回退方式检查和加载内核模块:
容器检测 — 检测 Docker/LXC/Podman 等容器环境,容器内直接返回成功(无法加载内核模块)
内核编译检查 — 检查 /proc/config.gz 中是否有 CONFIG_<MODULE>=y(静态编译进内核,无需 modprobe)
已加载检查 — lsmod | grep 检查模块是否已在内核中加载
动态加载尝试 — modprobe <module> 尝试加载,全部失败则输出 LOG_ERROR
TUN 模块注意事项 : check_mod "tun" 仅在 TUN 模式 或 IPv6 TUN 模式 时才被调用。Redir-Host/Fake-IP(非 TUN)模式下不会检查 kmod-tun。
五、更新后自动修复依赖(openclash_update.sh) 插件更新后,install_missing_packages() 会遍历以下关键包列表,对缺失的包自动重装(支持 opkg 和 apk 双包管理器,最多重试 3 次):
luci-compat kmod-inet-diag kmod-nft-tproxy kmod-ipt-nat iptables-mod-tproxy iptables-mod-extra ipset
六、常见依赖故障速查 故障现象 可能原因 LuCI 排查路径 启动失败,日志显示 "Ruby Works Abnormally" ruby 或 ruby-yaml 未安装/损坏「系统→软件包」确认 ruby、ruby-yaml、ruby-psych 已安装 TUN 模式启动报错 "tun module not found" kmod-tun 未安装或内核版本不匹配「系统→软件包」安装 kmod-tun,注意内核版本匹配 订阅更新报 SSL 证书错误 ca-bundle 未安装或过期「系统→软件包」安装/更新 ca-bundle DNS 劫持不生效 安装了精简版 dnsmasq 而非 dnsmasq-full 「系统→软件包」卸载 dnsmasq,安装 dnsmasq-full UDP 流量无法代理(fw4) kmod-nft-tproxy 未安装「系统→软件包」安装 kmod-nft-tproxy Dashboard 页面白屏/404 unzip 未安装导致仪表盘解压失败「系统→软件包」安装 unzip,然后重新下载仪表盘 LuCI 页面布局错乱、按钮无响应 luci-compat 未安装「系统→软件包」安装 luci-compat 进程名规则 (PROCESS-NAME) 不生效 kmod-inet-diag 未安装「系统→软件包」安装 kmod-inet-diag 更新插件后某些包丢失 更新过程中包被意外移除 更新脚本会自动修复,如仍未恢复,手动安装缺失包
通用依赖诊断方法 : 在 LuCI 的「运行日志」页面点击「生成日志」,然后在日志的 #===== 依赖检查 =====# 段查看所有依赖包的状态(已安装/未安装)。将此日志提供给技术支持时也包含完整的依赖信息。
系统架构速查 ┌─────────────────────────────────────────────────────────────────┐
│ LuCI Web UI (Lua CBI) — http://路由器LAN_IP/cgi-bin/luci │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ settings │ │ overwrite│ │ subscribe│ ... │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ UCI 读写 │ │ │
│ ▼ ▼ ▼ │
│ /etc/config/openclash — UCI 配置文件 (所有选项持久化在此) │
│ │ │
│ ▼ Shell Scripts ( /usr/share/openclash/ ) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ openclash.sh → 订阅下载/更新/节点过滤 │ │
│ │ openclash_core.sh → 核心二进制更新 │ │
│ │ openclash_update.sh → 插件 IPK 更新 │ │
│ │ openclash_geo.sh → GEO 数据库下载 (ipdb/dat/geosite/asn) │
│ │ openclash_chnroute.sh → 大陆 IP 路由表更新 │ │
│ │ yml_change.sh → Ruby 修改 YAML (端口/模式/DNS/TUN/认证) │
│ │ yml_rules_change.sh → Ruby 修改 YAML (规则/Provider/URL-Test) │
│ │ openclash_debug.sh → 诊断日志收集 │ │
│ │ openclash_watchdog.sh → 核心存活 + 流媒体解锁守护 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ 生成 / 覆写 │
│ /etc/openclash/config/*.yaml — 原始订阅配置 │
│ /etc/openclash/*.yaml — 经脚本处理后的运行配置 │
│ /etc/openclash/overwrite/ — 覆写模块文件 │
│ /etc/openclash/custom/ — 用户自定义规则/DNS/防火墙脚本 │
│ │ │
│ ▼ │
│ /etc/openclash/clash — symlink → /etc/openclash/core/clash_meta│
│ /etc/openclash/ — GEO 数据: Country.mmdb, GeoSite.dat 等 │
└─────────────────────────────────────────────────────────────────┘
API 入口: http://路由器LAN_IP:9090 (external-controller)
Dashboard: http://路由器LAN_IP:9090/ui/
路径 作用 /etc/config/openclashUCI 配置文件,所有 LuCI 选项持久化在此 /etc/openclash/OpenClash 工作目录(核心、GEO 数据、Chnroute 列表) /etc/openclash/config/原始订阅配置存放目录(.yaml 文件,经 yml_change.sh 处理后生成 /etc/openclash/<name>.yaml 运行配置) /etc/openclash/overwrite/覆写模块文件(INI 格式,定义自定义 YAML 覆盖) /etc/openclash/custom/用户自定义文件(规则列表、DNS 策略、Hosts、防火墙脚本、Sniffer 配置等) /etc/openclash/core/核心二进制存放目录(多版本共存,/etc/openclash/clash 是到 core/clash_meta 的 symlink) /etc/openclash/dashboard/Dashboard 静态文件(yacd/metacubexd/zashboard) /etc/openclash/Model.binLightGBM 智能策略模型文件(注意:不是目录,是单个 .bin 文件) /usr/share/openclash/插件脚本目录(Shell/Ruby/Lua 脚本) /tmp/openclash.log运行日志 /tmp/openclash_start.log启动日志 /tmp/etc/openclash/小闪存模式下的工作目录(重启后清空) /var/etc/openclash.include防火墙规则加载文件(由 firewall UCI 自动 include)
UCI 配置根 : openclash (所有选项均在 uci show openclash 可见)
Mihomo 运行时 API : http://路由器LAN_IP:9090 — 部分动态选项通过 PATCH /configs 热生效。注意:API 地址是路由器 LAN 口 IP ,不是 127.0.0.1(核心监听 0.0.0.0,但 LuCI 后端通过 127.0.0.1 直连核心 API)
核心启动脚本 : /etc/init.d/openclash {start|stop|restart|reload|enable|disable}
自定义文件目录 : /etc/openclash/custom/ — 存放用户自定义规则/DNS/防火墙脚本
系统启动完整流程 /etc/init.d/openclash start_service()
│
├─ 第1步: 读取配置
│ ├─ overwrite_file() → 遍历 config_overwrite 条目,生成 /tmp/yaml_overwrite.sh
│ ├─ get_config() → 读取所有 UCI 选项为 Shell 变量
│ ├─ config_choose() → 选择活动的 YAML 配置文件
│ └─ do_run_mode() → 解析 en_mode → 拆分 en_mode_tun/en_mode_fakeip/en_mode_mix
│
├─ 第2步: 环境准备
│ ├─ do_run_file() → 检查/下载核心二进制 (/etc/openclash/core/clash_meta)
│ ├─ 创建 symlink → ln -s /etc/openclash/core/clash_meta /etc/openclash/clash
│ └─ 小闪存模式处理 → 将文件移到 /tmp/etc/openclash
│
├─ 第3步: 修改 YAML 配置(按顺序执行)
│ ├─ ① yml_change.sh → Ruby 脚本,~48 个 UCI 参数
│ │ ├─ 设置端口 (proxy_port, tproxy_port, http_port, socks_port, mixed_port, dns_port)
│ │ ├─ 设置模式 (mode, log-level, dns.enhanced-mode)
│ │ ├─ 设置 TUN (tun.enable, tun.stack, tun.device, tun.dns-hijack)
│ │ ├─ 设置 DNS (dns.* 完整段: nameserver, fallback, fake-ip-range, respect-rules...)
│ │ ├─ 设置 Sniffer (sniffer.* 完整段)
│ │ ├─ 设置认证 (authentication: [user:pass])
│ │ ├─ 设置 Meta (tcp-concurrent, unified-delay, find-process-mode, geodata-loader...)
│ │ ├─ 设置 GEO (geox-url.*, geo-auto-update, geo-update-interval)
│ │ ├─ 设置 Smart/LGBM (模型 URL, 更新间隔)
│ │ ├─ 设置 Dashboard (external-controller, secret, external-ui)
│ │ └─ 设置 NTP (ntp.*), CORS, IPv6, routing-mark
│ │
│ ├─ ② yml_rules_change.sh → Ruby 脚本
│ │ ├─ enable_rule_proxy → 注入 BT/P2P 直连规则 + PROCESS-NAME 规则
│ │ ├─ tolerance/urltest_* → 覆写 url-test 策略组参数
│ │ ├─ github_address_mod → 替换 GitHub Raw URL 为 CDN
│ │ ├─ enable_custom_clash_rules → 从 *.list 文件注入自定义规则
│ │ └─ auto_smart_switch → 将 url-test/load-balance 组改为 smart 类型
│ │
│ └─ ③ /tmp/yaml_overwrite.sh → 来自覆写模块 [Overwrite] 段的自定义脚本
│
├─ 第4步: 启动核心
│ └─ procd 启动 clash -d /etc/openclash -f <config.yaml>
│ ├─ respawn 配置: 重试 5 次, 间隔 3s, 超时 300s
│ └─ rlimit_nofile: 1048576 (最大文件描述符)
│
├─ 第5步: 异步等待核心就绪 (check_core_status "start" &)
│ ├─ 轮询 HTTP 200 from http://127.0.0.1:9090
│ └─ 就绪后执行:
│ ├─ set_firewall() → 建立 iptables/nftables 透明代理规则
│ │ ├─ REDIRECT/T_PROXY 规则 (按 en_mode)
│ │ ├─ DNS 劫持规则 (按 enable_redirect_dns)
│ │ ├─ 访问控制规则 (按 lan_ac_mode + lists)
│ │ ├─ QUIC 阻断规则 (按 disable_udp_quic)
│ │ ├─ 中国 IP 绕行规则 (按 china_ip_route)
│ │ └─ IPv6 防火墙链 (按 ipv6_enable)
│ └─ change_dnsmasq() → DNS 劫持 (dnsmasq → Clash DNS)
│
└─ 第6步: 定时任务 + 守护进程
├─ add_cron() → 注册 cron 任务
│ ├─ openclash.sh → 定时更新订阅
│ ├─ openclash_geo.sh → 定时更新 GEO 数据
│ ├─ openclash_chnroute.sh → 定时更新大陆路由
│ └─ /etc/init.d/openclash restart → 定时自动重启
└─ start_watchdog() → 启动守护进程
├─ openclash_watchdog.sh → 核心存活监控
└─ openclash_streaming_unlock.lua → 流媒体解锁守护
备份策略组状态历史 → 2. revert_firewall() 清除防火墙规则 → 3. kill clash + streaming unlock 进程 → 4. revert_dnsmasq() 恢复 DNS → 5. del_cron() 清除定时任务
操作 方式 延迟 切换代理模式 (rule/global/direct) Mihomo API PATCH /configs (mode) 即时 切换日志级别 Mihomo API PATCH /configs (log-level) 即时 切换 Sniffer/Rules Mihomo API PATCH /configs 即时 修改端口/TUN/DNS/覆写 需重启核心 (修改 YAML) ~3-5s 修改防火墙规则 /etc/init.d/openclash reload即时 修改访问控制 需重启 (重建防火墙链) ~5s
防火墙与 DNS 规则详解(iptables + nftables 双后端)
OpenClash 同时支持 fw3 (iptables/ipset) 和 fw4 (nftables) 两种防火墙后端,通过 command -v fw4 自动检测:
存在 fw4 → 使用 nftables (OpenWrt 22.03+)
不存在 fw4 → 使用 iptables + ipset (旧版 OpenWrt)
所有 if [ -n "$FW4" ] / if [ -z "$FW4" ] 分支互斥,两种后端的规则逻辑完全相同 ,仅语法不同。
AI 行为指引 : 当用户询问透明代理/防火墙相关问题时(如"为什么设备无法上网"、"旁路由模式下流量不走代理"、
"如何验证防火墙规则是否生效"、"TUN 模式下某协议不通"),AI 应先让用户生成调试日志
(含完整防火墙规则链)。日志不足时再指导用户在路由器终端执行 nft list ruleset(fw4)或
iptables -t nat -L -n(fw3)查看实际规则。结合下表中的链结构和规则排序,对比用户的需求判断规则是否如预期生效。
如涉及底层实现细节,查阅 OpenClash 源码 中
/etc/init.d/openclash 的 set_firewall() 函数。
常见问题:规则排序错误(bypass 在 redirect 之后)、fwmark 未设置导致策略路由不生效、
DNS 劫持端口与 dnsmasq 冲突。
模式解析表 UCI en_mode en_mode_tun数据面 DNS 面 redir-host(空) TCP REDIRECT + UDP TPROXY dns.enhanced-mode: redir-hostfake-ip(空) TCP REDIRECT + UDP TPROXY dns.enhanced-mode: fake-ipredir-host-tun1TCP+UDP 全 TUN dns.enhanced-mode: redir-hostfake-ip-tun1TCP+UDP 全 TUN dns.enhanced-mode: fake-ipredir-host-mix2TCP REDIRECT + UDP TUN dns.enhanced-mode: redir-hostfake-ip-mix2TCP REDIRECT + UDP TUN dns.enhanced-mode: fake-ip
PROXY_FWMARK="0x162"
PROXY_ROUTE_TABLE="0x162"
SKIP_GROUP="65534"
一、fw4 (nftables) 链结构 — inet fw4 表
A. DNS 劫持链
DNS 劫持规则使用 meta nfproto {ipv4} 限制仅匹配 IPv4 流量;IPv6 DNS 劫持在 IPv6 段独立处理。
fw4_has_dns_hijack_rule() 函数在插入前检查 dstnat 链是否已有 OpenClash DNS Hijack 规则,避免重复。
enable_redirect_dns=1 (Dnsmasq 转发模式) — DNS 53 端口 → dnsmasq 端口:
nft insert rule inet fw4 dstnat position 0 \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ip saddr != @lan_ac_black_ips ether saddr != @lan_ac_black_macs \
counter redirect to <dnsmasq_port> comment "OpenClash DNS Hijack"
nft insert rule inet fw4 dstnat position 0 \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ip saddr @lan_ac_white_ips counter redirect to <dnsmasq_port> comment "OpenClash DNS Hijack"
nft insert rule inet fw4 dstnat position 0 \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ether saddr @lan_ac_white_macs counter redirect to <dnsmasq_port> comment "OpenClash DNS Hijack"
nft add chain inet fw4 nat_output { type nat hook output priority -1; }
nft insert rule inet fw4 nat_output position 0 \
skgid != 65534 meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ip daddr {127.0.0.1} counter redirect to <dnsmasq_port> comment "OpenClash DNS Hijack"
enable_redirect_dns=2 (防火墙重定向模式) — DNS 53 端口 → Mihomo DNS 端口 (7874):
nft add chain inet fw4 openclash_dns_redirect
nft flush chain inet fw4 openclash_dns_redirect
nft add rule inet fw4 openclash_dns_redirect \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ip saddr != @lan_ac_black_ips ether saddr != @lan_ac_black_macs \
counter redirect to <dns_port> comment "OpenClash DNS Hijack"
nft add rule inet fw4 openclash_dns_redirect \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ip saddr @lan_ac_white_ips counter redirect to <dns_port> comment "OpenClash DNS Hijack"
nft add rule inet fw4 openclash_dns_redirect \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ether saddr @lan_ac_white_macs counter redirect to <dns_port> comment "OpenClash DNS Hijack"
nft insert rule inet fw4 dstnat position 0 \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 counter jump openclash_dns_redirect
nft add chain inet fw4 nat_output { type nat hook output priority -1; }
nft insert rule inet fw4 nat_output position 0 \
meta nfproto {ipv4} meta l4proto {tcp,udp} th dport 53 \
ip daddr {127.0.0.1} meta skgid != 65534 counter redirect to <dns_port> comment "OpenClash DNS Hijack"
DNS 劫持模式对比 : 模式 1 (Dnsmasq) 将 DNS 先转到 dnsmasq 再转发到 Mihomo DNS,支持 chnroute_pass 的 dnsmasq ipset/nftset 集成;模式 2 (防火墙) 直接将 DNS 流量 DNAT 到 Mihomo DNS 端口,绕过 dnsmasq,性能更高但失去 chnroute_pass 的 dnsmasq 集成。两种模式均可配合 AC 黑白名单进行设备级 DNS 劫持控制。
B. 非 TUN 模式链 (en_mode_tun 为空或 2) 链名 钩子来源 协议 动作 触发条件 openclashdstnat jumpTCP REDIRECT → $proxy_port(7892) 始终 openclash_manglemangle_prerouting jumpUDP TPROXY → :$tproxy_port(7895), mark 0x162 enable_udp_proxy=1 或 Fake-IP 模式openclash_upnpopenclash_mangle jumpUDP UPNP 端口排除 (RETURN) 自动检测 upnpd openclash_outputnat_output jumpTCP 路由器自身 TCP REDIRECT router_self_proxy=1 或 Fake-IP 模式openclash_mangle_outputmangle_output jumpUDP 路由器自身 UDP 标记 router_self_proxy=1+enable_udp_proxy=1 或 Fake-IP
openclash 链规则排序 (TCP REDIRECT) — 与 init.d 实际代码一致:
nft add rule inet fw4 openclash ip daddr @localnetwork counter return
nft add rule inet fw4 openclash ct direction reply counter return
nft add rule inet fw4 openclash ether saddr != @lan_ac_white_macs \
ip saddr != @lan_ac_white_ips counter return
nft add rule inet fw4 openclash ether saddr != @lan_ac_white_macs counter return
nft add rule inet fw4 openclash ip saddr != @lan_ac_white_ips counter return
nft add rule inet fw4 openclash ip saddr @lan_ac_black_ips counter return
nft add rule inet fw4 openclash ether saddr @lan_ac_black_macs counter return
nft add rule inet fw4 openclash ip protocol tcp \
ip daddr {<fakeip_range>} counter redirect to $proxy_port
nft add rule inet fw4 openclash ip daddr @wan_ac_black_ips counter return
nft add rule inet fw4 openclash th dport @wan_ac_black_ports counter return
nft add rule inet fw4 openclash th dport != @common_ports counter return
nft add rule inet fw4 openclash ip protocol tcp counter redirect to $proxy_port
nft add rule inet fw4 dstnat meta nfproto {ipv4} ip protocol tcp counter jump openclash
nft insert rule inet fw4 input position 0 ct status dnat accept comment "OpenClash Redirect Accept"
openclash_mangle 链规则排序 (UDP TPROXY) — 仅在 enable_udp_proxy=1 或 Fake-IP 模式时创建:
nft add rule inet fw4 openclash_mangle ip daddr @localnetwork counter return
nft add rule inet fw4 openclash_mangle ct direction reply counter return
nft add rule inet fw4 openclash_mangle meta l4proto {udp} \
ip daddr {<fakeip_range>} mark set $PROXY_FWMARK \
tproxy ip to 127.0.0.1:$tproxy_port counter accept
nft add rule inet fw4 openclash_mangle ip protocol udp counter jump openclash_upnp
nft add rule inet fw4 openclash_mangle meta l4proto {udp} \
mark set $PROXY_FWMARK tproxy ip to 127.0.0.1:$tproxy_port counter accept
nft add rule inet fw4 mangle_prerouting meta nfproto {ipv4} ip protocol udp counter jump openclash_mangle
nft insert rule inet fw4 input position 0 meta mark $PROXY_FWMARK accept comment "OpenClash TPROXY Accept"
注意 : 当 enable_udp_proxy != 1 但 en_mode = fake-ip 时,仍会创建简化的 openclash_mangle 链仅处理 Fake-IP UDP 流量(无 common_ports/china_ip_route/UPNP 检查)。ip rule add fwmark $PROXY_FWMARK table $PROXY_ROUTE_TABLE + ip route add local 0.0.0.0/0 dev lo table $PROXY_ROUTE_TABLE 在 UDP TPROXY 启用时创建策略路由。
C. TUN 模式链 (en_mode_tun=1 或 2)
TUN 模式使用 meta nfproto {ipv4} 限制仅处理 IPv4 流量,IPv6 由独立链处理。
全 TUN 模式 (en_mode_tun=1) 标记 tcp+udp;混合模式 (en_mode_tun=2) 仅标记 udp(TCP 仍走 REDIRECT)。
链名 钩子来源 协议 动作 触发条件 openclash_manglemangle_prerouting jumpTCP+UDP 设置 fwmark 0x162 始终 openclash_mangle_outputmangle_output jumpTCP+UDP 路由器自身 fwmark router_self_proxy=1 或 Fake-IPopenclash_upnpopenclash_mangle jumpUDP UPNP 端口排除 (RETURN) 自动检测
openclash_mangle 规则排序 (TUN 模式) — 与 init.d 实际代码一致:
nft add rule inet fw4 openclash_mangle meta l4proto {tcp,udp} \
iifname utun counter return
nft add rule inet fw4 openclash_mangle ip daddr @localnetwork counter return
nft add rule inet fw4 openclash_mangle ct direction reply counter return
nft add rule inet fw4 openclash_mangle ether saddr != @lan_ac_white_macs \
ip saddr != @lan_ac_white_ips counter return
nft add rule inet fw4 openclash_mangle ip saddr @lan_ac_black_ips counter return
nft add rule inet fw4 openclash_mangle ether saddr @lan_ac_black_macs counter return
nft add rule inet fw4 openclash_mangle \
meta l4proto {tcp,udp} ip daddr {<fakeip_range>} mark set $PROXY_FWMARK counter
nft add rule inet fw4 openclash_mangle ip daddr @wan_ac_black_ips counter return
nft add rule inet fw4 openclash_mangle th dport @wan_ac_black_ports counter return
nft add rule inet fw4 openclash_mangle th dport != @common_ports counter return
nft add rule inet fw4 openclash_mangle meta nfproto {ipv4} \
ip protocol icmp icmp type echo-request mark set $PROXY_FWMARK counter accept \
comment "OpenClash ICMP Mark"
nft add rule inet fw4 openclash_mangle ip protocol udp counter jump openclash_upnp
nft add rule inet fw4 openclash_mangle mark set $PROXY_FWMARK counter
nft add rule inet fw4 mangle_prerouting meta nfproto {ipv4} counter jump openclash_mangle
TUN 转发规则 (utun 允许通过,同样使用 meta nfproto {ipv4}):
nft insert rule inet fw4 forward position 0 meta nfproto {ipv4} oifname utun counter accept \
comment "OpenClash TUN Forward"
nft insert rule inet fw4 forward position 0 meta nfproto {ipv4} iifname utun counter accept \
comment "OpenClash TUN Forward"
nft insert rule inet fw4 input position 0 meta nfproto {ipv4} iifname utun counter accept \
comment "OpenClash TUN Input"
nft insert rule inet fw4 srcnat position 0 meta nfproto {ipv4} oifname utun counter return \
comment "OpenClash TUN Postrouting"
TUN 模式 QUIC 阻断 (仅 disable_udp_quic=1):
nft insert rule inet fw4 forward position 0 oifname utun udp dport 443 \
ip daddr != @china_ip_route counter reject comment "OpenClash QUIC REJECT"
nft insert rule inet fw4 input position 0 udp dport 443 \
ip daddr != @china_ip_route counter reject comment "OpenClash QUIC REJECT"
D. IPv6 链 (独立于 IPv4)
IPv6 防火墙链仅在 ipv6_enable=1 时创建。ipv6_mode 决定数据面处理方式。
IPv6 DNS 劫持使用 meta nfproto {ipv6} + ip6 nexthdr {tcp,udp},与 IPv4 规则结构对称。
ipv6_modeTCP 处理 UDP 处理 策略路由 0 (TProxy)TPROXY → :$tproxy_port TPROXY → :$tproxy_port ip -6 rule/route1 (Redirect)REDIRECT → $proxy_port TPROXY → :$tproxy_port (需 enable_v6_udp_proxy=1) ip -6 rule/route2 (TUN)fwmark → utun fwmark → utun 无 (TUN 处理) 3 (Mix)REDIRECT → $proxy_port fwmark → utun 无 (TUN 处理 UDP)
nftables 链 功能 触发条件 openclash_v6IPv6 TCP REDIRECT ipv6_mode=1 或 3openclash_mangle_v6IPv6 TPROXY / TUN fwmark enable_v6_udp_proxy=1 或 ipv6_mode≠1openclash_output_v6路由器自身 IPv6 TCP router_self_proxy=1 + (ipv6_mode=1 或 3)openclash_mangle_output_v6路由器自身 IPv6 fwmark router_self_proxy=1openclash_post_v6旁路由 SNAT/MASQUERADE bypass_gateway_compatible=1openclash_wan6_input仅内网 IPv6 WAN 防护 intranet_allowed=1
IPv6 链规则结构 (以 openclash_mangle_v6 为例,包含 TProxy/TUN/Mix 所有模式的综合处理):
nft add rule inet fw4 openclash_mangle_v6 ip6 daddr @localnetwork6 counter return
nft add rule inet fw4 openclash_mangle_v6 ct direction reply counter return
nft add rule inet fw4 openclash_mangle_v6 meta nfproto {ipv6} \
ip6 nexthdr icmpv6 icmpv6 type echo-request mark set $PROXY_FWMARK counter accept \
comment "OpenClash ICMPv6 Redirect"
nft add rule inet fw4 mangle_prerouting meta nfproto {ipv6} counter jump openclash_mangle_v6
IPv6 TUN 转发规则 (仅 ipv6_mode=2 或 3):
nft insert rule inet fw4 forward position 0 meta nfproto {ipv6} oifname utun counter accept
nft insert rule inet fw4 forward position 0 meta nfproto {ipv6} iifname utun counter accept
nft insert rule inet fw4 input position 0 meta nfproto {ipv6} iifname utun counter accept
nft insert rule inet fw4 srcnat position 0 meta nfproto {ipv6} oifname utun counter return
IPv6 DNS 劫持 (与 IPv4 对称,使用 ip6 nexthdr 和 ip6 saddr):
nft insert rule inet fw4 dstnat position 0 \
meta nfproto {ipv6} ip6 nexthdr {tcp,udp} th dport 53 \
counter redirect to <dnsmasq_port> comment "OpenClash DNS Hijack"
nft add rule inet fw4 openclash_dns_redirect \
meta nfproto {ipv6} ip6 nexthdr {tcp,udp} th dport 53 \
counter redirect to <dns_port> comment "OpenClash DNS Hijack"
IPv6 QUIC 阻断 (仅 disable_udp_quic=1):
nft insert rule inet fw4 input position 0 udp dport 443 \
ip6 daddr != @china_ip6_route counter reject comment "OpenClash QUIC REJECT"
nft insert rule inet fw4 forward position 0 [oifname utun] udp dport 443 \
ip6 daddr != @china_ip6_route counter reject comment "OpenClash QUIC REJECT"
::/128, ::1/128, ::ffff:0:0/96, ::ffff:0:0:0/96, 64:ff9b::/96,
100::/64, 2001::/32, 2001:20::/28, 2001:db8::/32, 2002::/16,
fe80::/10, ff00::/8
E. ICMP/Ping 处理详解
AI 行为指引 : 当用户询问「为什么 ping 不走代理」、「ping 通但 TCP 不通」、「Fake-IP 模式下 ping 198.18.x.x 被拒绝」等问题时,AI 应结合本节解释 ICMP 在非 TUN 和 TUN 模式下的不同处理方式。
OpenClash 对 ICMP(ping)请求的处理取决于运行模式 :
1. 非 TUN 模式(Redir-Host / Fake-IP,en_mode_tun 为空) :
ICMP echo-request 在 openclash_mangle 链中被仅标记 fwmark(0x162)但不重定向 :
nft add rule inet fw4 openclash_mangle ip protocol icmp \
icmp type echo-request mark set "$PROXY_FWMARK " counter accept comment "OpenClash ICMP Mark"
ICMP 不会被代理 :非 TUN 模式下只有 TCP(REDIRECT)和 UDP(TPROXY)被重定向到 Mihomo 内核,ICMP 仅被标记 fwmark 后直接放行(accept)。这意味着 ping 请求走的是系统原始路由表,不会经过代理节点。
fwmark 的作用 :标记 0x162 仅影响策略路由选择(如旁路由回流),不影响代理行为本身。
绕过检查仍然生效 :ICMP 规则之前的 localnetwork/WAN-AC/LAN-AC/china_ip_route 等 RETURN 规则同样适用于 ICMP——被匹配的 ICMP 包会跳过标记规则。
路由器自身 ICMP :当 router_self_proxy=1 时,路由器发出的 ping 在 openclash_mangle_output 链中同样被标记。
2. TUN 模式(en_mode_tun=1) :
ICMP echo-request 在 openclash_mangle 链中被标记 fwmark,随后通过策略路由进入 TUN 虚拟网卡:
nft add rule inet fw4 openclash_mangle ip protocol icmp \
icmp type echo-request mark set "$PROXY_FWMARK " counter accept
ip rule add fwmark 0x162 table 0x162
ip route add default dev utun table 0x162
ICMP 被代理 :TUN 模式下所有标记 fwmark 的流量(包括 ICMP)被策略路由导向 utun 虚拟网卡,由 Mihomo 内核的 TUN 协议栈处理。
Mihomo 内核配置 :TUN 模式下 Mihomo 支持两个 ICMP 相关选项:
icmp-timeout(默认自动):ICMP 连接超时时间(秒)
disable-icmp-forwarding(默认 false):设为 true 可禁用 TUN 的 ICMP 转发(ping 将不被代理)
3. Fake-IP 非 TUN 模式的 Ping 阻断 :
仅在 Fake-IP 非 TUN 模式下 (en_mode=fake-ip, en_mode_tun 为空),对 Fake-IP 地址段(默认 198.18.0.0/16)的 ping 会被防火墙显式 REJECT :
nft insert rule inet fw4 input position 0 ip protocol icmp \
icmp type echo-request ip daddr { 198.18.0.0/16 } counter reject
nft insert rule inet fw4 forward position 0 ip protocol icmp \
icmp type echo-request ip daddr { 198.18.0.0/16 } counter reject
nft insert rule inet fw4 output position 0 ip protocol icmp \
icmp type echo-request ip daddr { 198.18.0.0/16 } \
skgid != 65534 counter reject
这是因为在非 TUN 模式下,Fake-IP 地址没有对应的 TCP/UDP 重定向路径(TCP 走 REDIRECT、UDP 走 TPROXY,但 ICMP 都不到达内核),发往这些地址的 ping 无意义且会干扰网络诊断。OUTPUT 链排除 skgid=65534 是为了避免影响 OpenClash 自身进程的内部通信。
TUN 模式下的区别 :Fake-IP TUN 模式不添加这些 REJECT 规则 。因为 ICMP 经策略路由进入 TUN 虚拟网卡后,由内核的 skipPingForwardingByAddr() 判断——若目标是 Fake-IP,内核返回伪造 echo-reply(~0ms 虚假延迟),不产生实际网络流量。
仅在 IPv6 TUN/混合模式(ipv6_mode=2 或 3)下标记:
nft add rule inet fw4 openclash_mangle_v6 ip6 nexthdr icmpv6 \
icmpv6 type echo-request mark set "$PROXY_FWMARK " counter accept
IPv6 非 TUN 模式下 ICMPv6 不被标记也不被代理 。IPv6 Fake-IP 地址范围的 ping 在非 TUN 的 IPv6 模式下 被 REJECT(返回 icmpv6 admin-prohibited),条件为 $ipv6_mode -ne 2 -a $ipv6_mode -ne 3。TUN/Mix 模式下的 IPv6 Fake-IP ping 同样由内核的 skipPingForwardingByAddr() 处理(伪造回复)。
运行模式 ICMP 进入 TUN ICMP fwmark 实际处理 Redir-Host (非TUN) ❌ ✅ 标记 0x162 仅标记后放行,不经内核处理 Fake-IP (非TUN) ❌ ✅ 标记 0x162 防火墙 REJECT Fake-IP 范围的 ping Redir-Host TUN ✅ ✅ 标记 0x162 真实 IP → DIRECT 直连延迟 Fake-IP TUN ✅ ✅ 标记 0x162 真实 IP → DIRECT 直连;Fake-IP → 伪造回复(~0ms 虚假延迟) Redir-Host Mix ✅ ✅ 标记 0x162 同 Redir-Host TUN:ICMP 标记后经策略路由进入 TUN,DIRECT 直连 Fake-IP Mix ✅ ✅ 标记 0x162 同 Fake-IP TUN:真实 IP → DIRECT 直连;Fake-IP → 内核伪造回复
实用提示 :如果用户发现 ping 不通但网页正常,首先确认不是 Fake-IP 非 TUN 模式下在 ping 被代理的域名(Fake-IP 返回 198.18.x.x,防火墙直接 REJECT)。Fake-IP TUN/Mix 模式下 ping Fake-IP 地址会返回虚假 ~0ms 延迟。非 Fake-IP 的真实 IP ping 在 TUN/Mix 模式下走 DIRECT 直连,延迟反映的是本地网络质量。
内核侧 ICMP 处理机制 (listener/sing_tun/prepare.go — Mihomo TUN 监听器):
当 ICMP echo-request 经策略路由进入 TUN 虚拟网卡后,Mihomo 内核按以下优先级处理:
目标是 Fake-IP 地址 (resolver.IsFakeIP(addr)) → 返回 nil, nil,内核用伪造的 echo-reply 回复。上层看到 "ping 成功" 但实际未经过网络,延迟显示为虚假的 ~0ms
目标是 TUN 接口自身 IP (inet4_address / inet6_address 范围内) → 同上,伪造回复
disable-icmp-forwarding: true → 所有 ICMP 均伪造回复
以上均不满足 (真实 IP 且未禁用转发) → 通过 ping.ConnectDestination() 以 DIRECT 模式 发出真实 ICMP 包,等待真实 reply。延迟为本地网络到目标的实际 RTT
ICMP 超时 : 默认 10 秒(sing.go 常量),可通过 icmp-timeout 自定义
关键结论 : TUN 模式下 ping 的处理分两种情况——目标是 Fake-IP → 虚假 0ms 延迟;目标是真实 IP → DIRECT 直连延迟。ping 始终不经过代理节点 ,这与 TCP/UDP 流量(经代理转发)的行为不同。
F. 高级流量控制 (firewall_lan_ac_traffic) — 按设备/协议/端口/DSCP 精确控制
UCI 配置路径 : config firewall_lan_ac_traffic 段,通过「插件设置 → 黑白名单 → 高级流量控制」配置。
每条规则作为一个独立的 UCI section,在 set_firewall() 中通过 config_foreach firewall_lan_ac_traffic 遍历插入到已有防火墙链的最前面(position 0),因此优先级高于 所有其他 bypass/redirect 规则。
字段 类型 可选值 说明 enabledbool 0/1是否启用此规则 src_ipstring IP/CIDR 或 localnetwork 源 IP 地址(localnetwork 表示匹配所有本地网络设备) src_portstring 端口范围 (如 0-65535) 源端口范围 protostring tcp/udp/both匹配的协议 targetstring return/accept/drop动作:return=跳过代理(默认)/accept=放行/drop=丢弃(等效return) dscpstring DSCP 值 (如 46) DSCP 标记匹配(需 iptables DSCP 模块,fw4 无需额外模块) familystring ipv4/ipv6/bothIP 协议族 interfacestring 接口名 (如 br-lan) 入接口匹配 userstring UID 按用户 ID 匹配(仅 OUTPUT 链) commentstring 描述文字 规则注释/标识
流量方向 IPv4 TCP 链 IPv4 UDP 链 IPv6 TCP 链 IPv6 UDP 链 入站 (LAN→路由器)openclash (非TUN) / openclash_mangle (TUN)openclash_mangleopenclash_v6 / openclash_mangle_v6openclash_mangle_v6出站 (路由器自身)openclash_output (非TUN) / openclash_mangle_output (TUN)openclash_mangle_outputopenclash_output_v6 / openclash_mangle_output_v6openclash_mangle_output_v6旁路由 SNAT openclash_postopenclash_postopenclash_post_v6openclash_post_v6
nft insert rule inet fw4 openclash position 0 tcp \
sport 0-65535 meta nfproto {ipv4} ip daddr != {<fakeip_range>} \
ip saddr {192.168.1.100} counter return comment "my_device_bypass"
nft insert rule inet fw4 openclash_output position 0 tcp \
sport 0-65535 meta skuid 1000 ip daddr != {<fakeip_range>} \
ip saddr {192.168.1.100} counter return comment "my_user_rule"
注意事项 :
所有规则自动排除 Fake-IP 地址范围(ip daddr != {<fakeip_range>}),确保 Fake-IP 流量不受影响。
target=drop 在防火墙规则中实际执行为 return(跳过代理),区别在于 drop 在策略路由/旁路由链中也执行 return。
user 字段仅对 OUTPUT 链生效(路由器自身出站流量),入站流量不支持 UID 匹配。
DSCP 匹配在 fw3 (iptables) 环境下需要 iptables-mod-extra(提供 DSCP 模块),如不可用会输出警告并跳过 DSCP 规则。
二、fw3 (iptables/ipset) 等效链 iptables 链 表 等效 nftables 链 openclashnatinet fw4 openclash (TCP)openclashmangleinet fw4 openclash_mangle (UDP)openclash_outputnatinet fw4 openclash_output (TCP)openclash_outputmangleinet fw4 openclash_mangle_output (UDP)openclash_postnatinet fw4 openclash_postopenclash_wan_inputfilterinet fw4 openclash_wan_inputopenclash_dns_redirectnatinet fw4 openclash_dns_redirectopenclash_upnpmangleinet fw4 openclash_upnp
fw3 兼容性层 — 自动检测 iptables 是否支持 owner/gid 模块:
if iptables 不支持 owner 模块; then
owner="-m mark --mark 0x1a0a"
noowner="-m mark ! --mark 0x1a0a"
else
owner="-m owner --gid-owner 65534"
noowner="-m owner ! --gid-owner 65534"
fi
iptables -t nat -N openclash
iptables -t nat -A openclash -m set --match-set localnetwork dst -j RETURN
iptables -t nat -A openclash -p tcp -d 198.18.0.0/16 -j REDIRECT --to-ports 7892
iptables -t nat -A openclash -p tcp -m set ! --match-set common_ports dst -j RETURN
iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports 7892
iptables -t nat -A PREROUTING -p tcp -j openclash
iptables -t mangle -N openclash
iptables -t mangle -A openclash -p udp -m set --match-set localnetwork dst -j RETURN
iptables -t mangle -A openclash -p udp -j TPROXY --on-port 7895 --tproxy-mark 0x162
iptables -t mangle -A PREROUTING -p udp -j openclash
三、各选项对防火墙规则的具体影响 选项 值 防火墙规则变化 china_ip_route (实验性:绕过指定区域 IP / China IP Route)1 (绕过大陆)在代理规则前插入 ip daddr @china_ip_route [ip daddr != @china_ip_route_pass] counter return — 目标为国内 IP 的流量跳过代理(若 enable_redirect_dns != 2 则附加 chnroute_pass 排除) 2 (绕过海外)插入 ip daddr != @china_ip_route [ip daddr != @china_ip_route_pass] counter return — 目标非国内 IP 的流量跳过代理 china_ip6_route (实验性:绕过指定区域 IPv6 / China IPv6 Route)1 (绕过大陆)IPv6 等效规则:ip6 daddr @china_ip6_route [ip6 daddr != @china_ip6_route_pass] counter return 2 (绕过海外)IPv6 等效规则:ip6 daddr != @china_ip6_route [ip6 daddr != @china_ip6_route_pass] counter return disable_udp_quic (禁用 QUIC / Disable QUIC)1全部模式在 INPUT/FORWARD 链插入 QUIC REJECT 规则 (udp dport 443,根据 china_ip_route/china_ip6_route 匹配或排除中国 IP)。TUN 模式额外在 forward oifname utun 插入同规则以覆盖经 utun 转发的流量。IPv6 同样处理。规则触发仅依赖 disable_udp_quic,与 enable_udp_proxy/enable_v6_udp_proxy 无关。Mihomo 内核自身 QUIC(如 Hysteria 节点、DNS h3)不受影响——内核出站走 OUTPUT 链,不在规则范围内 lan_ac_mode (局域网访问控制模式 / LAN Access Control Mode)0 (黑名单)创建 lan_ac_black_ips/lan_ac_black_macs/lan_ac_black_ipv6s set,匹配到的 RETURN 跳过代理。DNS 劫持规则同步过滤黑名单设备 1 (白名单)创建 lan_ac_white_ips/lan_ac_white_macs/lan_ac_white_ipv6s set,不匹配 的 RETURN 跳过代理(反逻辑)。DNS 劫持规则仅对白名单设备生效 common_ports (仅允许常用端口流量 / Common Ports Proxy Mode)非0插入 th dport != @common_ports counter return — 仅代理指定端口,P2P/BT 端口被绕过。仅 redir-host 模式生效。预设常用端口: 21-23,53,80,123,143,194,443,465,587,853,993,995,998,2052-2053,2082-2083,2086,2095-2096,2197,5222-5223,5228-5230,8080,8443,8880,8888-8889 router_self_proxy (路由本机代理 / Router-Self Proxy)1创建 OUTPUT 链 (openclash_output + openclash_mangle_output),路由器自身流量被重定向/标记。非 TUN 模式额外对 Fake-IP 模式始终创建 OUTPUT 链(即使用户关闭 router_self_proxy) 0删除 OUTPUT 链,路由器自身流量走原始路由 intranet_allowed (仅允许内网 / Only Intranet Allowed)1IPv4: 创建 openclash_wan_input 链,REJECT 来自 WAN 口对全部服务端口的访问。IPv6: 创建 openclash_wan6_input 链。服务端口: $proxy_port(7892)、$tproxy_port(7895)、$cn_port(9090)、$http_port(7890)、$socks_port(7891)、$mixed_port(7893)、$dns_port(7874) bypass_gateway_compatible (旁路网关(旁路由)兼容 / Bypass Gateway Compatible)1IPv4: 创建 openclash_post 链 (srcnat jump),对已标记流量执行 MASQUERADE SNAT。规则: skgid return → mark accept → localnetwork return → ct reply return → fib saddr 非 local masquerade。IPv6: 对应创建 openclash_post_v6 链 skip_proxy_address (绕过服务器地址 / Skip Proxy Address)1看门狗定时调用 skip_proxies_address() 通过内核 API 解析代理节点 server 地址并加入 localnetwork nft set,复用链首 RETURN 规则跳过代理,防止代理嵌套 enable_redirect_dns (本地 DNS 劫持 / Redirect Local DNS Setting)1IPv4+IPv6 在 dstnat 插入 DNS 53 端口 REDIRECT 规则到 dnsmasq 端口。AC 黑白名单设备过滤。router_self_proxy=1 时添加 OUTPUT DNS 劫持 2创建 openclash_dns_redirect 链,IPv4+IPv6 DNS 流量直接 DNAT 到 dns_port(7874)。同样支持 AC 过滤和 OUTPUT 劫持 local_network_pass (本地 IPv4 绕过地址 / Local IPv4 Network Bypassed List)已配置 创建 localnetwork nft set (默认: 0.0.0.0/8, 127.0.0.0/8, 10.0.0.0/8, 169.254.0.0/16, 192.168.0.0/16, 224.0.0.0/4, 240.0.0.0/4, 172.16.0.0/12, 100.64.0.0/10),在所有链规则首位匹配 RETURN。自定义文件可覆盖默认值。WAN 接口 IP 自动加入 chnroute_pass (绕过指定区域 IPv4 黑名单 / Chnroute Bypassed List)已配置 创建 china_ip_route_pass nft set / ipset,配合 dnsmasq 将指定域名解析的 IP 加入 set。防火墙规则中作为 china_ip_route 的排除条件(确保这些 IP 不被绕行规则跳过)。仅在 enable_redirect_dns != 2 时生效(依赖 dnsmasq) UPNP 流量排除 (无 UCI 选项,自动检测 /etc/config/upnpd 租约文件)系统已安装 upnpd 创建 openclash_upnp 链,upnp_exclude() 遍历 upnpd 租约文件,按 saddr + sport + protocol 三元组为每个映射添加 RETURN 规则。看门狗自动同步变更 ipv6_enable (IPv6 流量代理 / Proxy IPv6 Traffic)1创建完整 IPv6 防火墙链:openclash_v6(TCP REDIRECT, ipv6_mode=1/3)、openclash_mangle_v6(UDP TPROXY/TUN fwmark)、openclash_output_v6/openclash_mangle_output_v6(路由自身)、openclash_post_v6(旁路由 SNAT)、openclash_wan6_input(仅内网防护) local_network6_pass (本地 IPv6 绕过地址 / Local IPv6 Network Bypassed List)已配置 创建 IPv6 localnetwork6 nft set (默认包含 ::/128, ::1/128, fe80::/10, ff00::/8 等),IPv6 链中匹配本地 IPv6 段 RETURN。WAN IPv6 接口地址自动加入 ICMP/Ping 处理 (无 UCI 选项,由运行模式决定)Redir-Host / Fake-IP(非 TUN) ICMP echo-request 仅标记 fwmark 0x162 后 accept,不被代理 (只有 TCP/UDP 被重定向到内核);Fake-IP 非 TUN 模式下对 198.18.0.0/16 的 ping 被防火墙 REJECT(INPUT/FORWARD/OUTPUT 三链阻断,OUTPUT 排除 skgid≠65534) TUN 模式 / Mix 模式 ICMP 标记 fwmark 后经策略路由进入 TUN 虚拟网卡,由 TUN 内核处理(真实 IP → DIRECT 直连延迟,Fake-IP → 伪造回复 ~0ms);可通过 Mihomo 的 disable-icmp-forwarding 禁用 firewall_lan_ac_traffic (高级流量控制 / Advanced Traffic Control)已配置 (UCI section) 通过 lan_ac_traffic UCI sections 按设备/协议/端口/DSCP 精确控制,每条规则插入到对应链的最前面 (position 0),优先级高于所有其他规则。支持 return(跳过代理)/accept(放行)/drop。详见上文 F 节
四、Dnsmasq 修改详解 (change_dnsmasq / revert_dnsmasq) 修改流程 (change_dnsmasq(), 仅在 enable_redirect_dns=1 时执行):
save_dnsmasq_server() → uci add_list openclash.config.dnsmasq_server="<原始server>"
uci set openclash.config.dnsmasq_noresolv="$(uci get dhcp.@dnsmasq[0].noresolv) "
uci set openclash.config.dnsmasq_resolvfile="$(uci get dhcp.@dnsmasq[0].resolvfile) "
uci set openclash.config.dnsmasq_cachesize="$(uci get dhcp.@dnsmasq[0].cachesize) "
uci del dhcp.@dnsmasq[-1].server
uci add_list dhcp.@dnsmasq[0].server="127.0.0.1#$dns_port "
uci delete dhcp.@dnsmasq[0].resolvfile
uci set dhcp.@dnsmasq[0].noresolv=1
uci set dhcp.@dnsmasq[0].localuse=1
uci set dhcp.@dnsmasq[0].cachesize=0
uci set dhcp.@dnsmasq[0].filter_aaaa=0
load_ip_route_pass()
/usr/share/openclash/openclash_custom_domain_dns.sh
/etc/init.d/dnsmasq restart
uci del dhcp.@dnsmasq[-1].server
for server in $(uci get openclash.config.dnsmasq_server); do
uci add_list dhcp.@dnsmasq[0].server="$server "
done
uci set dhcp.@dnsmasq[0].noresolv="$saved_noresolv "
uci set dhcp.@dnsmasq[0].resolvfile="$saved_resolvfile "
uci set dhcp.@dnsmasq[0].cachesize="$saved_cachesize "
if nslookup www.apple.com 127.0.0.1:<dnsmasq_port> 失败; then
fi
chnroute_pass 的 dnsmasq 集成 :
创建 china_ip_route_pass ipset/nftset
将 chnroute_pass 域名加入 set: ipset=/domain.com/china_ip_route_pass 或 nftset=/domain.com/4#inet#fw4#china_ip_route_pass
效果: DNS 解析这些域名时加入 set 便于在匹配时绕过(而非被 chnroute 影响)
日志与错误信息速查
AI 行为指引 : 当用户提供日志报错信息时,AI 应首先在以下表格中查找匹配的错误关键字,
根据「原因」列判断问题根源,然后按「排查方法」列指导用户在 LuCI 中操作。
若表中未覆盖该错误 ,应主动搜索 OpenClash GitHub Issues 查找是否存在相同或相似的问题,
优先参考高赞反应的社区回复和作者(vernesong)给出的解决方案。搜索时可使用错误关键字作为搜索词。
两类日志说明 :
插件日志 (前九类):由 OpenClash 的 Shell/Ruby/Lua 脚本产生,含 [Info]/[Tip]/[Warning]/[Error] 前缀,写入 /tmp/openclash.log。可在 LuCI「运行日志」页面查看。
内核日志 (第十、十一类):由 Mihomo 核心(Go 程序)产生,含 level=debug/info/warning/error/fatal 标记,同样写入 /tmp/openclash.log。level=fatal 会导致核心进程退出。可在 LuCI「运行日志」页面查看,或在「运行状态」页面看到 OpenClash Start Failed 提示。
一、内核启动与运行错误 错误关键字 问题位置 原因 排查方法 Ruby Works Abnormally, Please Check The Ruby Library Depends! (Ruby 依赖异常)「运行状态」启动流程 ruby 或 ruby-yaml 包未安装/损坏「系统→软件包」安装 ruby、ruby-yaml、ruby-psych Unable To Parse Config File (配置文件校验失败)「运行状态」启动流程 YAML 配置文件语法错误或 age 解密失败 「配置管理」页面点击 Edit 检查 YAML 语法 Core Start Failed, Please Check The Log Infos! (内核启动失败)「运行状态」启动流程 核心进程未能启动 「运行状态」查看核心版本是否正确;「运行日志」生成调试日志 Core Initial Configuration Timeout (内核初始化超时)「运行状态」启动流程 核心 API 在 300 秒内未就绪 检查 /tmp/openclash.log 中核心日志;确认「覆写设置→常规」的 cn_port 未被占用 TUN Interface Start Failed (TUN 接口启动失败)「运行状态」启动流程 TUN 虚拟网卡创建失败 「系统→软件包」确认 kmod-tun 已安装 【{module}】module not found (内核模块未找到)「运行状态」启动流程 内核模块未安装/未加载(tun/tproxy 等) 「系统→软件包」安装对应的 kmod 包 LAN IP Address Get Error (LAN IP 获取失败)「运行状态」启动流程 LAN 接口 IP 无效或 ip-full 包缺失(旧内核 4.4.x 常见 br-lan 网桥无 IP) 「插件设置→流量控制」选择正确的 LAN 接口名称(如 br-lan);「系统→软件包」安装 ip-full;终端 ip address show br-lan 确认存在 IPv4 地址;尝试切换运行模式为混合模式 OpenClash Now Disabled, Need Start From Luci Page (插件未启用)「运行状态」启动流程 插件被禁用(enable=0) 「运行状态」页面点击启动开关
二、订阅与配置更新错误 错误关键字 问题位置 原因 排查方法 Config File Subscribed Failed (订阅配置下载失败)「配置订阅」更新流程 订阅 URL 下载失败(curl 错误) 「配置订阅」检查订阅 URL 是否正确;确认网络连通性 Config File Tested Faild (配置文件测试失败)「配置订阅」更新流程 下载的 YAML 未通过 clash -t 验证 「配置管理」页面 Edit 检查 YAML 语法;查看 /tmp/openclash.log Updated Config Has No Proxy Field (配置无节点字段)「配置订阅」更新流程 订阅配置中无 proxies 和 proxy-providers 字段 检查订阅源是否有效;可能订阅已过期 Filter Proxies Failed (节点筛选失败)「配置订阅」更新流程 节点关键字过滤正则异常 「配置订阅」检查 keyword/ex_keyword 格式 Ruby Works Abnormally (Ruby 异常)「配置订阅」更新流程 Ruby 环境异常导致订阅处理失败 「系统→软件包」重装 ruby、ruby-yaml Config File Format Validation Failed (配置文件格式校验失败)「运行状态」启动流程 YAML 解析后文件为空/丢失 「配置管理」检查配置目录权限和磁盘空间
三、GEO 与规则更新错误 错误关键字 问题位置 原因 排查方法 Download Failed: HTML Response Detected (下载失败:检测到 HTML 响应)「插件设置→GEO 数据库订阅」 CDN 返回的是 HTML 错误页而非 GEO 文件 「覆写设置→常规」检查 Github 地址修改 CDN 选项 Download Failed: File Size Too Small (下载失败:文件过小)「插件设置→GEO 数据库订阅」 下载文件 <1KB,内容不完整 「插件设置→GEO 数据库订阅」检查 GEO 自定义 URL 是否正确 Update Error, Please Try Again Later (更新失败,请稍后再试)「插件设置→GEO 数据库订阅」 网络下载失败 「运行状态」检查网络连通性;若使用代理下载,添加直连规则 Control Panel Unzip Error! (控制面板解压失败)「运行状态」仪表盘切换 Dashboard 压缩包解压失败 「系统→软件包」确认 unzip 已安装 LightGBM Model Update Error (LGBM 模型更新失败)「覆写设置→智能设置」 LGBM 模型下载失败 「覆写设置→智能设置」检查模型 URL
四、内核与插件版本更新错误 错误关键字 问题位置 原因 排查方法 Core Version Check Error (内核版本检测失败)「版本更新」 GitHub 不可达,无法获取最新版本信息 「运行状态」检查网络连通性;如在大陆,设置 CDN Core Update Failed (内核更新失败,重试 3 次后)「版本更新」 核心下载/解压/替换失败 「版本更新」确认闪存空间和 CPU 架构选择;「系统 → 软件包」检查磁盘空间 No Compiled Version Selected (未选择编译版本)「版本更新」 CPU 架构未选择(core_version=0) 「版本更新」标签页选择对应的 CPU 架构 Pre update test failed (更新前测试失败,3 次后)「版本更新」 插件 IPK/APK 安装测试失败 手动在「系统→软件包」中更新或重装 luci-app-openclash OpenClash update failed (OpenClash 更新失败)「版本更新」 插件安装彻底失败 包已保存在 /tmp/,手动使用 opkg install 或 apk add 安装 Failed to get version information (获取版本信息失败)「版本更新」 GitHub 版本检查失败 检查网络;「覆写设置→常规」设置 CDN
五、防火墙与 DNS 错误 错误关键字 问题位置 原因 排查方法 Dnsmasq not Support nftset, Use ipset (Dnsmasq 不支持 nftset)「运行状态」启动流程 dnsmasq-full 未编译 nftset 支持 警告,非致命;如 chnroute 旁路异常则重装 dnsmasq-full iptables DSCP module not available (iptables DSCP 模块不可用)「运行状态」启动流程 iptables 缺少 DSCP 模块 警告,DSCP 规则被跳过;或改用核心侧 DSCP Can't Setting Only Intranet Allowed Function (无法设置仅允许内网)「运行状态」启动流程 无法识别 WAN 接口 「插件设置→流量控制」检查 WAN 接口名称设置 Nameserver Option Must Be Setted, Stop Customing DNS Servers (Nameserver 未设置)「覆写设置→DNS」 自定义 DNS 启用但未配置任何 nameserver 「覆写设置→DNS」添加至少一个 DNS 服务器 Fallback-Filter Need fallback of DNS Been Setted (Fallback-Filter 需要 Fallback DNS)「覆写设置→DNS」 fallback-filter 需要先配置 fallback DNS 「覆写设置→DNS」先添加 fallback 分组的 DNS 服务器 DNS Loop Check (DNS 回环检查)「覆写设置→DNS」 DNS 配置存在回环风险 「覆写设置→DNS」检查服务器列表,避免将 Clash DNS 端口设为其上游
六、覆写模块错误 错误关键字 问题位置 原因 排查方法 skip General key not allowed (覆写 key 不允许)「覆写设置」覆写模块 覆写 [General] 中的 key 不在允许列表中 检查 key 拼写;参考覆写模块 8.2.1 节的允许 key 列表 skip invalid Overwrite command (无效覆写命令)「覆写设置」覆写模块 [Overwrite] 段命令不以 ruby_ 开头 修正命令语法,使用 ruby_method_name 格式 Invalid YAML Override format (无效 YAML 覆写格式)「覆写设置」覆写模块 [YAML] 段不是有效的 Hash 结构 检查 YAML 缩进和格式 Parse YAML Override failed (YAML 覆写解析失败)「覆写设置」覆写模块 [YAML] 段 Ruby 解析异常 逐行检查 YAML 语法 Config File Overwrite Failed (配置文件覆写失败)「覆写设置」覆写模块 覆写应用整体失败 检查所有覆写设置的语法 DOWNLOAD FILE failed (文件下载失败)「覆写设置」覆写模块 覆写模块 DOWNLOAD_FILE 下载失败 检查下载 URL 和网络连通性
七、流媒体解锁错误 错误关键字 问题位置 原因 排查方法 Streaming Unlock Could not Work Because of Router-Self Proxy Disabled (流媒体解锁失效:本机代理关闭)「运行状态」看门狗 路由器自代理关闭导致流媒体解锁无法工作 「插件设置→流量控制」开启本机代理 Something Wrong While Testing (流媒体测试失败)「插件设置→流媒体增强」 流媒体测试脚本执行失败 「运行状态」确认核心运行中;「插件设置→流媒体增强」检查策略组配置
八、LuCI Web 界面错误 错误提示 问题位置 原因 排查方法 Switch Faild (切换失败)「运行状态」快捷设置 API 不可达或核心未运行 「运行状态」确认核心状态;刷新页面后重试 Config file does not exist (配置文件不存在)「配置管理」 配置文件路径无效 「配置管理」检查文件名;确认文件存在于配置列表中 File size exceeds 10MB limit (文件超过 10MB 限制)「配置管理」上传 上传文件超过 10MB 减小文件或拆分上传 Cannot delete the last remaining dashboard (无法删除最后一个仪表盘)「运行状态」仪表盘切换 只剩一个仪表盘时不允许删除 「运行状态」先下载新的仪表盘再删除旧的 Failed to generate age key (生成 Age 密钥失败)「配置订阅」Age 密钥 核心不支持 age keygen 「版本更新」检查核心版本;手动生成 age 密钥 Failed to calculate public key (计算公钥失败)「配置订阅」Age 密钥 密钥格式无效 验证 age 密钥格式(应以 AGE-SECRET-KEY- 开头) Bad address specified! (地址无效)「运行状态」连接诊断 输入地址为空或无效 输入有效的主机名或 IP 地址 OpenClash Start Failed: {msg} (OpenClash 启动失败)「运行状态」 核心日志中出现 fatal/error 级别日志 查看完整错误消息;「运行日志」生成调试日志 Access Denied (无法访问) / Access Timed Out (连接超时)「运行状态」IP 检测 网络连接问题 检查路由器网络连接
九、YAML 配置处理错误 错误关键字 问题位置 原因 排查方法 Load File Failed (加载文件失败)「配置管理」配置加载 Ruby 无法加载配置文件 确认配置文件存在且权限正确 Set Custom DNS Failed (自定义 DNS 设置失败)「覆写设置→DNS」 DNS 覆写处理失败 检查「覆写设置→DNS」中的 DNS 服务器配置 Set Fake-IP-Filter Failed (Fake-IP-Filter 设置失败)「覆写设置→DNS」 Fake-IP 过滤器配置异常 「覆写设置→DNS」检查 Fake-IP-Filter 文件和模式 Set Hosts Rules Failed (Hosts 规则设置失败)「覆写设置→DNS」 自定义 Hosts 格式错误 「覆写设置→DNS」检查 hosts 文件每行格式 Set Custom Rules Failed (自定义规则设置失败)「覆写设置→规则」 自定义规则注入异常 「覆写设置→规则」检查规则文件语法 Skiped The Custom Rule Because Group & Proxy Not Found (规则跳过:策略组/代理不存在)「覆写设置→规则」 规则引用了不存在的策略组/代理 「覆写设置→规则」检查规则中 MATCH/Proxy/策略组名称是否存在 Set BT/P2P DIRECT Rules Failed (BT/P2P 直连规则设置失败)「覆写设置→规则」 BT 直连规则注入失败 「覆写设置→规则」关闭再重新开启「仅代理命中规则流量 (Rule Match Proxy Mode)」选项 proxy-groups Get Failed (策略组获取失败)「配置管理」策略组 配置中策略组解析异常 「配置管理」页面 Edit 检查 proxy-groups 段
十、Ruby YAML 模块错误 错误关键字 问题位置 原因 排查方法 Fix short-id values type failed (short-id 类型修复失败)「配置管理」YAML 处理 YAML 中 short-id 字段值类型修复时 Psych 解析异常 「配置管理」Edit 检查配置中 short-id 字段的值格式 YAML overwrite failed:【key: ...】 (YAML 覆写失败)「覆写设置」覆写模块 覆写模块 YAML 合并时发生异常 「覆写设置」检查 [YAML] 段的语法和操作符使用 YAML overwrite failed:【(match value) => ...】 (YAML 条件覆写匹配失败)「覆写设置」覆写模块 批量条件更新的 where 匹配逻辑异常 「覆写设置」检查 key* 操作符的 where 条件格式和正则 YAML overwrite failed:【(batch update) => ...】 (YAML 批量更新失败)「覆写设置」覆写模块 批量条件更新执行时异常 「覆写设置」检查 key* 操作符的 set 子句语法 Write file failed (写文件失败)「配置管理」YAML 写入 YAML 写入文件时 I/O 异常 检查磁盘空间和文件权限 Decrypt attempt failed (解密尝试失败)「配置订阅」Age 解密 Age 加密文件解密失败 「配置订阅」检查 age 密钥是否正确;验证加密文件完整性 Decrypted content empty or still encrypted (解密后为空或仍加密)「配置订阅」Age 解密 Age 解密后内容为空或仍为加密格式 「配置订阅」确认 age 密钥与加密时使用的密钥匹配 Encrypt attempt failed (加密尝试失败)「配置订阅」Age 加密 Age 加密写入时失败 「配置订阅」检查 age 公钥格式;验证核心年龄功能 Encrypted file: decryption failed (加密文件解密失败)「配置订阅」Age 解密 所有 age 密钥尝试均解密失败 「配置订阅」检查所有订阅的 age 密钥;可能密钥不匹配
十一、Mihomo 内核配置解析错误(level=fatal / level=error)
以下为 Mihomo 内核在加载/解析 YAML 配置文件 时产生的错误。level=fatal 会导致核心进程退出。
日志查看:LuCI「运行日志」页面或「运行状态」页面(若启动失败会显示 OpenClash Start Failed)。
Parse config error 的具体子类型及修复方法:
错误详情 配置段 修复方法 proxy <N>: missing typeproxies在「配置管理」Edit 中给第 N 个代理节点添加 type: 字段(如 ss, vmess, trojan 等) proxy <N>: unsupport proxy type: <type>proxies代理类型名称拼写错误或不支持,检查 type: 值是否在 Mihomo 支持列表中 proxy <name> is the duplicate nameproxies两个代理节点同名,在「配置管理」Edit 中修改其中一个的名称 proxy group <N>: missing nameproxy-groups第 N 个策略组缺少 name: 字段,Edit 中补充 <groupName>: unsupported typeproxy-groups策略组 type: 值无效,改为 select, url-test, fallback, load-balance 或 smart loop is detected in ProxyGroupproxy-groups策略组之间存在循环引用(A 引用 B,B 又引用 A),打破循环链 <groupName>: use or proxies missingproxy-groups策略组没有配置 proxies: 或 use:,至少添加一个 '<name>' not foundproxy-groups策略组引用了不存在的代理节点或 provider 名称,检查拼写 can not defined a provider called 'default'proxy-providersprovider 使用了保留名 default,改用其他名称 unsupport vehicle type: <type>proxy-providers / rule-providersprovider 的 type: 值无效,应为 file, http 或 inline file must have a payload fieldrule-providers规则集文件缺少 payload: 字段,检查文件内容格式 rules[<N>] [<line>] error: format invalidrules第 N 条规则格式错误,检查规则语法:TYPE,payload,target,no-resolve rules[<N>] [<line>] error: proxy [<name>] not foundrules规则目标引用了不存在的策略组/代理名称 rules[<N>] [<line>] error: rule set [<name>] not foundrules规则使用了 RULE-SET,<name> 但未在 rule-providers 中定义该名称 sub-rule error: circular referencessub-rules子规则之间形成循环引用链,打破循环 decrypt config error全局 Age 加密的配置文件解密失败,在「配置订阅」中检查 age 密钥 configuration file ... is empty全局 配置文件为空,在「配置管理」中检查配置是否正常下载 [Smart] Invalid policy-priority rule: must be in 'pattern:factor' formatsmart 策略组「覆写设置→智能设置」中 smart_policy_priority 格式错误,改为 名称:系数 DNS [addr] config with invalid ecsdnsDNS 服务器的 ECS 配置格式无效,「覆写设置→DNS」检查 DNS 服务器设置 [Smart] Model.bin invalid, remove and downloadSmart 模型 「覆写设置→智能设置」点击手动更新模型按钮重新下载 [CacheFile] remove invalid cache file error运行缓存 「运行状态」停止 OpenClash,手动删除 /etc/openclash/cache.db 后重启
通用排查 : 在「配置管理」页面点击 Download Run 下载经脚本处理后的运行时配置,对比原始订阅检查 yml_change.sh 和覆写模块生成的 YAML 是否正确。
十二、DNS 泄露排查
核心验证方法 :在客户端执行 nslookup www.google.com,应返回:① DNS 服务器为 OpenWrt 路由器 IP;② 解析结果为 Fake-IP 范围地址(198.18.x.x)。若返回真实 IP 或上游 DNS 非路由器,说明 DNS 解析链路异常。正确链路应为:设备 → Dnsmasq(53端口) → OpenClash(7874端口)。
错误关键字 问题位置 原因 排查方法 来源 DNS 泄露(ipleak / ipleak.net 检测到国内 DNS) 「覆写设置→DNS」 Redir-Host/Fake-IP 下 nameserver 和 fallback 并发请求,国内 DNS 结果可能被优先采纳 ① Meta 内核建议放弃 fallback ,仅用 nameserver-policy 做 DNS 分流(国内域名→国内 DNS,国外域名→国外 DNS);② 境外 DNS 地址后加 #PROXY 强制走代理(如 https://1.1.1.1/dns-query#PROXY);③ 删除原配置 YAML 的 dns: 段,仅通过「覆写设置→DNS」管理 DNS 配置避免冲突;④ 将 proxy-server-nameserver 设为国内 DNS 避免代理节点域名解析走境外 #3843 nameserver-policy 未生效,DNS 仍走 nameserver「覆写设置→DNS」 OpenClash 的「覆写设置→DNS」选项会与订阅配置的 dns: 段合并,可能导致预期外的 DNS 行为 ① 在「覆写设置→DNS」启用「自定义 DNS 设置 (Custom DNS Setting)」后重新配置所有 DNS 规则;② 在「运行日志」中开启 Debug 等级观察实际 DNS 查询路径;③ 确认 default-nameserver 组的 DNS 服务器开启了「节点域名解析」选项 同上 DNS 泄露(开启 IPv6 后出现) 「覆写设置→DNS」+「IPv6 设置」 运营商下发的 IPv6 DNS 绕过了 OpenClash 的 DNS 劫持,直接响应客户端请求("抢答") ① 在 LuCI 的「网络→DHCP/DNS→高级设置」中取消 过滤 IPv6 AAAA 记录;② 在 LAN 接口 DHCP 服务器 IPv6 设置中取消「本地 IPv6 DNS 服务器」 ,强制设备使用路由器 IPv4 地址进行 DNS 解析;③ DHCPv6 服务设为已禁用,RA 设为服务器模式。原理:DNS 请求走 IPv4 通道,流量走 IPv6 通道——IPv4 DNS 同样可以查询 AAAA 记录返回 IPv6 地址 — 旁路由环境下 DNS 泄露 「运行状态」 旁路由设备未正确指定上游 DNS 为 OpenWrt IP(尤其是 IPv6 DNS 留空) ① 旁路由设备必须手动指定 IPv4 DNS 为 OpenWrt 路由器 IP ;② IPv6 DNS 必须留空 ;③ 若使用 DHCP 分配,确保 DHCP 服务器不下发 IPv6 DNS 地址 —
十三、版本更新与下载失败 错误关键字 问题位置 原因 排查方法 来源 /tmp/openclash_last_version 下载失败「运行日志」/ 启动流程 ① curl SSL 证书验证失败(BADCERT_CN_MISMATCH / self signed certificate);② GitHub Raw 域名被 DNS 污染或不可达;③ curl 超时(Operation timed out);④ 缺少 libmbedtls 库 ①「覆写设置→常规」设置 Github 地址修改 (github_address_mod) 为 CDN(推荐 https://fastly.jsdelivr.net/ 或 https://testingcf.jsdelivr.net/);②「系统→软件包」确认 ca-bundle 已安装;③ Fake-IP 模式在「覆写设置→DNS」的 fake-ip-filter 中排除 raw.githubusercontent.com;④ 修改 /usr/share/openclash/openclash_core.sh 中 curl 的超时参数 -m 60 改为 -m 300;⑤ 终端执行 opkg install libmbedtls 修复 curl 库依赖 #2791 更新内核 (Update Core) 点击后重启失败「运行状态」页面 v0.47.052 重启流程中 stop→start 间隔不足,旧核心进程未完全退出即启动新核心,触发「内核启动失败」 ① 更新到 v0.47.054+(已在 Developer 分支修复);② 临时解决:编辑 /etc/init.d/openclash,在 restart 函数的 stop 和 start 之间加 sleep 5;③ 如更新后仍失败,检查内存是否不足(小型设备建议增加 swap) #4969 升级后依赖检查异常,无法启动 「运行日志」启动流程 更新后 check_mod() 或依赖检测逻辑误报 ①「运行日志」生成调试日志检查依赖段;②「系统→软件包」确认 kmod-nft-tproxy/kmod-ipt-tproxy 已安装;③ 切换 Dev 分支获取最新修复;④ 重装 luci-app-openclash #4807 v0.47.052/055 无法开机自启 「运行状态」启动流程 启动时序竞争条件,procd respawn 在某些固件上触发过快 ① 更新到最新 Dev 版本;②「插件设置→模式设置」设置 delay_start (启动延迟) 30-60 秒;③ 确保路由器有足够内存供启动时使用 #4973
十四、功能异常类 错误关键字 问题位置 原因 排查方法 来源 向日葵/AnyDesk 等远程软件无法连接 局域网客户端 远程软件域名/QUIC 流量被代理或阻断 ①「覆写设置→规则」添加直连规则:DOMAIN-SUFFIX,oray.com,DIRECT、DOMAIN-SUFFIX,sunlogin.net,DIRECT 等;② 确认 sniffer skip-domain 已包含 oray.com 和 sunlogin.net(默认已含);③ 尝试关闭「插件设置→流量控制」的 disable_udp_quic (禁用 QUIC) #3229 小米摄像机/智能家居外网无法访问 局域网 IoT 设备 IoT 设备流量被代理导致 NAT 穿透失败 ①「插件设置→黑白名单」添加摄像机 IP 到「不走代理的局域网设备 IP (LAN Bypassed Host List)」列表;② 确认 sniffer skip-domain 包含 Mijia Cloud(默认已含);③「覆写设置→规则」添加 IoT 域名直连规则:DOMAIN-SUFFIX,xiaomi.com,DIRECT #2431 绕过中国大陆IP (China IP Route) 功能突然失效 升级后 / 「运行状态」 版本升级后 china_ip_route 的 nftables/ipset 重建失败或 chnroute 列表未更新 ①「插件设置→大陆白名单订阅」手动更新一次大陆 IP 列表;②「运行状态」页面 Area Bypass 先切到关闭再切回「绕过中国大陆 (Bypass Mainland China)」重新触发;③ 终端执行 `nft list set inet fw4 china_ip_route head` 检查 nft set 是否存在且非空 自定义防火墙规则(开发者选项)不生效 「插件设置→开发者设置」 编辑后未重启或脚本语法错误 ① 修改 openclash_custom_firewall_rules.sh 后需重启 OpenClash (不是重载防火墙);② 用 bash -n 检查脚本语法;③「运行日志」生成调试日志检查是否成功执行(日志中含自定义脚本内容) #4005 DDNS 服务(如 DDNS-GO)工作异常 路由器 DDNS 插件 DDNS 服务商 API 域名被错误分配 Fake-IP,导致 IP 检测失败 ① 将 DDNS 服务商的 API 域名加入「覆写设置→DNS」的 Fake-IP-Filter 中(填入域名使其返回真实 IP);② 常见需排除的域名如 ddns.oray.com、api.cloudflare.com 等,具体根据所用服务商填写 — Cloudflare Tunnel (Cloudflared) 连接不稳定 路由器/内网设备 Cloudflared 默认使用 QUIC 连接,而海外 QUIC 流量默认被 OpenClash 阻断 ① 规则中已指定 Cloudflare Tunnel 相关域名直连;② 在 Cloudflared 启动参数中显式指定 --protocol http2 强制使用 HTTP/2(Docker 版:command: [tunnel, --no-autoupdate, --protocol, http2, run, --token, ${CF_TOKEN}]) — BT/PT 下载流量进入内核 下载设备 下载设备流量未正确分流 ① 若下载设备为独立设备(如 NAS),在「覆写设置→规则→自定义规则」中添加 SRC-IP-CIDR,192.168.1.x/32,DIRECT;② 若同时启用了 IPv6,还需添加 IPv6 后缀规则 SRC-IP-SUFFIX,::a1b2:c3d4,DIRECT(后缀由 EUI-64 生成,可在设备上查看);③ 非独立设备可设置「非标端口」策略组直连来规避 80/443 以外的下载流量 — 直连网站/APP/小程序打不开 局域网客户端 小众域名未被 geosite:cn 收录,被误判为非直连走代理 ① 临时方案:将「漏网之鱼」策略组设为直连;② 永久方案:在「覆写设置→规则→自定义规则」中为对应域名添加 DOMAIN-SUFFIX,xxx.com,DIRECT 规则;③ 观察 zashboard 中命中策略组确认分流是否正确 — 开启 IPv6 后某些直连访问卡顿 局域网客户端 IPv6 DNS 抢答或运营商 IPv6 DNS 不稳定导致解析异常 ① 禁用「覆写设置→DNS」的「追加上游 DNS」,改为在 NameServer 中手动添加 DoH 服务器(如 AliDNS);② 确保 LAN 口未下发 IPv6 DNS 地址 — 非直连站点打不开且内核日志无记录 「运行状态」 WAN 接口名称填写错误或 DNS 重定向未关闭 ①「插件设置→流量控制」清空 WAN 接口名称;② 确认「网络→DHCP/DNS」中 DNS 重定向功能已关闭;③ 两者均正确时,检查 OpenWrt 中是否有其他劫持 53 端口或修改 Dnsmasq 的插件 — Hysteria / Hysteria2 / TUIC 节点连接失败、断流、握手超时 内核日志 level=error ① Linux 内核 ≥6.6 的 quic-go GSO 兼容性问题(最常见);② Hysteria 协议对 server/auth/tls/password 字段配置敏感 ① 优先尝试 :「插件设置→模式设置」开启**「禁用 quic-go GSO (Disable QUIC Go GSO)」**后重启 OpenClash;② 确认 YAML 中 type: hysteria 或 type: hysteria2 拼写正确、端口号正确;③ 检查节点的 auth/password 及 TLS 证书配置是否完整 — 开启「绕过中国大陆 IP」后 Google Play 商店无法下载/更新 客户端(Android 设备) services.googleapis.cn 等 Google 域名被国内 DNS 解析到中国大陆 IP(220.181.x.x),被 china_ip_route 规则匹配后走直连;但 Google 中国服务器禁止境外 IP(代理节点)访问,导致死循环从 DNS 和规则两方面同时入手 :① DNS 层面 — 在「覆写设置→DNS→自定义 DNS 设置」中配置 nameserver-policy 强制 Google 域名走境外 DNS 解析,写入 YAML 的 dns.nameserver-policy 段:yaml<br>dns:<br> nameserver-policy:<br> '+.services.googleapis.cn': 'https://dns.google/dns-query'<br> '+.googleapis.cn': 'https://dns.google/dns-query'<br> '+.xn--ngstr-lra8j.com': 'https://dns.google/dns-query'<br> 也可用 8.8.8.8 或 1.1.1.1 替代 https://dns.google/dns-query。效果:域名解析到 Google 境外 IP(如 142.250.x.x),而非国内 220.181.x.x。② 规则层面 — 在「覆写设置→规则→自定义规则」中添加,写入 YAML 的 rules 段:yaml<br>rules:<br> - DOMAIN-SUFFIX,services.googleapis.cn,Proxy<br> - DOMAIN-SUFFIX,googleapis.cn,Proxy<br> - DOMAIN-SUFFIX,xn--ngstr-lra8j.com,Proxy<br> 其中 Proxy 替换为你的代理策略组名。更彻底的方式:GEOSITE,google,Proxy 将全部 Google 流量走代理。验证 :终端执行 dig services.googleapis.cn @127.0.0.1 -p 7874 应返回境外 IP;在 zashboard 连接日志中确认域名命中代理规则。#5074
十五、运行时状态异常 错误关键字 问题位置 原因 排查方法 来源 节点正常,突然无法访问外网 「运行状态」一切正常但客户端无网络 DNS 劫持失效(dnsmasq 被其他插件修改)、防火墙规则乱序、TUN 路由表丢失 ①「运行状态」确认核心和 DNS 端口正常;② 在「运行日志」中检查最近的错误;③「运行状态」点击「Reload Firewall (重置防火墙)」重建规则;④ 检查是否同时运行其他代理/DNS 插件(如 AdGuard Home、PassWall、SSR-Plus 等),OpenClash 不能与这些插件共存 #3516 防火墙 DNS 劫持规则不停被还原 「运行日志」反复出现防火墙重载记录 看门狗检测到规则异常后自动重载,形成循环(v0.46.001-beta 已知问题) ① 更新到最新版本(已在后续版本修复);② 临时关闭看门狗自动修复(编辑 openclash_watchdog.sh 注释掉防火墙重载部分);③ 检查是否有其他程序在修改防火墙规则(如 Docker、UPnP 服务) #3765
十六、旁路由 / 特定设备异常 错误关键字 问题位置 原因 排查方法 来源 旁路由 R2S 等 ARM 设备 iPhone 待机耗电严重 局域网 代理模式下 ARP 代理或 TUN 模式的 keepalive 导致 iPhone 频繁被唤醒 ① 尝试切换为 Fake-IP 模式;② 关闭「仅允许内网 (Only Intranet Allowed)」以外的 WAN 口访问;③ 主路由 DHCP 下发的网关和 DNS 指向旁路由 IP #2614 在 Fake-IP 模式下无法使用 UU 加速器等游戏加速软件 「运行状态」 游戏加速器需要真实 DNS 解析来优化连接,Fake-IP 返回虚拟 IP 导致失效 ① 在「覆写设置→DNS」的 fake-ip-filter 中添加加速器相关域名(如 +.leigod.com、+.vivox.com);② 将加速器所在设备的 IP 加入「不走代理的局域网设备 IP (LAN Bypassed Host List)」 #1751
第一部分:运行状态页面 (Overviews / client)
LuCI 路径: 服务 → OpenClash → 运行状态
数据来源: 前端 JS 同时请求多个后端端点:/status (运行状态、仪表盘设置)、/toolbar_show (流量统计)、/update (本机配置与已装版本)、/last_version (远程最新版本)、/oc_settings (快捷设置)、/rule_mode (代理模式)、/config_file_list (配置文件列表) 等。版本信息拆分为两个端点 :/update (action_update) 返回本机配置(corever/release_branch/smart_enable 等)与已装版本(coremetacv/opcv),不含远程最新 ;远程最新版本 corelv/oplv 由独立 /last_version 端点 (action_last_version) 返回(status 页「新版本可用」红点据此显示),均非 /status 端点。/status 仅返回运行状态布尔值、仪表盘可用性和 core_type,不包含版本号。
1.1 核心控制卡片 元素 功能 后端操作 启动/停止开关 切换核心运行状态 调用 action_oc_action → /etc/init.d/openclash start/stop 重启按钮 重启核心 调用 /etc/init.d/openclash restart 覆写模块按钮 在运行状态页弹出覆写编辑器(与菜单「服务→OpenClash→覆写设置」独立) 调用 editOverwrite() → 在运行状态页弹出覆写编辑模态框 插件/核心版本 显示当前版本号 + 更新红点 已装版本: 核心执行 /etc/openclash/core/clash_meta -v 解析输出、插件读取 opkg/apk 包数据库,经 /update 端点展示; 远程最新: Lua fetch_version_history 拉取并缓存(内核 /tmp/clash_last_version / 插件 /tmp/openclash_last_version,Lua 侧另有 /tmp/openclash_version_history_<branch>.json JSON 缓存),经独立 /last_version 端点 (action_last_version) 获取并据此显示「新版本可用」红点,均非 /status 端点 主题切换 Light(太阳)/Dark(月亮)/Auto(自动) 三档切换 前端 CSS 变量 + localStorage 公告横幅 滚动显示项目公告 (24h 缓存) /announcement 端点社交链接 Wiki / Tutorials / Star / Telegram / Sponsor / Mihomo 图标 外部链接 window.open() 开发者头像 13 位贡献者头像网格 (悬停显示名称) 来自 GitHub 头像 URL
1.2 运行模式卡片 (Running Mode) 模式 UCI en_mode 值 说明 兼容 (Compat) redir-hostRedir-Host 模式,使用 iptables redirect 转发流量 TUN 模式 redir-host-tun / fake-ip-tun使用 TUN 虚拟网卡接管所有流量 混合 (Mix) redir-host-mix / fake-ip-mixTUN + Redirect 混合,TCP 走 system 栈、UDP 走 gvisor 栈
切换触发: action_switch_run_mode → 修改 UCI en_mode,若运行中则自动重启
1.3 代理模式卡片 (Proxy Mode) 模式 Mihomo mode 值 效果 策略代理 (Rule) rule按 YAML 中 rules: 规则集合分流 全局代理 (Global) global所有流量走 GLOBAL 策略组所选代理 全局直连 (Direct) direct所有流量直连,不经过任何代理
切换触发: action_switch_rule_mode → PATCH Mihomo API /configs 的 mode 字段,同时更新 UCI proxy_mode
1.4 快捷设置网格 设置项 功能 UCI 选项 触发函数 地区绕行 (Area Bypass) 切换中国 IP/海外绕行 china_ip_route (0/1/2)action_switch_oc_setting → 修改 UCI + 重启域名嗅探 (Sniffer) 是否启用 Mihomo 域名嗅探 enable_meta_snifferaction_switch_oc_setting → 动态修改运行时 YAML sniffer.enableDNS 尊重规则 (DNS Proxy) DNS 查询是否遵守路由规则 enable_respect_rulesaction_switch_oc_setting → 动态修改 YAML dns.respect-rules流媒体解锁 (Stream Unlock) 一键启用流媒体解锁 stream_auto_selectaction_switch_oc_setting → 设置 stream_auto_select=1 及 Netflix/Disney/HBO 默认参数
1.5 配置文件卡片 操作 功能 后端路由 配置文件选择器 下拉切换当前使用的 YAML 配置 action_switch_config → 更新 config_path + 自动重启切换 (Switch) 切换到选中的配置 同上 更新配置 重新下载订阅并更新 action_update_config → 调用 openclash.sh编辑 (Edit) 在线编辑 YAML 配置文件 弹出 config_edit 模态框 (基于 CodeMirror,支持原始/运行时视图切换、合并视图对比、覆写卡片栏) 编辑订阅 修改该配置的订阅参数 跳转到 config-subscribe-edit 上传 上传新的 YAML 配置文件 弹出 config_upload 模态框 (支持文件上传 + 订阅链接两个标签页) 刷新订阅按钮 手动刷新当前配置的订阅信息 /sub_info_get 端点指定 URL 按钮 设置订阅信息查询 URL /set_subinfo_url 端点订阅进度条 显示订阅流量使用情况 (已用/总量/百分比) /sub_info_get 自动轮询
1.6 控制面板卡片 显示当前 Dashboard 访问地址及 Secret 密码。对应 UCI:
cn_port — API 端口 (默认 9090),对应 Mihomo external-controller
dashboard_password — API 密钥,对应 Mihomo secret
dashboard_forward_domain / dashboard_forward_port / dashboard_forward_ssl — 公网访问设置
提供 复制 IP 和 复制密钥 按钮
1.7 混合代理卡片 显示 SOCKS5/HTTP 代理地址,可复制或生成 PAC 文件:
mixed_port (默认 7893), http_port (7890), socks_port (7891)
用户认证: authentication TypedSection 中的 username/password,对应 Mihomo authentication 配置
提供 复制代理地址 、复制认证信息 、生成 PAC 配置 按钮
1.8 仪表盘入口 (Control Panel) 4 种可选仪表盘:Dashboard (Yacd)、Yacd 、Metacubexd 、Zashboard
对应 Mihomo external-ui 配置
切换触发: action_switch_dashboard → openclash_download_dashboard.sh
默认仪表盘: UCI default_dashboard
前端访问地址 (status.htm JS 按 3 种场景构造):
本地访问 (浏览器 hostname 匹配 LAN IP):http://<lan_ip>:<cn_port>/ui/<dashboard>/
公网访问 (设置了 dashboard_forward_domain + dashboard_forward_port):http[s]://<domain>:<port>/ui/<dashboard>/(协议由 dashboard_forward_ssl 决定)
其他情况 :取当前页面协议 + lan_ip + cn_port
各仪表盘子路径:/ui/dashboard/、/ui/yacd/、/ui/metacubexd/、/ui/zashboard/
1.9 快捷操作按钮 (Quick Action) 操作 功能 后端 关闭链接 (Close Connect) 断开所有代理连接 openclash_history_get.sh 'close_all_conection'重置防火墙 (Reload Firewall) 重新应用 iptables/nftables 规则 /etc/init.d/openclash reload 'manual'清空 DNS 缓存 刷新 Fake-IP 和 DNS 缓存 POST /cache/fakeip/flush + /cache/dns/flush 检查更新 (Check Update) 同时更新插件 + 核心 + 订阅 + GEO openclash_update.sh 'one_key_update'
1.10 统计信息 页面底部显示 8 项实时统计指标,通过 WebSocket 和 XHR 轮询更新:
指标 说明 上行速率 当前上传速率 下行速率 当前下载速率 上行总量 累计上传流量 下行总量 累计下载流量 连接数 当前活动连接数 内存 核心内存占用 CPU 核心 CPU 占用 平均负载 系统平均负载
1.11 IP 检测页 (IP Address / 访问检查)
并行查询 4 个 IP 源:UpaiYun、IPIP.NET、IP.SB、IPIFY,每个显示 IP 地址 + 地理信息
隐私切换按钮(眼睛图标):点击后用 ***.***.***.*** 隐藏所有 IP 显示(状态持久化到 localStorage)
两种检测模式:路由器模式(后端 XHR 代理检测)和浏览器模式(前端 fetch 直接检测),通过模式切换图标切换
4 个网站可达性检测:Baidu Search (百度搜索)、NetEase Music (网易云音乐)、GitHub、YouTube,各显示 HTTP 状态码和加载延迟(ms)
刷新按钮:重新执行所有 IP 查询和 HTTP 检测
轮询间隔 : HTTP 检测 5-20 秒,IP 检测 15-40 秒。
1.12 oixCloud 面板 (oixCloud) 仅在设置了 oix_token 时显示,展示 oixCloud 订阅服务信息:
Logo + 标语 (随机变化)
公告横幅 (60 秒后自动消失)
计划信息 :计划类型、到期时间、账户余额、推广余额、积分
流量统计 :今日已用、计划已用、剩余流量、总流量
签到按钮 :每日签到获取流量
底部链接 :"Powered by oixcloud.com"
登录入口:在「插件设置 → oixCloud」标签页中通过 Login Account 按钮登录。
第二部分:插件设置页面 (Plugin Settings / settings)
UCI Section: openclash (anonymous section)
所有选项通过 uci set openclash.@openclash[0].<option>=<value> 设置
实现总览 UCI 写入 → init.d start_service() → get_config() 读取所有 UCI 变量
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
yml_change.sh set_firewall() change_dnsmasq()
(修改 YAML 配置) (iptables/nftables) (DNS 劫持转发)
│ │ │
▼ ▼ ▼
Mihomo 核心 系统防火墙规则 Dnsmasq → Clash DNS
脚本 输入 输出 负责的设置 yml_change.sh~48 个 UCI 参数 修改运行 YAML 端口、模式、DNS、TUN、Sniffer、认证、Meta、GEO、Smart yml_rules_change.shUCI 覆写 + 自定义规则 修改运行 YAML URL-Test 覆写、GitHub CDN、自定义规则注入、BT 直连规则 set_firewall()所有流量控制 UCI iptables/nftables 规则 透明代理、黑白名单访问控制、中国 IP 绕行、QUIC 阻断、UPNP 排除 change_dnsmasq()DNS 相关 UCI dnsmasq 配置修改 DNS 劫持转发、自定义域名 DNS、chnroute 旁路
插件强制覆盖/禁用的设置(用户不可修改)
重要 :以下设置由 yml_change.sh 在每次启动时无条件硬编码 写入 YAML,用户在 LuCI 中无法修改或关闭 。但可以通过覆写模块的 [YAML] 段和 [Overwrite] 段尝试覆盖,插件不保证覆写后的效果及工作逻辑正常。
强制设置 硬编码值 说明 allow-lantrue始终允许局域网设备使用代理端口 bind-address*始终监听所有网络接口 external-controller0.0.0.0:<cn_port>API 始终监听所有接口 (非仅 127.0.0.1) external-ui/usr/share/openclash/uiDashboard 路径不可更改 dns.listen0.0.0.0:<dns_port>DNS 始终监听所有接口 profile.store-selectedtrue始终保存策略组选择状态 sniffer.sniffHTTP:80,8080-8880 / TLS:443,8443 / QUIC:443 嗅探端口不可修改 sniffer.override-destinationtrue始终用嗅探结果覆盖连接目标 sniffer.force-domainnetflix, nflxvideo, amazonaws, media.dssott.com强制嗅探的流媒体域名 sniffer.skip-domainMijia Cloud, dlg.io.mi.com, +.oray.com, +.sunlogin.net, +.push.apple.com跳过嗅探的智能家居/推送域名 sniffer.force-dns-mappingtrue (Redir-Host 时)Redir-Host 模式下强制 DNS 映射嗅探 iptables删除 强制移除 iptables 相关配置 ebpf删除 强制移除 eBPF 相关配置 auto-redir删除 强制移除 auto-redir(由 OpenClash 防火墙管理) routing-mark6666 (非自定义标记时)固定路由标记值 external-controller-cors.allow-private-networktrue (有 CORS origin 时)允许私有网络访问 API
设置 默认值 条件 keep-alive-interval15仅当配置中未设置 keep-alive-idle600仅当配置中未设置 ntp.enabletrue仅当配置中未设置 ntp.servertime.apple.com仅当配置中未设置 ntp.port123仅当配置中未设置 ntp.interval30 (分钟)仅当配置中未设置 ntp.write-to-systemtrue仅当配置中未设置
防火墙固定值 (硬编码在 init.d/openclash 中):
常量 值 说明 PROXY_FWMARK0x162所有被代理流量的防火墙标记,不可修改 PROXY_ROUTE_TABLE0x162策略路由表 ID,不可修改 SKIP_GROUP65534绕过代理的组 ID (skgid)
运行模式 fw4 (nftables) 需要的 kmod fw3 (iptables) 需要的 kmod Redir-Host / Fake-IP (非TUN) kmod-nft-tproxykmod-ipt-tproxyTUN 模式 kmod-tun + kmod-nft-tproxykmod-tun + kmod-ipt-tproxy混合模式 (Mix) kmod-tun + kmod-nft-tproxykmod-tun + kmod-ipt-tproxy
故障排查 :如果启动日志提示 "nft_tproxy module not found",请在 LuCI 的「系统 → 软件包」中搜索安装 kmod-nft-tproxy;提示 "xt_TPROXY module not found",安装 kmod-ipt-tproxy。TUN 模式还需 kmod-tun(同样在 LuCI 软件包页面安装)。注意 fw4 环境下应检查 nft_tproxy 而非 xt_TPROXY。
2.1 模式设置标签页 (op_mode)
en_mode — 选择运行模式 (Select Mode)
UCI 选项 : openclash.@openclash[0].en_mode
可选值 :
redir-host — 兼容模式 (Redir-Host)
redir-host-tun — 兼容模式 (TUN)
redir-host-mix — 兼容模式 (混合)
fake-ip — Fake-IP 模式
fake-ip-tun — Fake-IP (TUN)
fake-ip-mix — Fake-IP (混合)
Mihomo 对应配置 : dns.enhanced-mode (fake-ip / redir-host)
Redir-Host 模式 : DNS 解析在客户端完成,核心根据 IP 规则分流。适合 BT/PT 下载
Fake-IP 模式 : DNS 解析在核心完成,返回虚假 IP (198.18.x.x),性能更高。规则基于域名匹配。推荐作为日常使用首选 :Fake-IP(增强)模式下 TCP/UDP 均走系统协议栈,性能最优;若出现 NAT 问题可切换为 Fake-IP(混合)模式;若固件含 Docker 则直接选用 Fake-IP(TUN)模式
TUN 模式 : 创建虚拟网卡,以网络层接管所有流量。对应 Mihomo tun.enable=true。需要 kmod-tun 内核模块
混合模式 : TCP 使用 system 栈 (redirect),UDP 使用 gvisor 栈 (TUN)。对应 Mihomo tun.stack=mixed。适合非直连游戏等对 NAT 类型有要求的场景
stack_type — TUN 堆栈类型 (Stack Type)
UCI 选项 : openclash.@openclash[0].stack_type
可选值 : system / gvisor / mixed
Mihomo 对应配置 : tun.stack
system : 使用 Linux 系统协议栈,性能和稳定性最好
gvisor : 用户空间网络协议栈,隔离性更好,避免内核态/用户态切换
mixed : TCP 用 system、UDP 用 gvisor
依赖 : 仅在 TUN/混合模式下显示
proxy_mode — 代理模式 (Proxy Mode)
UCI 选项 : openclash.@openclash[0].proxy_mode
可选值 : rule / global / direct
Mihomo 对应配置 : mode
默认 : rule
此选项等同一键切换全局/规则/直连模式
enable_udp_proxy — UDP 流量转发 (Proxy UDP Traffics)
UCI 选项 : openclash.@openclash[0].enable_udp_proxy
默认 : 1 (开启)
说明 : 节点需支持 UDP 转发。Docker 环境可能导致 UDP 异常
依赖 : 仅 Redir-Host 模式显示
注意 : Fake-IP 模式即使关闭此选项,域名类 UDP 连接仍会经过核心
delay_start — 延迟启动(秒) (Delay Start)
UCI 选项 : openclash.@openclash[0].delay_start
默认 : 0 (不延迟)
说明 : 开机后延迟指定秒数再启动 OpenClash
log_size — 日志大小(KB) (Log Size)
UCI 选项 : openclash.@openclash[0].log_size
默认 : 1024 (1MB)
说明 : 核心日志文件 /tmp/openclash.log 的最大大小
bypass_gateway_compatible — 旁路网关(旁路由)兼容 (Bypass Gateway Compatible)
UCI 选项 : openclash.@openclash[0].bypass_gateway_compatible
默认 : 0 (关闭)
说明 : 旁路由 (旁路网关) 模式下无法上网时尝试开启。如果设备没有 WLAN,建议禁用 LAN 接口的桥接选项
disable_quic_go_gso — 禁用 quic-go GSO (Disable QUIC Go GSO)
UCI 选项 : openclash.@openclash[0].disable_quic_go_gso
默认 : 0 (关闭)
说明 : Linux 内核 6.6 以上版本遇到 QUIC UDP 问题时尝试开启。Hysteria / Hysteria2 / TUIC 等基于 QUIC 协议的节点出现连接超时、断流、握手失败时,优先尝试开启此选项
Mihomo 对应配置 : disable-quic-go-gso (全局 experimental 选项,写入 YAML 的 experimental.disable-quic-go-gso: true)
small_flash_memory — 小闪存模式 (Small Flash Memory)
UCI 选项 : openclash.@openclash[0].small_flash_memory
默认 : 0 (关闭)
说明 : 将核心和 GEOIP 数据文件移到 /tmp/etc/openclash,节省闪存空间。路由重启后需重新下载
AI 行为指引 — QUIC 类节点(Hysteria / Hysteria2 / TUIC)故障排查 : 当用户报告 Hysteria、Hysteria2、TUIC 等基于 QUIC 协议的节点无法连接、频繁断流或握手超时时,AI 应先让用户生成调试日志查看核心日志中的 QUIC 相关错误。如日志含 quic-go / GSO / timeout 等关键字,优先建议 用户在「插件设置→模式设置」中开启「禁用 quic-go GSO (Disable QUIC Go GSO)」选项并重启 OpenClash。这是 Linux 内核 ≥6.6 上最常见的 QUIC 兼容性问题。
关于 disable_udp_quic(禁用 QUIC) :此选项不会 影响 Mihomo 内核自身的 Hysteria/Hysteria2/TUIC 等 QUIC 出站连接,无需因使用此类节点而关闭该选项。原因:所有模式(TUN/非TUN)下 QUIC REJECT 规则均在 filter INPUT 链 + IPv6 TUN 模式下额外在 FORWARD -o utun 链,Mihomo 内核自身出站 QUIC 走 OUTPUT 链,回复包的目标端口为临时端口(非 443),均不命中拦截规则。disable_udp_quic 的目的是让 LAN 客户端的 YouTube 等 QUIC 流量降级到 TCP 以便代理,与内核节点通信无关。
若 GSO 选项开启后问题仍存在,建议查阅 Mihomo Wiki Hysteria 配置 或 Hysteria2 配置 验证节点字段是否正确。
运行模式切换按钮 (switch_mode)
模板 : openclash/switch_mode
功能 : 一键在 Redir-Host 和 Fake-IP 之间切换当前页面显示
触发 : action_switch_mode → 修改 UCI operation_mode
运行模式实现详解 启动流程中的关键变量传递 (来自 init.d start_service()):
get_config() 读取 UCI en_mode,解析出 en_mode_tun(TUN 标记)、en_mode_fakeip(Fake-IP 标记)、en_mode_mix(混合标记)
将这些传递给 yml_change.sh 作为位置参数:
$1 = DNS enhanced-mode 值(fake-ip 或 redir-host)
$11 = en_mode_tun(0/1/2,决定是否启用 TUN)
$12 = stack_type 或 $30(TUN 堆栈类型回退)
yml_change.sh 中 en_mode 的 YAML 影响链 :
dns.enhanced-mode : 根据 Fake-IP / Redir-Host 设置 → 影响 Mihomo 的 DNS 解析策略:
fake-ip: 所有 DNS 查询返回 198.18.x.x 假 IP,规则基于域名匹配,性能最优
redir-host: DNS 在客户端完成,规则基于真实 IP 匹配,适合 BT/PT
tun.enable : en_mode_tun != 0 时设为 true → Mihomo 创建 utun 虚拟网卡接管流量
tun.stack : system(系统协议栈)/gvisor(用户态协议栈)/mixed(TCP system + UDP gvisor)
system: 性能最好,走 Linux 内核 TUN 驱动
gvisor: 隔离性好,UDP NAT 支持更完善
mixed: TCP 用 system 栈 (REDIRECT),UDP 用 gvisor 栈 (TUN)
防火墙层面的影响 (set_firewall()):
Redir-Host (非 TUN) : TCP 通过 REDIRECT 到 proxy_port(7892),UDP 通过 TPROXY 到 tproxy_port(7895),标记 fwmark 0x162
Fake-IP (非 TUN) : 同上 + 额外匹配 fakeip_range(198.18.0.1/16) 的路由
TUN 模式 : 所有流量标记 0x162,路由到 utun 设备(策略路由),TUN 内部处理分流
混合模式 (Mix) : TUN 设备处理 UDP(走 gvisor),TCP 走 REDIRECT(system 栈)
2.2 流量控制标签页 (traffic_control)