File: README.md
简介
OpenClash 是一个面向 OpenWrt 的 LuCI 插件,用于管理 Mihomo(原 Clash Meta)内核,兼容 Shadowsocks、ShadowsocksR、VMess、VLESS、Trojan、Snell、TUIC、Hysteria 等主流协议,通过灵活的规则配置实现按需分流与透明代理。
功能特性
| 模块 | 说明 |
|---|---|
| 内核 | 内置 Mihomo(Meta)与 Smart 智能内核,支持在线更新与切换 |
| 运行模式 | redir-host / fake-ip 与混合模式、TUN 模式,兼容 iptables 与 nftables |
| 订阅管理 | 多订阅并存,支持 Subconverter 在线转换、自定义 User-Agent 与请求头 |
| 配置管理 | 多配置文件一键切换、在线编辑、备份/恢复、Age 加密 |
| 访问控制 | 黑白名单、自定义防火墙规则 |
| 流媒体 | Netflix / Disney+ / HBO 等自动选线 |
| 覆写设置 | 模块化覆写 YAML,方便配置文件定制 |
目录
快速开始
网页安装
- 从 Release 页面 下载对应架构的安装包(
*.ipk或*.apk); - 登录 OpenWrt 的 LuCI 后台,前往 系统 → 软件包 上传并安装;
- 刷新或者重新登录页面,在 服务 → OpenClash 中导入订阅或上传配置文件并启动。
命令行安装
安装依赖并下载最新版(iptables 防火墙):
# opkg 系统(ipk)
opkg update
opkg install bash iptables dnsmasq-full curl ca-bundle ipset ip-full iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base
curl -L --retry 2 https://api.github.com/repos/vernesong/OpenClash/releases/latest -o /tmp/openclash_version
[ -f "/tmp/openclash_version" ] && download_url=$(cat /tmp/openclash_version | jsonfilter -e '@.assets[*].browser_download_url' | grep '\.ipk$') && curl -L --retry 2 "$download_url" -o /tmp/openclash.ipk || echo "OpenClash last version get failed"
[ -f "/tmp/openclash.ipk" ] && opkg install /tmp/openclash.ipk || echo "OpenClash download failed"
# apk 系统(apk)
apk update
apk add bash iptables dnsmasq-full curl ca-bundle ipset ip-full iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base
curl -L --retry 2 https://api.github.com/repos/vernesong/OpenClash/releases/latest -o /tmp/openclash_version
[ -f "/tmp/openclash_version" ] && download_url=$(cat /tmp/openclash_version | jsonfilter -e '@.assets[*].browser_download_url' | grep '\.apk$') && curl -L --retry 2 "$download_url" -o /tmp/openclash.apk || echo "OpenClash last version get failed"
[ -f "/tmp/openclash.apk" ] && apk add -q --force-overwrite --clean-protected --allow-untrusted /tmp/openclash.apk || echo "OpenClash download failed"安装依赖并下载最新版(nftables 防火墙,Firewall4):
# opkg 系统(ipk)
opkg update
opkg install bash dnsmasq-full curl ca-bundle ip-full ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base
curl -L --retry 2 https://api.github.com/repos/vernesong/OpenClash/releases/latest -o /tmp/openclash_version
[ -f "/tmp/openclash_version" ] && download_url=$(cat /tmp/openclash_version | jsonfilter -e '@.assets[*].browser_download_url' | grep '\.ipk$') && curl -L --retry 2 "$download_url" -o /tmp/openclash.ipk || echo "OpenClash last version get failed"
[ -f "/tmp/openclash.ipk" ] && opkg install /tmp/openclash.ipk || echo "OpenClash download failed"
# apk 系统(apk)
apk update
apk add bash dnsmasq-full curl ca-bundle ip-full ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base
curl -L --retry 2 https://api.github.com/repos/vernesong/OpenClash/releases/latest -o /tmp/openclash_version
[ -f "/tmp/openclash_version" ] && download_url=$(cat /tmp/openclash_version | jsonfilter -e '@.assets[*].browser_download_url' | grep '\.apk$') && curl -L --retry 2 "$download_url" -o /tmp/openclash.apk || echo "OpenClash last version get failed"
[ -f "/tmp/openclash.apk" ] && apk add -q --force-overwrite --clean-protected --allow-untrusted /tmp/openclash.apk || echo "OpenClash download failed"首次使用需要下载内核,请提前确认网络环境
使用手册
下载
最新版本请前往 Releases 页面,按需选择对应的安装包:
| 安装包 | 说明 |
|---|---|
luci-app-openclash_*.ipk |
opkg 安装包 |
luci-app-openclash-*.apk |
apk 安装包 |
历史版本请前往 全部 Releases 查看。
依赖
| 类别 | 依赖 |
|---|---|
| 基础 | luci、luci-base、luci-compat(Luci ≥ 19.07) |
| 运行时 | bash、curl、ca-bundle、ruby、ruby-yaml |
| 网络 | dnsmasq-full、ipset、ip-full、unzip |
| 防火墙(iptables) | iptables、kmod-ipt-nat、iptables-mod-tproxy、iptables-mod-extra |
| 防火墙(nftables) | kmod-nft-tproxy(Firewall4) |
| 可选 | kmod-tun(TUN 模式)、ip6tables-mod-nat(IPv6)、kmod-inet-diag(PROCESS-NAME) |
源码编译
从 OpenWrt 的 SDK 编译:
# 解压下载好的 SDK
curl -SLk --connect-timeout 30 --retry 2 "https://archive.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/OpenWrt-SDK-15.05.1-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2" -o "/tmp/SDK.tar.bz2"
cd /tmp
tar xjf SDK.tar.bz2
cd OpenWrt-SDK-15.05.1-*
# Clone 项目
mkdir package/luci-app-openclash
cd package/luci-app-openclash
git init
git remote add -f origin https://github.com/vernesong/OpenClash.git
git config core.sparsecheckout true
echo "luci-app-openclash" >> .git/info/sparse-checkout
git pull --depth 1 origin master
git branch --set-upstream-to=origin/master master
# 编译 po2lmo (如果有 po2lmo 可跳过)
pushd luci-app-openclash/tools/po2lmo
make && sudo make install
popd
# 编译最新 CodeMirror 6 (插件内置,可跳过)
pushd luci-app-openclash/tools/codemirror
npm install
npx esbuild entry.js --bundle --format=iife --global-name=CM6 --minify --target=es2019 --outfile=../../root/www/luci-static/resources/openclash/js/cm6.min.js --legal-comments=none --loader:.css=text
npx esbuild entry-md-render.js --bundle --format=iife --global-name=OCMarkdown --minify --target=es2019 --outfile=../../root/www/luci-static/resources/openclash/js/md-render.min.js --legal-comments=none --loader:.css=text
npx esbuild entry-lint-worker.js --bundle --format=iife --minify --target=es2019 --outfile=../../root/www/luci-static/resources/openclash/js/lint-worker.min.js --legal-comments=none
rm -rf node_modules
popd
# 开始编译
# 先回退到 SDK 主目录
cd ../..
make package/luci-app-openclash/luci-app-openclash/compile V=99
# IPK 文件位置
./bin/ar71xx/packages/base/luci-app-openclash_*-beta_all.ipk# 同步源码
cd package/luci-app-openclash/luci-app-openclash
git pull
# 您也可以直接拷贝 `luci-app-openclash` 文件夹至其他 `OpenWrt` 项目的 `Package` 目录下随固件编译
make menuconfig
# 选择要编译的包 LuCI -> Applications -> luci-app-openclash致谢
OpenClash 的构建离不开以下开源项目与数据服务:
| 类别 | 项目 | 作者 / 组织 | 说明 |
|---|---|---|---|
| 内核 | Mihomo | MetaCubeX | 代理内核(Clash Meta) |
| 代码基础 | Luci For Clash | frainzy1477 | 本项目代码基于此 |
| 控制面板 | metacubexd | MetaCubeX | 默认内置面板 |
| 控制面板 | zashboard | Zephyruso | 内置面板 |
| 控制面板 | Yacd-meta | MetaCubeX | 内置面板,基于 yacd |
| 控制面板 | Razord-meta | MetaCubeX | 内置面板(Dashboard) |
| 订阅转换 | subconverter | tindy2013 | 在线订阅转换 |
| GEO / IP 数据 | v2ray-rules-dat | Loyalsoldier | GeoIP / GeoSite 数据 |
| GEO / IP 数据 | meta-rules-dat | MetaCubeX | GeoSite 规则数据 |
| GEO / IP 数据 | mmdb_china_ip_list | alecthw | 中国 IP 列表 MMDB |
| GEO / IP 数据 | china-operator-ip | gaoyifan | 运营商 IP 列表 |
| 规则模板 | ACL4SSR | ACL4SSR | 订阅转换规则模板 |
| 规则模板 | Custom_OpenClash_Rules | Aethersailor | 订阅转换规则模板 |
| 流媒体检测 | RegionRestrictionCheck | lmc999 | 流媒体解锁检测 |
| IP 检查 | ip.skk.moe | SukkaW | 公网 IP 检测 |
| 编辑器 | CodeMirror | Marijn Haverbeke | 内置编辑器 |
请作者喝杯咖啡
许可证
本项目基于 MIT License 开源。
File: luci-app-openclash/root/etc/openclash/custom/openclash_custom_fallback_filter.yaml
If IP addresses resolved with servers in `nameservers` are in the specified
subnets below, they are considered invalid and results from `fallback`
servers are used instead.
IP address resolved with servers in `nameserver` is used when
`fallback-filter.geoip` is true and when GEOIP of the IP address is `CN`.
If `fallback-filter.geoip` is false, results from `nameserver` nameservers
are always used if not match `fallback-filter.ipcidr`.
This is a countermeasure against DNS pollution attacks.
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- ::/128
- ::1/128
- 2001::/32
- 0.0.0.0/8
- 10.0.0.0/8
- 100.64.0.0/10
- 127.0.0.0/8
- 169.254.0.0/16
- 172.16.0.0/12
- 192.0.0.0/24
- 192.0.2.0/24
- 192.88.99.0/24
- 192.168.0.0/16
- 198.18.0.0/15
- 198.51.100.0/24
- 203.0.113.0/24
- 224.0.0.0/4
- 240.0.0.0/4
- 255.255.255.255/32
domain:
- "+.google.com"
- "+.facebook.com"
- "+.youtube.com"
- "+.githubusercontent.com"
- "+.googlevideo.com"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
File: luci-app-openclash/root/etc/openclash/custom/openclash_custom_sniffer.yaml
嗅探域名 可选配置
sniffer:
对 redir-host 类型识别的流量进行强制嗅探
如:Tun、Redir 和 TProxy 并 DNS 为 redir-host 皆属于
force-dns-mapping: true
对所有未获取到域名的流量进行强制嗅探
parse-pure-ip: true
是否使用嗅探结果作为实际访问,默认 false
全局配置,优先级低于 sniffer.sniff 实际配置
override-destination: false
sniff: # TLS 和 QUIC 默认如果不配置 ports 默认嗅探 443
QUIC:
ports: [ 443 ]
TLS:
ports: [443, 8443]
# 默认嗅探 80
HTTP:
ports: [80, 8080-8880]
# 是否使用嗅探结果作为实际访问
override-destination: falseforce-domain:
- '+' # Force all domain to use sniffer
- "+.netflix.com"
- "+.nflxvideo.net"
- "+.amazonaws.com"
- "+.media.dssott.com"
对嗅探结果进行跳过
skip-domain:
- Mijia Cloud
- dlg.io.mi.com
- +.oray.com
- +.sunlogin.net
- +.push.apple.com
#- geosite:cn
skip-src-address: # 对于来源ip跳过嗅探
- 192.168.0.3/32
skip-dst-address: # 对于目标ip跳过嗅探
- 192.168.0.3/32
File: luci-app-openclash/root/usr/share/openclash/res/default.yaml
Meta配置模板:https://github.com/MetaCubeX/mihomo/blob/Alpha/docs/config.yaml
接管:部分参数不支持在此页面直接修改,请到覆写设置页面进行修改
port: 7890 # HTTP(S) 代理服务器端口
socks-port: 7891 # SOCKS5 代理端口
mixed-port: 10801 # HTTP(S) 和 SOCKS 代理混合端口
redir-port: 7892 # 透明代理端口,用于 Linux 和 MacOS
Transparent proxy server port for Linux (TProxy TCP and TProxy UDP)
tproxy-port: 7893
allow-lan: true # 允许局域网连接
bind-address: "" # 绑定 IP 地址,仅作用于 allow-lan 为 true,''表示所有地址
authentication: # http,socks 入口的验证用户名,密码
- "username:password"
skip-auth-prefixes: # 设置跳过验证的 IP 段 - 127.0.0.1/8
- ::1/128
lan-allowed-ips: # 允许连接的 IP 地址段,仅作用于 allow-lan 为 true, 默认值为 0.0.0.0/0 和::/0 - 0.0.0.0/0
- ::/0
lan-disallowed-ips: # 禁止连接的 IP 地址段,黑名单优先级高于白名单,默认值为空 - 192.168.0.3/32
find-process-mode has 3 values:always, strict, off
- always, 开启,强制匹配所有进程
- strict, 默认,由 mihomo 判断是否开启
- off, 不匹配进程,推荐在路由器上使用此模式
find-process-mode: strict
mode: rule
#自定义 geodata url
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
geo-auto-update: false # 是否自动更新 geodata
geo-update-interval: 24 # 更新间隔,单位:小时
Matcher implementation used by GeoSite, available implementations:
- succinct (default, same as rule-set)
- mph (from V2Ray, also `hybrid` in Xray)
geosite-matcher: succinct
log-level: debug # 日志等级 silent/error/warning/info/debug
ipv6: true # 开启 IPv6 总开关,关闭阻断所有 IPv6 链接和屏蔽 DNS 请求 AAAA 记录
tls:
certificate: string # 证书 PEM 格式,或者 证书的路径
private-key: string # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
custom-certifactes:
- |
-----BEGIN CERTIFICATE-----
format/pem...
-----END CERTIFICATE-----
external-controller: 0.0.0.0:9093 # RESTful API 监听地址
external-controller-tls: 0.0.0.0:9443 # RESTful API HTTPS 监听地址,需要配置 tls 部分配置文件
secret: "123456" # `Authorization:Bearer ${secret}`
RESTful API CORS标头配置
external-controller-cors:
allow-origins:
- "*"
allow-private-network: true
RESTful API Unix socket 监听地址( windows版本大于17063也可以使用,即大于等于1803/RS4版本即可使用 )
!!!注意: 从Unix socket访问api接口不会验证secret, 如果开启请自行保证安全问题 !!!
测试方法: curl -v --unix-socket "mihomo.sock" http://localhost/
external-controller-unix: mihomo.sock
RESTful API Windows namedpipe 监听地址
!!!注意: 从Windows namedpipe访问api接口不会验证secret, 如果开启请自行保证安全问题 !!!
external-controller-pipe: \.\pipe\mihomo
为 external-controller 和 external-controller-tls 的监听socket设置routing-mark(仅支持linux)
external-controller-routing-mark: 0
tcp-concurrent: true # TCP 并发连接所有 IP, 将使用最快握手的 TCP
配置 WEB UI 目录,使用 http://{{external-controller}}/ui 访问
external-ui: /path/to/ui/folder/
external-ui-name: xd
目前支持下载zip,tgz格式的压缩包
external-ui-url: "https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip"
在RESTful API端口上开启DOH服务器
!!!该URL不会验证secret, 如果开启请自行保证安全问题 !!!
external-doh-server: /dns-query
interface-name: en0 # 设置出口网卡
TCP keep alive interval
disable-keep-alive: false #目前在android端强制为true
keep-alive-idle: 15
keep-alive-interval: 15
routing-mark:6666 # 配置 fwmark 仅用于 Linux
experimental:
Disable quic-go GSO support. This may result in reduced performance on Linux.
This is not recommended for most users.
Only users encountering issues with quic-go's internal implementation should enable this,
and they should disable it as soon as the issue is resolved.
This field will be removed when quic-go fixes all their issues in GSO.
This equivalent to the environment variable QUIC_GO_DISABLE_GSO=1.
#quic-go-disable-gso: true
类似于 /etc/hosts, 仅支持配置单个 IP
hosts:
'*.mihomo.dev': 127.0.0.1
'.dev': 127.0.0.1
'alpha.mihomo.dev': '::1'
test.com: [1.1.1.1, 2.2.2.2]
home.lan: lan # lan 为特别字段,将加入本地所有网卡的地址
baidu.com: google.com # 只允许配置一个别名
profile: # 存储 select 选择记录
store-selected: false
持久化 fake-ip
store-fake-ip: true
Tun 配置
tun:
enable: false
stack: system # gvisor/mixed/mips
dns-hijack:
- 0.0.0.0:53 # 需要劫持的 DNS
auto-detect-interface: true # 自动识别出口网卡
auto-route: true # 配置路由表
mtu: 9000 # 最大传输单元
gso: false # 启用通用分段卸载,仅支持 Linux
gso-max-size: 65536 # 通用分段卸载包的最大大小
auto-redirect: false # 自动配置 iptables 以重定向 TCP 连接。仅支持 Linux。带有 auto-redirect 的 auto-route 现在可以在路由器上按预期工作,无需干预。
strict-route: true # 将所有连接路由到 tun 来防止泄漏,但你的设备将无法其他设备被访问
disable-icmp-forwarding: true # 禁用 ICMP 转发,防止某些情况下的 ICMP 环回问题,ping 将不会显示真实的延迟
route-address-set: # 将指定规则集中的目标 IP CIDR 规则添加到防火墙, 不匹配的流量将绕过路由, 仅支持 Linux,且需要 nftables,auto-route 和 auto-redirect 已启用。
- ruleset-1
- ruleset-2
route-exclude-address-set: # 将指定规则集中的目标 IP CIDR 规则添加到防火墙, 匹配的流量将绕过路由, 仅支持 Linux,且需要 nftables,auto-route 和 auto-redirect 已启用。
- ruleset-3
- ruleset-4
route-address: # 启用 auto-route 时使用自定义路由而不是默认路由
- 0.0.0.0/1
- 128.0.0.0/1
- "::/1"
- "8000::/1"
inet4-route-address: # 启用 auto-route 时使用自定义路由而不是默认路由(旧写法)
- 0.0.0.0/1
- 128.0.0.0/1
inet6-route-address: # 启用 auto-route 时使用自定义路由而不是默认路由(旧写法)
- "::/1"
- "8000::/1"
endpoint-independent-nat: false # 启用独立于端点的 NAT
include-interface: # 限制被路由的接口。默认不限制,与 `exclude-interface` 冲突
- "lan0"
exclude-interface: # 排除路由的接口,与 `include-interface` 冲突
- "lan1"
include-uid: # UID 规则仅在 Linux 下被支持,并且需要 auto-route
- 0
include-uid-range: # 限制被路由的的用户范围
- 1000:9999
exclude-uid: # 排除路由的的用户
#- 1000
exclude-uid-range: # 排除路由的的用户范围
- 1000:9999
include-mac-address:
- 00:11:22:33:44:55
exclude-mac-address:
- 00:11:22:33:44:55
Android 用户和应用规则仅在 Android 下被支持
并且需要 auto-route
include-android-user: # 限制被路由的 Android 用户
- 0
- 10
include-package: # 限制被路由的 Android 应用包名
- com.android.chrome
exclude-package: # 排除被路由的 Android 应用包名
- com.android.captiveportallogin
嗅探域名 可选配置
sniffer:
enable: false
对 redir-host 类型识别的流量进行强制嗅探
如:Tun、Redir 和 TProxy 并 DNS 为 redir-host 皆属于
force-dns-mapping: false
对所有未获取到域名的流量进行强制嗅探
parse-pure-ip: false
是否使用嗅探结果作为实际访问,默认 true
全局配置,优先级低于 sniffer.sniff 实际配置
override-destination: false
sniff: # TLS 和 QUIC 默认如果不配置 ports 默认嗅探 443
QUIC:
# ports: [ 443 ]
TLS:
# ports: [443, 8443]
# 默认嗅探 80
HTTP: # 需要嗅探的端口
ports: [80, 8080-8880]
# 可覆盖 sniffer.override-destination
override-destination: false force-domain:
- +.v2ex.com
skip-src-address: # 对于来源ip跳过嗅探
- 192.168.0.3/32
skip-dst-address: # 对于目标ip跳过嗅探
- 192.168.0.3/32
对嗅探结果进行跳过
skip-domain:
- Mijia Cloud
需要嗅探协议
已废弃,若 sniffer.sniff 配置则此项无效
sniffing:
- tls
- http
强制对此域名进行嗅探
仅对白名单中的端口进行嗅探,默认为 443,80
已废弃,若 sniffer.sniff 配置则此项无效
port-whitelist:
- "80"
- "443"
# - 8000-9999
tunnels: # one line config
- tcp/udp,127.0.0.1:6553,114.114.114.114:53,proxy
- tcp,127.0.0.1:6666,rds.mysql.com:3306,vpn
full yaml config
- network: [tcp, udp]
address: 127.0.0.1:7777
target: target.com
proxy: proxy
DNS 配置
dns:
cache-algorithm: arc
enable: false # 关闭将使用系统 DNS
prefer-h3: false # 是否开启 DoH 支持 HTTP/3,将并发尝试
listen: 0.0.0.0:53 # 开启 DNS 服务器监听
ipv6: false # false 将返回 AAAA 的空结果
ipv6-timeout: 300 # 单位:ms,内部双栈并发时,向上游查询 AAAA 时,等待 AAAA 的时间,默认 100ms
用于解析 nameserver,fallback 以及其他 DNS 服务器配置的,DNS 服务域名
只能使用纯 IP 地址,可使用加密 DNS
default-nameserver:
- 114.114.114.114
- 8.8.8.8
- tls://1.12.12.12:853
- tls://223.5.5.5:853
- system # append DNS server from system configuration. If not found, it would print an error log and skip.
enhanced-mode: fake-ip # or redir-host
fake-ip-range: 198.18.0.1/16 # fake-ip 池设置
fake-ip-range6: fdfe:dcba:9876::1/64 # fake-ip6 池设置
配置不使用 fake-ip 的域名
fake-ip-filter:
- '*.lan'
- localhost.ptlogin2.qq.com
# fakeip-filter 为 rule-providers 中的名为 fakeip-filter 规则订阅,
# 且 behavior 必须为 domain/classical,当为 classical 时仅会生效域名类规则
- rule-set:fakeip-filter
# fakeip-filter 为 geosite 中名为 fakeip-filter 的分类(需要自行保证该分类存在)
- geosite:fakeip-filter
# 当 fake-ip-filter-mode: rule 时开启规则模式
# fake-ip 与路由 rules 匹配逻辑一致(自上而下),语法也一致,支持GEOSITE、RuleSet、DOMAIN*、MATCH
- RULE-SET,reject-domain,fake-ip # 自定义 RuleSet behavior 必须为 domain/classical,当为 classical 时仅会生效域名类规则
- RULE-SET,proxy-domain,fake-ip
- GEOSITE,gfw,fake-ip
- DOMAIN,www.baidu.com,real-ip
- DOMAIN-SUFFIX,qq.com,real-ip
- DOMAIN-SUFFIX,jd.com,fake-ip
- MATCH,fake-ip # 最后 fake-ip or real-ip配置fake-ip-filter的匹配模式,默认为blacklist,即如果匹配成功不返回fake-ip
可设置为whitelist,即只有匹配成功才返回fake-ip
也可配置为rule,规则模式语法见fake-ip-filter说明
fake-ip-filter-mode: blacklist
配置fakeip查询返回的TTL,非必要情况下请勿修改
fake-ip-ttl: 1
use-hosts: true # 查询 hosts
配置后面的nameserver、fallback和nameserver-policy向dns服务器的连接过程是否遵守遵守rules规则
如果为false(默认值)则这三部分的dns服务器在未特别指定的情况下会直连
如果为true,将会按照rules的规则匹配链接方式(走代理或直连),如果有特别指定则任然以指定值为准
仅当proxy-server-nameserver非空时可以开启此选项, 强烈不建议和prefer-h3一起使用
此外,这三者配置中的dns服务器如果出现域名会采用default-nameserver配置项解析,也请确保正确配置default-nameserver
respect-rules: false
DNS 主要域名配置
支持 UDP,TCP,DoT,DoH,DoQ
这部分为主要 DNS 配置,影响所有直连,确保使用对大陆解析精准的 DNS
nameserver:
- 114.114.114.114 # default value
- 8.8.8.8 # default value
- tls://223.5.5.5:853 # DNS over TLS
- https://doh.pub/dns-query # DNS over HTTPS
- https://dns.alidns.com/dns-query#h3=true # 强制 HTTP/3,与 perfer-h3 无关,强制开启 DoH 的 HTTP/3 支持,若不支持将无法使用
- https://mozilla.cloudflare-dns.com/dns-query#DNS&h3=true # 指定策略组和使用 HTTP/3
- dhcp://en0 # dns from dhcp
- quic://dns.adguard.com:784 # DNS over QUIC
# - ts://tailscale # 使用指定 Tailscale 出站的 DNS 配置查询
# - '8.8.8.8#RULES' # 效果同respect-rules,但仅对该服务器生效
# - '8.8.8.8#en0' # 兼容指定 DNS 出口网卡
当配置 fallback 时,会查询 nameserver 中返回的 IP 是否为 CN,非必要配置
当不是 CN,则使用 fallback 中的 DNS 查询结果
确保配置 fallback 时能够正常查询
fallback:
- tcp://1.1.1.1
- 'tcp://1.1.1.1#ProxyGroupName' # 指定 DNS 过代理查询,ProxyGroupName 为策略组名或节点名,过代理配置优先于配置出口网卡,当找不到策略组或节点名则设置为出口网卡
专用于节点域名解析的 DNS 服务器,非必要配置项,如果不填则遵循nameserver-policy、nameserver和fallback的配置
proxy-server-nameserver:
- https://doh.pub/dns-query
- tls://223.5.5.5:853
proxy-server-nameserver-policy: # 格式同nameserver-policy,仅用于节点域名解析,当且仅当proxy-server-nameserver不为空时生效
'www.yournode.com': '114.114.114.114'
专用于direct出口域名解析的 DNS 服务器,非必要配置项,如果不填则遵循nameserver-policy、nameserver和fallback的配置
direct-nameserver:
- system://
direct-nameserver-follow-policy: false # 是否遵循nameserver-policy,默认为不遵守,仅当direct-nameserver不为空时生效
配置 fallback 使用条件
fallback-filter:
geoip: true # 配置是否使用 geoip
geoip-code: CN # 当 nameserver 解析出域名的 IP 查询 geoip 库为 CN 时, 使用 nameserver 中的 DNS 查询结果
ipcidr: # 当 nameserver 解析出域名的 IP 匹配 ipcidr 时,使用 fallback 中的 DNS 查询结果
- 240.0.0.0/4
- 0.0.0.0/32
- 127.0.0.1/32
- 100.64.0.0/10
domain: # 匹配到这些域名,会直接使用 fallback 解析,不去使用 nameserver
- '+.google.com'
- '+.facebook.com'
- '+.youtube.com'
geosite: # 匹配到这些域名,会直接使用 fallback 解析,不去使用 nameserver(已废弃,请使用 nameserver-policy)
- gfw
fallback-lazy-query: false # 默认值为 false ,如果为 true 会先判断来自 nameserver 的结果是否满足 fallback-filter 后再发起查询
配置查询域名使用的 DNS 服务器
nameserver-policy:
# 'www.baidu.com': '114.114.114.114'
# '+.internal.crop.com': '10.0.0.1'
"geosite:cn,private,apple":
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
"geosite:category-ads-all": rcode://success
"www.baidu.com,+.google.cn": [223.5.5.5, https://dns.alidns.com/dns-query]
## global,dns 为 rule-providers 中的名为 global 和 dns 规则订阅,
## 且 behavior 必须为 domain/classical,当为 classical 时仅会生效域名类规则
# "rule-set:global,dns": 8.8.8.8
proxies: # socks5
- name: "socks"
type: socks5
server: server
port: 443username: username
password: password
tls: true
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
skip-cert-verify: true
udp: true
ip-version: ipv6
http
- name: "http"
type: http
server: server
port: 443username: username
password: password
tls: true # https
skip-cert-verify: true
sni: custom.com
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
ip-version: dual
Snell
name: "snell"
type: snell
server: server
port: 44046
psk: yourpskversion: 4 # support 1/2/3/4/5
udp: true # support UDP on version 3/4/5
reuse: false # v4/5 only
obfs-opts:
mode: http # or tls/shadow-tls
name: "snell-shadow-tls"
type: snell
server: server
port: 44046
psk: yourpskversion: 4 # support 1/2/3/4/5
udp: true # support UDP on version 3/4/5
reuse: false # v4/5 only
client-fingerprint: chrome
obfs-opts:
mode: shadow-tls
host: bing.com
password: "shadow_tls_password"
version: 2 # support 1/2/3
alpn: ["h2","http/1.1"]
Shadowsocks
cipher支持:
aes-128-gcm aes-192-gcm aes-256-gcm
aes-128-cfb aes-192-cfb aes-256-cfb
aes-128-ctr aes-192-ctr aes-256-ctr
rc4-md5 chacha20-ietf xchacha20
chacha20-ietf-poly1305 xchacha20-ietf-poly1305
2022-blake3-aes-128-gcm 2022-blake3-aes-256-gcm 2022-blake3-chacha20-poly1305
name: "ss1"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"udp: true
udp-over-tcp: false
ip-version: ipv4 # 设置节点使用 IP 版本,可选:dual,ipv4,ipv6,ipv4-prefer,ipv6-prefer。默认使用 dual
ipv4:仅使用 IPv4 ipv6:仅使用 IPv6
ipv4-prefer:优先使用 IPv4 对于 TCP 会进行双栈解析,并发链接但是优先使用 IPv4 链接,
UDP 则为双栈解析,获取结果中的第一个 IPv4
ipv6-prefer 同 ipv4-prefer
现有协议都支持此参数,TCP 效果仅在开启 tcp-concurrent 生效
smux:
enabled: false
protocol: smux # smux/yamux/h2muxmax-connections: 4 # Maximum connections. Conflict with max-streams.
min-streams: 4 # Minimum multiplexed streams in a connection before opening a new connection. Conflict with max-streams.
max-streams: 0 # Maximum multiplexed streams in a connection before opening a new connection. Conflict with max-connections and min-streams.
padding: false # Enable padding. Requires sing-box server version 1.3-beta9 or later.
statistic: false # 控制是否将底层连接显示在面板中,方便打断底层连接
only-tcp: false # 如果设置为 true, smux 的设置将不会对 udp 生效,udp 连接会直接走底层协议
name: "ss2"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
plugin: obfs
plugin-opts:
mode: tls # or httphost: bing.com
name: "ss3"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
plugin: v2ray-plugin
plugin-opts:
mode: websocket # no QUIC nowtls: true # wss
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
skip-cert-verify: true
host: bing.com
path: "/"
mux: true
headers:
custom: value
v2ray-http-upgrade: false
v2ray-http-upgrade-fast-open: false
name: "ss4-shadow-tls"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
plugin: shadow-tls
client-fingerprint: chrome
plugin-opts:
host: "cloud.tencent.com"
password: "shadow_tls_password"
version: 2 # support 1/2/3alpn: ["h2","http/1.1"]
name: "ss5"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
plugin: gost-plugin
plugin-opts:
mode: websockettls: true # wss
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
skip-cert-verify: true
host: bing.com
path: "/"
mux: true
headers:
custom: value
name: "gost-relay-hop"
type: gost-relayDynamic mode: relay connects to the target address requested by the upper proxy.
Use this proxy through dialer-proxy to carry ss/vmess/vless/trojan/etc.
server: relay.example.com
port: 443
udp: true
tls: truemux: true # relay+mtls when tls is also true
sni: relay.example.com
username: user
password: pass
client-fingerprint: chrome
fingerprint: xxxx
certificate: ./client.crt
private-key: ./client.key
skip-cert-verify: true
name: "ss6-gost-relay"
type: ssThis address is dialed from the remote GOST relay server side.
If the remote SS listens on 127.0.0.1:12345 on the relay server, write it here.
server: 127.0.0.1
port: 12345
cipher: chacha20-ietf-poly1305
password: "password"
udp: trueudp-over-tcp: true # use this instead if your SS server expects UoT over TCP
dialer-proxy: gost-relay-hop
- name: "gost-relay-forward-hop"
type: gost-relay
# Forward mode: relay server chooses its configured forwarding target.
server: relay.example.com
port: 443
udp: true
forward: true
tls: true
# mux: true
# sni: relay.example.com
# username: user
# password: pass
- name: "ss6-gost-relay-forward"
type: ss
# In forward mode this address is only used to ask dialer-proxy for a stream.
# The GOST relay server forwards the stream to its configured target.
server: relay.example.com
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
udp: true
dialer-proxy: gost-relay-forward-hop
name: "ss-restls-tls13"
type: ss
server: [YOUR_SERVER_IP]
port: 443
cipher: chacha20-ietf-poly1305
password: [YOUR_SS_PASSWORD]
client-fingerprint:
chrome # One of: chrome, ios, firefox or safari可以是 chrome, ios, firefox, safari 中的一个
plugin: restls
plugin-opts:
host:
"www.microsoft.com" # Must be a TLS 1.3 server
# 应当是一个 TLS 1.3 服务器
password: [YOUR_RESTLS_PASSWORD]
version-hint: "tls13"Control your post-handshake traffic through restls-script
Hide proxy behaviors like "tls in tls".
see https://github.com/3andne/restls/blob/main/Restls-Script:%20Hide%20Your%20Proxy%20Traffic%20Behavior.md
用 restls 剧本来控制握手后的行为,隐藏"tls in tls"等特征
详情:https://github.com/3andne/restls/blob/main/Restls-Script:%20%E9%9A%90%E8%97%8F%E4%BD%A0%E7%9A%84%E4%BB%A3%E7%90%86%E8%A1%8C%E4%B8%BA.md
restls-script: "300?100<1,400
100,350100,600100,300200,300~100"name: "ss-restls-tls12"
type: ss
server: [YOUR_SERVER_IP]
port: 443
cipher: chacha20-ietf-poly1305
password: [YOUR_SS_PASSWORD]
client-fingerprint:
chrome # One of: chrome, ios, firefox or safari可以是 chrome, ios, firefox, safari 中的一个
plugin: restls
plugin-opts:
host:
"vscode.dev" # Must be a TLS 1.2 server
# 应当是一个 TLS 1.2 服务器
password: [YOUR_RESTLS_PASSWORD]
version-hint: "tls12"
restls-script: "1000?100<1,500100,350100,600100,400200"name: "ss-kcptun"
type: ss
server: [YOUR_SERVER_IP]
port: 443
cipher: chacha20-ietf-poly1305
password: [YOUR_SS_PASSWORD]
plugin: kcptun
plugin-opts:
key: it's a secrect # pre-shared secret between client and server
crypt: aes # aes, aes-128, aes-128-gcm, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none, null
mode: fast # profiles: fast3, fast2, fast, normal, manual
conn: 1 # set num of UDP connections to server
autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable
scavengettl: 600 # set how long an expired connection can live (in seconds)
mtu: 1350 # set maximum transmission unit for UDP packets
ratelimit: 0 # set maximum outgoing speed (in bytes per second) for a single KCP connection, 0 to disable. Also known as packet pacing
sndwnd: 128 # set send window size(num of packets)
rcvwnd: 512 # set receive window size(num of packets)
datashard: 10 # set reed-solomon erasure coding - datashard
parityshard: 3 # set reed-solomon erasure coding - parityshard
dscp: 0 # set DSCP(6bit)
nocomp: false # disable compression
acknodelay: false # flush ack immediately when a packet is received
nodelay: 0
interval: 50
resend: 0
sockbuf: 4194304 # per-socket buffer in bytes
smuxver: 1 # specify smux version, available 1,2
smuxbuf: 4194304 # the overall de-mux buffer in bytes
framesize: 8192 # smux max frame size
streambuf: 2097152 # per stream receive buffer in bytes, smux v2+
keepalive: 10 # seconds between heartbeats
vmess
cipher 支持 auto/aes-128-gcm/chacha20-poly1305/none
name: "vmess"
type: vmess
server: server
port: 443
uuid: uuid
alterId: 32
cipher: autoudp: true
tls: true
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
client-fingerprint: chrome # Available: "chrome","firefox","safari","ios","random", currently only support TLS transport in TCP/GRPC/WS/HTTP for VLESS/Vmess and trojan.
skip-cert-verify: true
servername: example.com # priority over wss host
network: ws
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
ws-opts:
path: /path
headers:
Host: v2ray.com
max-early-data: 2048
early-data-header-name: Sec-WebSocket-Protocol
v2ray-http-upgrade: false
v2ray-http-upgrade-fast-open: false
name: "vmess-h2"
type: vmess
server: server
port: 443
uuid: uuid
alterId: 32
cipher: auto
network: h2
tls: truefingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
h2-opts:
host:
- http.example.com
- http-alt.example.com
path: /name: "vmess-http"
type: vmess
server: server
port: 443
uuid: uuid
alterId: 32
cipher: autoudp: true
network: http
http-opts:
method: "GET"
path:
- '/'
- '/video'
headers:
Connection:
- keep-alive
ip-version: ipv4 # 设置使用 IP 类型偏好,可选:ipv4,ipv6,dual,默认值:dual
name: vmess-grpc
server: server
port: 443
type: vmess
uuid: uuid
alterId: 32
cipher: auto
network: grpc
tls: truefingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
servername: example.com
skip-cert-verify: true
grpc-opts:
grpc-service-name: "example"grpc-user-agent: "grpc-go/1.36.0"
ping-interval: 0 # 默认关闭,单位为秒
max-connections: 1 # Maximum connections. Conflict with max-streams.
min-streams: 0 # Minimum multiplexed streams in a connection before opening a new connection. Conflict with max-streams.
max-streams: 0 # Maximum multiplexed streams in a connection before opening a new connection. Conflict with max-connections and min-streams.
ip-version: ipv4
vless
name: "vless-tcp"
type: vless
server: server
port: 443
uuid: uuid
network: tcp
servername: example.com # AKA SNIskip-cert-verify: true
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
client-fingerprint: random # Available: "chrome","firefox","safari","random","none"
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
name: "vless-vision"
type: vless
server: server
port: 443
uuid: uuid
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
client-fingerprint: chrome下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
skip-cert-verify: true
name: "vless-encryption"
type: vless
server: server
port: 443
uuid: uuid
network: tcp-------------------------
vless encryption客户端配置:
(native/xorpub 的 XTLS Vision 可以 Splice。只使用 1-RTT 模式 / 若服务端发的 ticket 中秒数不为零则 0-RTT 复用)
/ 是只能选一个,后面 base64 至少一个,无限串联,使用 mihomo generate vless-x25519 和 mihomo generate vless-mlkem768 生成,替换值时需去掉括号
Padding 是可选的参数,仅作用于 1-RTT 以消除握手的长度特征,双端默认值均为 "100-111-1111.75-0-111.50-0-3333":
在 1-RTT client/server hello 后以 100% 的概率粘上随机 111 到 1111 字节的 padding
以 75% 的概率等待随机 0 到 111 毫秒("probability-from-to")
再次以 50% 的概率发送随机 0 到 3333 字节的 padding(若为 0 则不 Write())
服务端、客户端可以设置不同的 padding 参数,按 len、gap 的顺序无限串联,第一个 padding 需概率 100%、至少 35 字节
-------------------------
encryption: "mlkem768x25519plus.native/xorpub/random.1rtt/0rtt.(padding len).(padding gap).(X25519 Password).(ML-KEM-768 Client)..."
tls: false #可以不开启tls
udp: truename: "vless-reality-vision"
type: vless
server: server
port: 443
uuid: uuid
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
servername: www.microsoft.com # REALITY servername
reality-opts:
public-key: xxx
short-id: xxx # optional
support-x25519mlkem768: false # 如果服务端支持可手动设置为true
client-fingerprint: chrome # cannot be emptyname: "vless-reality-grpc"
type: vless
server: server
port: 443
uuid: uuid
network: grpc
tls: true
udp: true
flow:skip-cert-verify: true
client-fingerprint: chrome
servername: testingcf.jsdelivr.net
grpc-opts:
grpc-service-name: "grpc"grpc-user-agent: "grpc-go/1.36.0"
ping-interval: 0 # 默认关闭,单位为秒
max-connections: 1 # Maximum connections. Conflict with max-streams.
min-streams: 0 # Minimum multiplexed streams in a connection before opening a new connection. Conflict with max-streams.
max-streams: 0 # Maximum multiplexed streams in a connection before opening a new connection. Conflict with max-connections and min-streams.
reality-opts:
public-key: CrrQSjAG_YkHLwvM2M-7XkKJilgL5upBKCp0od0tLhE
short-id: 10f897e26c4b9478
support-x25519mlkem768: false # 如果服务端支持可手动设置为truename: "vless-ws"
type: vless
server: server
port: 443
uuid: uuid
udp: true
tls: true
network: wsclient-fingerprint: random # Available: "chrome","firefox","safari","random","none"
servername: example.com # priority over wss host
skip-cert-verify: true
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
ws-opts:
path: "/"
headers:
Host: example.comv2ray-http-upgrade: false
v2ray-http-upgrade-fast-open: false
name: "vless-xhttp"
type: vless
server: server
port: 443
uuid: uuid
udp: true
tls: true
network: xhttp
alpn: [h2] # 默认仅支持h2,如果开启h3模式需要设置alpn: [h3],如果开启http1.1模式需要设置alpn: [http/1.1]ech-opts: ...
reality-opts: ...
skip-cert-verify: false
fingerprint: ...
certificate: ...
private-key: ...
servername: xxx.com
client-fingerprint: chrome
encryption: ""
xhttp-opts:
path: "/"
host: xxx.commode: "stream-one" # Available: "stream-one", "stream-up" or "packet-up"
headers:
X-Forwarded-For: ""
no-grpc-header: false
x-padding-bytes: "100-1000"
x-padding-obfs-mode: false
x-padding-key: x_padding
x-padding-header: Referer
x-padding-placement: queryInHeader # Available: queryInHeader, cookie, header, query
x-padding-method: repeat-x # Available: repeat-x, tokenish
uplink-http-method: POST # Available: POST, PUT, PATCH, DELETE
session-placement: path # Available: path, query, cookie, header
session-key: ""
seq-placement: path # Available: path, query, cookie, header
seq-key: ""
uplink-data-placement: body # Available: body, cookie, header
uplink-data-key: ""
uplink-chunk-size: 0 # only applicable when uplink-data-placement is not body
sc-max-each-post-bytes: 1000000
sc-min-posts-interval-ms: 30
reuse-settings: # aka XMUX
max-concurrency: "16-32"
max-connections: "0"
c-max-reuse-times: "0"
h-max-request-times: "600-900"
h-max-reusable-secs: "1800-3000"
h-keep-alive-period: 0
download-settings:
## xhttp part
path: "/"
host: xxx.com
headers:
X-Forwarded-For: ""
reuse-settings: # aka XMUX
max-concurrency: "16-32"
max-connections: "0"
c-max-reuse-times: "0"
h-max-request-times: "600-900"
h-max-reusable-secs: "1800-3000"
h-keep-alive-period: 0
## proxy part
server: server
port: 443
tls: true
alpn: ...
ech-opts: ...
reality-opts: ...
skip-cert-verify: false
fingerprint: ...
certificate: ...
private-key: ...
servername: xxx.com
client-fingerprint: chrome
Trojan
name: "trojan"
type: trojan
server: server
port: 443
password: yourpskclient-fingerprint: random # Available: "chrome","firefox","safari","random","none"
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
udp: true
sni: example.com # aka server name
alpn:
- h2
- http/1.1
skip-cert-verify: true
ss-opts: # like trojan-go's `shadowsocks` config
enabled: false
method: aes-128-gcm # aes-128-gcm/aes-256-gcm/chacha20-ietf-poly1305
password: "example"
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
name: trojan-grpc
server: server
port: 443
type: trojan
password: "example"
network: grpc
sni: example.comskip-cert-verify: true
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
udp: true
grpc-opts:
grpc-service-name: "example"grpc-user-agent: "grpc-go/1.36.0"
ping-interval: 0 # 默认关闭,单位为秒
max-connections: 1 # Maximum connections. Conflict with max-streams.
min-streams: 0 # Minimum multiplexed streams in a connection before opening a new connection. Conflict with max-streams.
max-streams: 0 # Maximum multiplexed streams in a connection before opening a new connection. Conflict with max-connections and min-streams.
name: trojan-ws
server: server
port: 443
type: trojan
password: "example"
network: ws
sni: example.comskip-cert-verify: true
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
udp: true
ws-opts:
path: /path
headers:
Host: example.com
v2ray-http-upgrade: false
v2ray-http-upgrade-fast-open: false
name: "trojan-xtls"
type: trojan
server: server
port: 443
password: yourpsk
flow: "xtls-rprx-direct" # xtls-rprx-origin xtls-rprx-direct
flow-show: trueudp: true
sni: example.com # aka server name
skip-cert-verify: true
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
#hysteria
- name: "hysteria"
type: hysteria
server: server.com
port: 443ports: 1000,2000-3000,5000 # port 不可省略
auth-str: yourpasswordobfs: obfs_str
alpn:
- h3
protocol: udp # 支持 udp/wechat-video/faketcp
up: "30 Mbps" # 若不写单位,默认为 Mbps
down: "200 Mbps" # 若不写单位,默认为 Mbpssni: server.com
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
skip-cert-verify: false
recv-window-conn: 12582912
recv-window: 52428800
disable-mtu-discovery: false
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
fast-open: true # 支持 TCP 快速打开,默认为 false
#hysteria2
- name: "hysteria2"
type: hysteria2
server: server.com
port: 443ports: 1000,2000-3000,5000 # port 不可省略
hop-interval: 15 # 支持填写"15-30"会每次随机选取其中一个值作为切换间隔,仅支持写一个范围(即不允许出现逗号)
up 和 down 均不写或为 0 则使用 BBR 流控
up: "30 Mbps" # 若不写单位,默认为 Mbps
down: "200 Mbps" # 若不写单位,默认为 Mbps
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
password: yourpasswordobfs: salamander # 默认为空,如果填写则开启 obfs,目前支持 salamander 和 gecko
obfs-password: yourpassword
obfs-min-packet-size: 512 # 最小线上数据包大小(字节)。仅限 Gecko。
obfs-max-packet-size: 1200 # 最大线上数据包大小(字节)。仅限 Gecko。
sni: server.com
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
skip-cert-verify: false
fingerprint: xxxx # 配置指纹将实现 SSL Pining 效果, 可使用 openssl x509 -noout -fingerprint -sha256 -inform pem -in yourcert.pem 获取
下面两项如果填写则开启 mTLS(需要同时填写)
certificate: ./client.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./client.key # 证书对应的私钥 PEM 格式,或者私钥路径
alpn:
- h3
realm-opts:
enable: true # 必须手动开启
server-url: https://realm.hy2.io
token: public
realm-id: my-cabin-1f3a8c2e9b
stun-servers:
- stun.nextcloud.com:3478
- stun.sip.us:3478
- global.stun.twilio.com:3478
# 下面支持填写针对server-url的TLS配置(sni, skip-cert-verify, fingerprint, certificate, private-key, alpn)
# skip-cert-verify: false
# ......
###quic-go特殊配置项,不要随意修改除非你知道你在干什么###initial-stream-receive-window: 8388608
max-stream-receive-window: 8388608
initial-connection-receive-window: 20971520
max-connection-receive-window: 20971520
wireguard
- name: "wg"
type: wireguard
server: 162.159.192.1
port: 2480
ip: 172.16.0.2
ipv6: fd01:5ca1:ab1e:80fa:ab85:6eea:213f:f4a5
public-key: Cr8hWlKvtDt7nrvf+f0brNQQzabAqrjfBvas9pmowjo=pre-shared-key: 31aIhAPwktDGpH4JDhA8GNvjFXEf/a6+UaQRyOAiyfM=
private-key: eCtXsJZ27+4PbhDkHnB923tkUn2Gj59wZw5wFA75MnU=
udp: true
reserved: "U4An"数组格式也是合法的
reserved: [209,98,59]
persistent-keepalive: 0
一个出站代理的标识。当值不为空时,将使用指定的 proxy 发出连接
dialer-proxy: "ss1"
remote-dns-resolve: true # 强制 dns 远程解析,默认值为 false
dns: [ 1.1.1.1, 8.8.8.8 ] # 仅在 remote-dns-resolve 为 true 时生效
refresh-server-ip-interval: 60 # 重新解析server ip的间隔,单位为秒,默认值为0即仅第一次链接时解析server域名,仅应在server域名对应的IP会发生变化时启用该选项(如家宽ddns)
如果 peers 不为空,该段落中的 allowed-ips 不可为空;前面段落的 server,port,public-key,pre-shared-key 均会被忽略,但 private-key 会被保留且只能在顶层指定
peers:
- server: 162.159.192.1
port: 2480
public-key: Cr8hWlKvtDt7nrvf+f0brNQQzabAqrjfBvas9pmowjo=
# pre-shared-key: 31aIhAPwktDGpH4JDhA8GNvjFXEf/a6+UaQRyOAiyfM=
allowed-ips: ['0.0.0.0/0']
reserved: [209,98,59]
如果存在则开启AmneziaWG功能
amnezia-wg-option:
jc: 5
jmin: 500
jmax: 501
s1: 30
s2: 40
s3: 50 # AmneziaWG v1.5 and v2
s4: 5 # AmneziaWG v1.5 and v2
h1: 123456 # AmneziaWG v1.0 and v1.5
h2: 67543 # AmneziaWG v1.0 and v1.5
h3: 123123 # AmneziaWG v1.0 and v1.5
h4: 32345 # AmneziaWG v1.0 and v1.5
h1: 123456-123500 # AmneziaWG v2.0 only
h2: 67543-67550 # AmneziaWG v2.0 only
h3: 123123-123200 # AmneziaWG v2.0 only
h4: 32345-32350 # AmneziaWG v2.0 only
i1:
# AmneziaWG v1.5 and v2 i2:
# AmneziaWG v1.5 and v2 i3: "" # AmneziaWG v1.5 and v2
i4: "" # AmneziaWG v1.5 and v2
i5: "" # AmneziaWG v1.5 and v2
j1:
# AmneziaWG v1.5 only (removed in v2) j2:
# AmneziaWG v1.5 only (removed in v2) j3:
# AmneziaWG v1.5 only (removed in v2) itime: 60 # AmneziaWG v1.5 only (removed in v2)
tailscale
- name: "tailscale"
type: tailscalehostname: mihomo # Tailscale 设备名,默认由 tsnet 处理
auth-key: tskey-auth-xxxx # 可选;不填写时首次启动会输出交互式登录 URL
control-url: https://controlplane.tailscale.com # 可选;自定义 Headscale/Tailscale control server
state-dir: ./tailscale # tsnet 状态目录,默认 tailscale
ephemeral: false # 是否作为 ephemeral node 登录,默认 false
udp: true # 是否启用 UDP,默认 falseaccept-routes: true # 是否接受 Tailnet 中发布的 subnet routes
exit-node: 100.64.0.1 # 使用指定 exit node,可填写节点 IP;也支持 auto:any
exit-node-allow-lan-access: true # 使用 exit node 时是否允许访问本地 LAN
当目标不在 Tailscale 路由内时,连接会直接报错,不会回退到直连;
访问公网需要配置可用的 exit-node,或接受覆盖目标网段的 subnet routes。
一个出站代理的标识。当值不为空时,将使用指定的 proxy 发出 Tailscale 控制面和 DERP/STUN 等连接
dialer-proxy: "ss1"
interface-name: "WLAN" # 指定出站网卡
routing-mark: 6666 # Linux 下配置 fwmark
ip-version: ipv4-prefer # 可选:dual/ipv4/ipv6/ipv4-prefer/ipv6-prefer
openvpn
- name: "openvpn"
type: openvpn
server: vpn.example.com
port: 1194
proto: udp # udp/tcp,默认 udpdev: tun # 目前仅支持 tun,默认 tun
cipher: AES-128-GCM # 支持 AES-128-GCM / AES-192-GCM / AES-256-GCM / AES-128-CBC / AES-192-CBC / AES-256-CBC / CHACHA20-POLY1305,默认 AES-128-GCM;AES-CBC 会按 AES-128-CBC 处理
auth: SHA256 # 支持 MD5 / SHA1 / SHA256 / SHA384 / SHA512,默认 SHA256;AEAD cipher 会忽略 auth
comp-lzo: "no" # 可选值:"yes", "no", "adaptive"
username / password: auth-user-pass 模式(与下方 cert+key 二选一,不能都不填)
username: "user"
password: "pass"
从 .ovpn 中复制
ca: |内的内容,不需要保留 标签
-----BEGIN CERTIFICATE-----
MIIB...example
-----END CERTIFICATE-----从 .ovpn 中复制
cert: |内的内容(auth-user-pass 时可省略 cert / key)
-----BEGIN CERTIFICATE-----
MIIB...example
-----END CERTIFICATE-----从 .ovpn 中复制
key: |内的内容
-----BEGIN PRIVATE KEY-----
MIIE...example
-----END PRIVATE KEY-----从 .ovpn 中复制
内的内容,不需要保留 标签;没有 tls-crypt 的配置可省略 tls-crypt: |
-----BEGIN OpenVPN Static key V1-----
00000000000000000000000000000000
...
-----END OpenVPN Static key V1-----
peer-info: # 透传给服务端的 peer-info 键值对,追加在内置 IV_VER/IV_PROTO/IV_CIPHERS 之后;用于服务端基于 peer-info 做准入决策
IV_HWADDR: "52:54:00:ff:72:87"
UV_DEVICE_ID: "laptop-001"
ping: 10 # 默认值为 0
ping-restart: 60 # 默认值为 0
handshake-timeout: 30 # 单位为秒;配置后握手时不受外层连接超时影响;默认值为 0,表示仅使用外层连接超时
mtu: 1500
udp: true一个出站代理的标识。当值不为空时,将使用指定的 proxy 发出连接
dialer-proxy: "ss1"
remote-dns-resolve: true # 强制 dns 远程解析,默认值为 false
dns: [ 1.1.1.1, 8.8.8.8 ] # 仅在 remote-dns-resolve 为 true 时生效
masque
- name: "masque"
type: masque
server: 162.159.198.1
port: 443
private-key: MHcCAQEEILI1eOtnbEIh89Fj4yNDuFR6UjayCKI3NdLl3DhetimWoAoGCCqGSM49AwEHoUQDQgAEgyXrE8v+hHsHy3ewSb3WcRjYgCrM9T9hiE0Uv6k2DZ1+4kefrDT9v1Q/8wdRigTf6t6gGNUV8W+IUMdrfUt+9g==
public-key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIaU7MToJm9NKp8YfGxR6r+/h4mcG7SxI8tsW8OR1A5tv/zCzVbCRRh2t87/kxnP6lAy0lkr7qYwu+ox+k3dr6w==
ip: 172.16.0.2
ipv6: 2606:4700:110:84c0:163a:4914:a0ad:3342
mtu: 1280
udp: true一个出站代理的标识。当值不为空时,将使用指定的 proxy 发出连接
dialer-proxy: "ss1"
remote-dns-resolve: true # 强制 dns 远程解析,默认值为 false
dns: [ 1.1.1.1, 8.8.8.8 ] # 仅在 remote-dns-resolve 为 true 时生效
congestion-controller: bbr # 默认不开启
handshake-timeout: 30 # 单位为秒;配置后握手时不受外层连接超时影响;默认值为 0,表示仅使用外层连接超时
masque-h3-l4proxy
- name: "masque-h3-l4proxy"
type: masque
server: 162.159.198.1
port: 443
private-key: MHcCAQEEILI1eOtnbEIh89Fj4yNDuFR6UjayCKI3NdLl3DhetimWoAoGCCqGSM49AwEHoUQDQgAEgyXrE8v+hHsHy3ewSb3WcRjYgCrM9T9hiE0Uv6k2DZ1+4kefrDT9v1Q/8wdRigTf6t6gGNUV8W+IUMdrfUt+9g==
public-key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIaU7MToJm9NKp8YfGxR6r+/h4mcG7SxI8tsW8OR1A5tv/zCzVbCRRh2t87/kxnP6lAy0lkr7qYwu+ox+k3dr6w==
udp: false # 目前 l4proxy 模式不支持 udp
network: h3-l4proxy一个出站代理的标识。当值不为空时,将使用指定的 proxy 发出连接
dialer-proxy: "ss1"
remote-dns-resolve: true # 强制 dns 远程解析,默认值为 false
dns: [ tls://1.1.1.1, tls://1.0.0.1 ] # 仅在 remote-dns-resolve 为 true 时生效
congestion-controller: bbr # 默认不开启
handshake-timeout: 30 # 单位为秒;配置后握手时不受外层连接超时影响;默认值为 0,表示仅使用外层连接超时
masque-h2
- name: "masque-h2"
type: masque
server: 162.159.198.2
port: 443
private-key: MHcCAQEEILI1eOtnbEIh89Fj4yNDuFR6UjayCKI3NdLl3DhetimWoAoGCCqGSM49AwEHoUQDQgAEgyXrE8v+hHsHy3ewSb3WcRjYgCrM9T9hiE0Uv6k2DZ1+4kefrDT9v1Q/8wdRigTf6t6gGNUV8W+IUMdrfUt+9g==
public-key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIaU7MToJm9NKp8YfGxR6r+/h4mcG7SxI8tsW8OR1A5tv/zCzVbCRRh2t87/kxnP6lAy0lkr7qYwu+ox+k3dr6w==
ip: 172.16.0.2
ipv6: 2606:4700:110:84c0:163a:4914:a0ad:3342
mtu: 1280
udp: true
network: h2一个出站代理的标识。当值不为空时,将使用指定的 proxy 发出连接
dialer-proxy: "ss1"
remote-dns-resolve: true # 强制 dns 远程解析,默认值为 false
dns: [ 1.1.1.1, 8.8.8.8 ] # 仅在 remote-dns-resolve 为 true 时生效
handshake-timeout: 30 # 单位为秒;配置后握手时不受外层连接超时影响;默认值为 0,表示仅使用外层连接超时
tuic
- name: tuic
server: www.example.com
port: 10443
type: tuictuicV4 必须填写 token(不可同时填写 uuid 和 password)
token: TOKENtuicV5 必须填写 uuid 和 password(不可同时填写 token)
uuid: 00000000-0000-0000-0000-000000000001
password: PASSWORD_1ip: 127.0.0.1 # for overwriting the DNS lookup result of the server address set in option 'server'
heartbeat-interval: 10000
alpn: [h3]
disable-sni: true
reduce-rtt: true
request-timeout: 8000
udp-relay-mode: native # Available: "native", "quic". Default: "native"congestion-controller: bbr # Available: "cubic", "new_reno", "bbr". Default: "cubic"
cwnd: 10 # default: 32
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
max-udp-relay-packet-size: 1500
fast-open: true
skip-cert-verify: true
max-open-streams: 20 # default 100, too many open streams may hurt performance
sni: example.com
ech-opts:
enable: true # 必须手动开启
# 如果config为空则通过dns解析,不为空则通过该值指定,格式为经过base64编码的ech参数(dig +short TYPE65 tls-ech.dev)
config: AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA
# query-server-name: xxx.com # 可选项,不为空时用于指定通过dns解析时的域名
meta 和 sing-box 私有扩展,将 ss-uot 用于 udp 中继,开启此选项后 udp-relay-mode 将失效
警告,与原版 tuic 不兼容!!!
udp-over-stream: false
udp-over-stream-version: 1
ShadowsocksR
The supported ciphers (encryption methods): all stream ciphers in ss
The supported obfses:
plain http_simple http_post
random_head tls1.2_ticket_auth tls1.2_ticket_fastauth
The supported protocols:
origin auth_sha1_v4 auth_aes128_md5
auth_aes128_sha1 auth_chain_a auth_chain_b
name: "ssr"
type: ssr
server: server
port: 443
cipher: chacha20-ietf
password: "password"
obfs: tls1.2_ticket_auth
protocol: auth_sha1_v4obfs-param: domain.tld
protocol-param: "#"
udp: true
name: "ssh-out"
type: sshserver: 127.0.0.1
port: 22
username: root
password: password
privateKey: path
mieru
- name: mieru
type: mieru
server: 1.2.3.4
port: 2999port-range: 2090-2099 #(不可同时填写 port 和 port-range)
transport: TCP # 支持 TCP 或者 UDP
udp: true # 支持 UDP over TCP
username: user
password: password可以使用的值包括 MULTIPLEXING_OFF, MULTIPLEXING_LOW, MULTIPLEXING_MIDDLE, MULTIPLEXING_HIGH。其中 MULTIPLEXING_OFF 会关闭多路复用功能。默认值为 MULTIPLEXING_LOW。
multiplexing: MULTIPLEXING_LOW
如果想开启 0-RTT 握手,请设置为 HANDSHAKE_NO_WAIT,否则请设置为 HANDSHAKE_STANDARD。默认值为 HANDSHAKE_STANDARD
handshake-mode: HANDSHAKE_STANDARD
一个 base64 字符串用于微调网络行为
traffic-pattern: ""
sudoku
- name: sudoku
type: sudoku
server: server_ip/domain # 1.2.3.4 or domain
port: 443
key: "" # 如果你使用sudoku生成的ED25519密钥对,请填写密钥对中的私钥,否则填入和服务端相同的uuid
aead-method: chacha20-poly1305 # 可选:chacha20-poly1305、aes-128-gcm、none(不建议;none 不提供 AEAD 保护)
padding-min: 2 # 最小填充率(0-100)
padding-max: 7 # 最大填充率(0-100,必须 >= padding-min)
table-type: prefer_ascii # 可选值:prefer_ascii、prefer_entropy、up_ascii_down_entropy、up_entropy_down_asciicustom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合;只对 entropy 方向生效
custom-tables: ["xpxvvpvv", "vxpvxvvp"] # 可选,自定义字节布局列表(x/v/p),非空时覆盖 custom-table
推荐:使用 httpmask 对象统一管理 HTTPMask 相关字段:
httpmask:
disable: false # true 禁用所有 HTTP 伪装/隧道
mode: legacy # 可选:legacy(默认)、stream(split-stream)、poll、auto(先 stream 再 poll)、ws(WebSocket 隧道)tls: true # 可选:按需开启 HTTPS/WSS
host: "" # 可选:覆盖 Host/SNI(支持 example.com 或 example.com:443);仅在 mode 为 stream/poll/auto/ws 时生效
path-root: "" # 可选:HTTP 隧道端点一级路径前缀(双方需一致),例如 "aabbcc" 或 "/aabbcc/" => /aabbcc/session、/aabbcc/stream、/aabbcc/api/v1/upload、/aabbcc/ws
multiplex: "off" # 可选字符串:off(默认)、auto(复用底层 HTTP 连接,减少建链 RTT)、on(Sudoku mux 单隧道多目标;仅在 mode=stream/poll/auto 生效;ws 强制 off)
enable-pure-downlink: false # 可选:false=带宽优化下行;true=纯 Sudoku 下行
anytls
- name: anytls
type: anytls
server: 1.2.3.4
port: 443
password: "" client-fingerprint: chrome
udp: trueidle-session-check-interval: 30 # seconds
idle-session-timeout: 30 # seconds
min-idle-session: 0
sni: "example.com"
alpn:
- h2
- http/1.1
skip-cert-verify: true
trusttunnel
- name: trusttunnel
type: trusttunnel
server: 1.2.3.4
port: 443
username: username
password: passwordclient-fingerprint: chrome
health-check: true
udp: truesni: "example.com"
alpn:
- h2
skip-cert-verify: true
quic options
quic: true # 默认为false
congestion-controller: bbr
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
reuse options
max-connections: 8 # Maximum connections. Conflict with max-streams.
min-streams: 5 # Minimum multiplexed streams in a connection before opening a new connection. Conflict with max-streams.
max-streams: 0 # Maximum multiplexed streams in a connection before opening a new connection. Conflict with max-connections and min-streams.
dns 出站会将请求劫持到内部 dns 模块,所有请求均在内部处理
name: "dns-out"
type: dnsname: "rematch"
type: rematch
target-rematch-name: "rematch1" # 如果填写则覆盖原始 metadata 中的 rematch-name(可用REMATCH-NAME规则匹配)
target-sub-rule: "sub-rule1" # 如果填写则接下来会直接用指定的 sub-rule 匹配,如果名字不存在或为空会回退到主rules
配置指定 interface-name 和 fwmark 的 DIRECT
- name: en1-direct
type: direct
interface-name: en1
routing-mark: 6667
proxy-groups:
url-test 将按照 url 测试结果使用延迟最低节点
- name: "auto"
type: url-test
proxies:- ss1
- ss2
- vmess1
tolerance: 150
lazy: true
expected-status: 204 # 当健康检查返回状态码与期望值不符时,认为节点不可用
url: "https://cp.cloudflare.com/generate_204"
interval: 300
fallback 将按照 url 测试结果按照节点顺序选择
- name: "fallback-auto"
type: fallback
proxies:- ss1
- ss2
- vmess1
url: "https://cp.cloudflare.com/generate_204"
interval: 300
load-balance 将按照算法随机选择节点
- name: "load-balance"
type: load-balance
proxies:- ss1
- ss2
- vmess1
url: "https://cp.cloudflare.com/generate_204"
interval: 300
strategy: consistent-hashing # 可选 round-robin 和 sticky-sessions
select 用户自行选择节点
name: Proxy
type: selectdisable-udp: true
proxies:
- ss1
- ss2
- vmess1
- auto
default-selected: ss1 # 默认选择的节点(该项为空或者设置的节点名不存在时,默认选择组中第一个节点)
name: UseProvider
type: select
filter: "HK|TW" # 正则表达式,过滤 provider1 中节点名包含 HK 或 TW
use:- provider1
proxies: - Proxy
- DIRECT
empty-fallback: COMPATIBLE # 设置当组为空时的回退proxy(这里不支持填写代理组,只支持填写proxy名称)
- provider1
Mihomo 格式的节点或支持 *ray 的分享格式
proxy-providers:
provider1:
type: http # http 的 path 可空置,默认储存路径为 homedir 的 proxies 文件夹,文件名为 url 的 md5
url: "url"
interval: 3600
path: ./provider1.yaml # 默认只允许存储在 mihomo 的 Home Dir,如果想存储到其他位置,请通过设置 SAFE_PATHS 环境变量指定额外的安全路径。该环境变量的语法同本操作系统的PATH环境变量解析规则(即Windows下以分号分割,其他系统下以冒号分割)
proxy: DIRECT
# size-limit: 10240 # 限制下载文件最大为10kb,默认为0即不限制文件大小
# #
# # 如果设置会age-secret-key尝试通过此secret解密age armor格式加密的配置文件
# #
# # 注意:
# # 对于加密内容,目前仅支持 age-encryption.org/v1 的 official ASCII "armor" format
# # 对于key格式,目前仅支持 age-encryption.org/v1 的 x25519 recipient type 和 The mlkem768-x25519 hybrid post-quantum recipient type
# # 实用工具:
# # 您可以通过 "mihomo age keygen" 生成符合要求的 x25519 key
# # 您可以通过 "mihomo age keygen-pq" 生成符合要求的 mlkem768-x25519 key
# # 您可以通过 "mihomo age convert
# # 您可以通过 "mihomo age decrypt
# # 您可以通过 "mihomo age encrypt
# # 参考实现:
# # https://github.com/FiloSottile/awesome-age#implementations
# #
# age-secret-key: AGE-SECRET-KEY-1ZTQLLN0A4U3ZTT3DCZKYN0CGZEZQLWX2DFTXUWMT4ZHR0N2UG6LSW9NT0N
header:
User-Agent:
- "Clash/v1.18.0"
- "mihomo/1.18.3"
# Accept:
# - 'application/vnd.github.v3.raw'
# Authorization:
# - 'token 1231231'
# X-Age-Public-Key:
# - 'age1xh86kh9v23vattr58yedspm3f57sxvnswu9krr6ns438amekx5gsd09uma'
health-check:
enable: true
interval: 600
# lazy: true
url: https://cp.cloudflare.com/generate_204
# expected-status: 204 # 当健康检查返回状态码与期望值不符时,认为节点不可用
override: # 覆写节点加载时的一些配置项
skip-cert-verify: true
udp: true
# down: "50 Mbps"
# up: "10 Mbps"
# dialer-proxy: proxy
# interface-name: tailscale0
# routing-mark: 233
# ip-version: ipv4-prefer
# additional-prefix: "[provider1]"
# additional-suffix: "test"
# # 名字替换,支持正则表达式
# proxy-name:
# - pattern: "test"
# target: "TEST"
# - pattern: "IPLC-(.*?)倍"
# target: "iplc x $1"
provider2:
type: inline
dialer-proxy: proxy
payload:
- name: "ss1"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
test:
type: file
path: /test.yaml
health-check:
enable: true
interval: 36000
url: https://cp.cloudflare.com/generate_204
rule-providers:
rule1:
behavior: classical # domain ipcidr
interval: 259200
path: /path/to/save/file.yaml # 默认只允许存储在 mihomo 的 Home Dir,如果想存储到其他位置,请通过设置 SAFE_PATHS 环境变量指定额外的安全路径。该环境变量的语法同本操作系统的PATH环境变量解析规则(即Windows下以分号分割,其他系统下以冒号分割)
type: http # http 的 path 可空置,默认储存路径为 homedir 的 rules 文件夹,文件名为 url 的 md5
url: "url"
proxy: DIRECT
# size-limit: 10240 # 限制下载文件最大为10kb,默认为0即不限制文件大小
rule2:
behavior: classical
interval: 259200
path: /path/to/save/file.yaml
type: file
rule3:
# mrs类型ruleset,目前仅支持domain和ipcidr(即不支持classical),
#
# 对于behavior=domain:
# - format=yaml 可以通过“mihomo convert-ruleset domain yaml XXX.yaml XXX.mrs”转换到mrs格式
# - format=text 可以通过“mihomo convert-ruleset domain text XXX.text XXX.mrs”转换到mrs格式
# - XXX.mrs 可以通过"mihomo convert-ruleset domain mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回yaml格式)
#
# 对于behavior=ipcidr:
# - format=yaml 可以通过“mihomo convert-ruleset ipcidr yaml XXX.yaml XXX.mrs”转换到mrs格式
# - format=text 可以通过“mihomo convert-ruleset ipcidr text XXX.text XXX.mrs”转换到mrs格式
# - XXX.mrs 可以通过"mihomo convert-ruleset ipcidr mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回yaml格式)
#
type: http
url: "url"
format: mrs
behavior: domain
path: /path/to/save/file.mrs
# path-in-bundle: "geo/geosite/cn.mrs" # 当设置该选项时,如果本地文件不存在,会优先从 Home Dir的 BundleMRS.7z 中解压该文件,此项的值用于指定在 BundleMRS.7z 中的路径
rule4:
type: inline
behavior: domain # classical / ipcidr
payload:
- '.blogger.com'
- '..microsoft.com'
- 'books.itunes.apple.com'
rules:
- RULE-SET,rule1,REJECT
- IP-ASN,1,PROXY
- DOMAIN-REGEX,^abc,DIRECT
- DOMAIN-SUFFIX,baidu.com,DIRECT
- DOMAIN-KEYWORD,google,ss1
- DOMAIN-WILDCARD,test.*.mihomo.com,ss1
- IP-CIDR,1.1.1.1/32,ss1
- IP-CIDR6,2409::/64,DIRECT
当满足条件是 TCP 或 UDP 流量时,使用名为 sub-rule-name1 的规则集
- SUB-RULE,(OR,((NETWORK,TCP),(NETWORK,UDP))),sub-rule-name1
- SUB-RULE,(AND,((NETWORK,UDP))),sub-rule-name2
定义多个子规则集,规则将以分叉匹配,使用 SUB-RULE 使用
google.com(not match)--> baidu.com(match)
/ |
/ |
https://baidu.com --> rule1 --> rule2 --> sub-rule-name1(match tcp) 使用 DIRECT
google.com(not match)--> baidu.com(not match)
/ |
/ |
dns 1.1.1.1 --> rule1 --> rule2 --> sub-rule-name1(match udp) sub-rule-name2(match udp)
|
|
使用 REJECT <-- 1.1.1.1/32(match)
sub-rules:
sub-rule-name1:
- DOMAIN,google.com,ss1
- DOMAIN,baidu.com,DIRECT
sub-rule-name2:
- IP-CIDR,1.1.1.1/32,REJECT
- IP-CIDR,8.8.8.8/32,ss1
- DOMAIN,dns.alidns.com,REJECT
流量入站
listeners:
name: socks5-in-1
type: socks
port: 10808 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
#listen: 0.0.0.0 # 默认监听 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理
udp: false # 默认 true
users: # 如果不填写users项,则遵从全局authentication设置,如果填写会忽略全局设置, 如想跳过该入站的验证可填写 users: []
- username: aaa
password: aaa
下面两项如果填写则开启 tls(需要同时填写)
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
name: http-in-1
type: http
port: 10809 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
users: # 如果不填写users项,则遵从全局authentication设置,如果填写会忽略全局设置, 如想跳过该入站的验证可填写 users: []
- username: aaa
password: aaa
下面两项如果填写则开启 tls(需要同时填写)
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
name: mixed-in-1
type: mixed # HTTP(S) 和 SOCKS 代理混合
port: 10810 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
udp: false # 默认 true
users: # 如果不填写users项,则遵从全局authentication设置,如果填写会忽略全局设置, 如想跳过该入站的验证可填写 users: []
- username: aaa
password: aaa
下面两项如果填写则开启 tls(需要同时填写)
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
name: redir-in-1
type: redir
port: 10811 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
name: tproxy-in-1
type: tproxy
port: 10812 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
udp: false # 默认 true
name: shadowsocks-in-1
type: shadowsocks
port: 10813 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
password: vlmpIPSyHH6f4S8WVPdRIHIlzmB+GIRfoH3aNJ/t9Gg=
cipher: 2022-blake3-aes-256-gcmsimple-obfs:
enable: false # 设置为true时开启
mode: http # Available: http, tls
shadow-tls:
enable: false # 设置为true时开启
version: 3 # 支持v1/v2/v3
password: password # v2设置项
users: # v3设置项
- name: 1
password: password
handshake:
dest: test.com:443
kcp-tun:
enable: false
key: it's a secrect # pre-shared secret between client and server
crypt: aes # aes, aes-128, aes-128-gcm, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none, null
mode: fast # profiles: fast3, fast2, fast, normal, manual
conn: 1 # set num of UDP connections to server
autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable
scavengettl: 600 # set how long an expired connection can live (in seconds)
ratelimit: 0 # set maximum outgoing speed (in bytes per second) for a single KCP connection, 0 to disable. Also known as packet pacing
mtu: 1350 # set maximum transmission unit for UDP packets
sndwnd: 128 # set send window size(num of packets)
rcvwnd: 512 # set receive window size(num of packets)
datashard: 10 # set reed-solomon erasure coding - datashard
parityshard: 3 # set reed-solomon erasure coding - parityshard
dscp: 0 # set DSCP(6bit)
nocomp: false # disable compression
acknodelay: false # flush ack immediately when a packet is received
nodelay: 0
interval: 50
resend: 0
sockbuf: 4194304 # per-socket buffer in bytes
smuxver: 1 # specify smux version, available 1,2
smuxbuf: 4194304 # the overall de-mux buffer in bytes
framesize: 8192 # smux max frame size
streambuf: 2097152 # per stream receive buffer in bytes, smux v2+
keepalive: 10 # seconds between heartbeats
name: snell-in-1
type: snell
port: 10815 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
psk: your-password
version: 4 # 仅支持 4/5
udp: true # UDP over TCP tunnel,默认 trueobfs-opts:
mode: http # 可选:http / tls
host: bing.com
shadow-tls:
enable: false # 设置为true时开启
version: 3 # 支持v1/v2/v3
password: password # v2设置项
users: # v3设置项
- name: 1
password: password
handshake:
dest: test.com:443
rule: sub-rule-name1
proxy: proxy
name: vmess-in-1
type: vmess
port: 10814 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
users:
- username: 1
uuid: 9d0cb9d0-964f-4ef6-897d-6c6b3ccf9e68
alterId: 1
ws-path: "/" # 如果不为空则开启 websocket 传输层
grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层
下面两项如果填写则开启 tls(需要同时填写)
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
如果填写reality-config则开启reality(注意不可与certificate和private-key同时填写)
reality-config:
dest: test.com:443
private-key: jNXHt1yRo0vDuchQlIP6Z0ZvjT3KtzVI-T4E7RoLJS0 # 可由 mihomo generate reality-keypair 命令生成
short-id:
- 0123456789abcdef
server-names:
- test.com
#下列两个 limit 为选填,可对未通过验证的回落连接限速,bytesPerSec 默认为 0 即不启用
#回落限速是一种特征,不建议启用,如果您是面板/一键脚本开发者,务必让这些参数随机化
limit-fallback-upload:
after-bytes: 0 # 传输指定字节后开始限速
bytes-per-sec: 0 # 基准速率(字节/秒)
burst-bytes-per-sec: 0 # 突发速率(字节/秒),大于 bytesPerSec 时生效
limit-fallback-download:
after-bytes: 0 # 传输指定字节后开始限速
bytes-per-sec: 0 # 基准速率(字节/秒)
burst-bytes-per-sec: 0 # 突发速率(字节/秒),大于 bytesPerSec 时生效
- username: 1
name: tuic-in-1
type: tuic
port: 10815 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
token: # tuicV4 填写(可以同时填写 users)
- TOKEN
users: # tuicV5 填写(可以同时填写 token)
00000000-0000-0000-0000-000000000000: PASSWORD_0
00000000-0000-0000-0000-000000000001: PASSWORD_1
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
congestion-controller: bbr
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
max-idle-time: 15000
authentication-timeout: 1000
alpn:
- h3
max-udp-relay-packet-size: 1500
name: tunnel-in-1
type: tunnel
port: 10816 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
network: [tcp, udp]
target: target.comname: vless-in-1
type: vless
port: 10817 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
users:
- username: 1
uuid: 9d0cb9d0-964f-4ef6-897d-6c6b3ccf9e68
flow: xtls-rprx-vision
ws-path: "/" # 如果不为空则开启 websocket 传输层
grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层
xhttp-config: # 如果不为空则开启 xhttp 传输层
path: "/"
host: ""
mode: auto # Available: "stream-one", "stream-up" or "packet-up"
no-sse-header: false
x-padding-bytes: "100-1000"
x-padding-obfs-mode: false
x-padding-key: x_padding
x-padding-header: Referer
x-padding-placement: queryInHeader # Available: queryInHeader, cookie, header, query
x-padding-method: repeat-x # Available: repeat-x, tokenish
uplink-http-method: POST # Available: POST, PUT, PATCH, DELETE
session-placement: path # Available: path, query, cookie, header
session-key: ""
session-table: "" # Available: "", "uuid", "ALPHABET", "Alphabet", "BASE36", "Base62", "HEX", "alphabet", "base36", "hex", "number"
session-length: "16-32" # 起始值不可为 0,总的 id 空间必须大于 21 亿,仅当session-table不为空或uuid时生效
seq-placement: path # Available: path, query, cookie, header
seq-key: ""
uplink-data-placement: body # Available: body, cookie, header
uplink-data-key: ""
uplink-chunk-size: 0 # only applicable when uplink-data-placement is not body
sc-max-buffered-posts: 30
sc-stream-up-server-secs: "20-80"
sc-max-each-post-bytes: 1000000
-------------------------
vless encryption服务端配置:
(原生外观 / 只 XOR 公钥 / 全随机数。1-RTT 每次下发随机 300 到 600 秒的 ticket 以便 0-RTT 复用 / 只允许 1-RTT)
填写 "600s" 会每次随机取 50% 到 100%,即相当于填写 "300-600s"
/ 是只能选一个,后面 base64 至少一个,无限串联,使用 mihomo generate vless-x25519 和 mihomo generate vless-mlkem768 生成,替换值时需去掉括号
Padding 是可选的参数,仅作用于 1-RTT 以消除握手的长度特征,双端默认值均为 "100-111-1111.75-0-111.50-0-3333":
在 1-RTT client/server hello 后以 100% 的概率粘上随机 111 到 1111 字节的 padding
以 75% 的概率等待随机 0 到 111 毫秒("probability-from-to")
再次以 50% 的概率发送随机 0 到 3333 字节的 padding(若为 0 则不 Write())
服务端、客户端可以设置不同的 padding 参数,按 len、gap 的顺序无限串联,第一个 padding 需概率 100%、至少 35 字节
-------------------------
decryption: "mlkem768x25519plus.native/xorpub/random.600s(300-600s)/0s.(padding len).(padding gap).(X25519 PrivateKey).(ML-KEM-768 Seed)..."
下面两项如果填写则开启 tls(需要同时填写)
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
如果填写reality-config则开启reality(注意不可与certificate和private-key同时填写)
reality-config:
dest: test.com:443
private-key: jNXHt1yRo0vDuchQlIP6Z0ZvjT3KtzVI-T4E7RoLJS0 # 可由 mihomo generate reality-keypair 命令生成
short-id:
- 0123456789abcdef
server-names:
- test.com
#下列两个 limit 为选填,可对未通过验证的回落连接限速,bytesPerSec 默认为 0 即不启用
#回落限速是一种特征,不建议启用,如果您是面板/一键脚本开发者,务必让这些参数随机化
limit-fallback-upload:
after-bytes: 0 # 传输指定字节后开始限速
bytes-per-sec: 0 # 基准速率(字节/秒)
burst-bytes-per-sec: 0 # 突发速率(字节/秒),大于 bytesPerSec 时生效
limit-fallback-download:
after-bytes: 0 # 传输指定字节后开始限速
bytes-per-sec: 0 # 基准速率(字节/秒)
burst-bytes-per-sec: 0 # 突发速率(字节/秒),大于 bytesPerSec 时生效注意,对于vless listener, 如果 "allow-insecure" 不为 true, 至少需要填写 “certificate和private-key” 或 “reality-config” 或 “decryption” 的其中一项
allow-insecure: false # 是否允许不开启tls加密(注意:仅用于有 nginx, caddy 前置的情况)
- username: 1
name: anytls-in-1
type: anytls
port: 10818 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
users:
username1: password1
username2: password2"certificate" and "private-key" are required
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
注意,anytls listener, 如果 "allow-insecure" 不为 true, 必须填写 “certificate和private-key”
allow-insecure: false # 是否允许不开启tls加密(注意:仅用于有 nginx, caddy 前置的情况)
padding-scheme: "" # https://github.com/anytls/anytls-go/blob/main/docs/protocol.md#cmdupdatepaddingscheme
name: mieru-in-1
type: mieru
port: 10818 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
transport: TCP # 支持 TCP 或者 UDP
users:
username1: password1
username2: password2一个 base64 字符串用于微调网络行为
traffic-pattern: ""
如果开启,且客户端不发送用户提示,代理服务器将拒绝连接
user-hint-is-mandatory: false
name: sudoku-in-1
type: sudoku
port: 8443 # 仅支持单端口
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
key: "
" # 如果你使用sudoku生成的ED25519密钥对,此处是密钥对中的公钥,当然,你也可以仅仅使用任意uuid充当key
aead-method: chacha20-poly1305 # 可选:chacha20-poly1305、aes-128-gcm、none(不建议;none 不提供 AEAD 保护)
padding-min: 1 # 最小填充率(0-100)
padding-max: 15 # 最大填充率(0-100,必须 >= padding-min)
table-type: prefer_ascii # 可选值:prefer_ascii、prefer_entropy、up_ascii_down_entropy、up_entropy_down_asciicustom-table: xpxvvpvv # 可选,自定义字节布局,必须包含2个x、2个p、4个v,可随意组合;只对 entropy 方向生效
custom-tables: ["xpxvvpvv", "vxpvxvvp"] # 可选,自定义字节布局列表(x/v/p),用于多表轮换;非空时覆盖 custom-table
handshake-timeout: 5 # 可选(秒)
enable-pure-downlink: false # 可选:false=带宽优化下行;true=纯 Sudoku 下行推荐:使用 httpmask 对象统一管理 HTTPMask 相关字段:
httpmask:
disable: false # true 禁用所有 HTTP 伪装/隧道
mode: legacy # 可选:legacy(默认)、stream(split-stream)、poll、auto(先 stream 再 poll)、ws(WebSocket 隧道)path-root: "" # 可选:HTTP 隧道端点一级路径前缀(双方需一致),例如 "aabbcc" 或 "/aabbcc/" => /aabbcc/session、/aabbcc/stream、/aabbcc/api/v1/upload、/aabbcc/ws
fallback: "127.0.0.1:80" # 可选:用于可连接请求的回落转发,可与其他服务共端口
name: trojan-in-1
type: trojan
port: 10819 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
users:
- username: 1
password: 9d0cb9d0-964f-4ef6-897d-6c6b3ccf9e68
ws-path: "/" # 如果不为空则开启 websocket 传输层
grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层
下面两项如果填写则开启 tls(需要同时填写)
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
如果填写reality-config则开启reality(注意不可与certificate和private-key同时填写)
reality-config:
dest: test.com:443
private-key: jNXHt1yRo0vDuchQlIP6Z0ZvjT3KtzVI-T4E7RoLJS0 # 可由 mihomo generate reality-keypair 命令生成
short-id:
- 0123456789abcdef
server-names:
- test.com
#下列两个 limit 为选填,可对未通过验证的回落连接限速,bytesPerSec 默认为 0 即不启用
#回落限速是一种特征,不建议启用,如果您是面板/一键脚本开发者,务必让这些参数随机化
limit-fallback-upload:
after-bytes: 0 # 传输指定字节后开始限速
bytes-per-sec: 0 # 基准速率(字节/秒)
burst-bytes-per-sec: 0 # 突发速率(字节/秒),大于 bytesPerSec 时生效
limit-fallback-download:
after-bytes: 0 # 传输指定字节后开始限速
bytes-per-sec: 0 # 基准速率(字节/秒)
burst-bytes-per-sec: 0 # 突发速率(字节/秒),大于 bytesPerSec 时生效
ss-option: # like trojan-go's `shadowsocks` config
enabled: false
method: aes-128-gcm # aes-128-gcm/aes-256-gcm/chacha20-ietf-poly1305
password: "example"
注意,对于trojan listener, 如果 "allow-insecure" 不为 true, 至少需要填写 “certificate和private-key” 或 “reality-config” 或 “ss-option” 的其中一项
allow-insecure: false # 是否允许不开启tls加密(注意:仅用于有 nginx, caddy 前置的情况)
- username: 1
name: hysteria2-in-1
type: hysteria2
port: 10820 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
users:
00000000-0000-0000-0000-000000000000: PASSWORD_0
00000000-0000-0000-0000-000000000001: PASSWORD_1certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
up 和 down 均不写或为 0 则使用 BBR 流控
up: "30 Mbps" # 若不写单位,默认为 Mbps
down: "200 Mbps" # 若不写单位,默认为 Mbps
obfs: salamander # 默认为空,如果填写则开启 obfs,目前支持 salamander 和 gecko
obfs-password: yourpassword
obfs-min-packet-size: 512 # 最小线上数据包大小(字节)。仅限 Gecko。
obfs-max-packet-size: 1200 # 最大线上数据包大小(字节)。仅限 Gecko。
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
max-idle-time: 15000
alpn:
- h3
ignore-client-bandwidth: false
HTTP3 服务器认证失败时的行为 (URL 字符串配置),如果 masquerade 未配置,则返回 404 页
masquerade: file:///var/www # 作为文件服务器
masquerade: http://127.0.0.1:8080 #作为反向代理
masquerade: https://127.0.0.1:8080 #作为反向代理
realm-opts:
enable: true # 必须手动开启
server-url: https://realm.hy2.io
token: public
realm-id: my-cabin-1f3a8c2e9b
stun-servers:
- stun.nextcloud.com:3478
- stun.sip.us:3478
- global.stun.twilio.com:3478
# proxy: DIRECT # 设置server-url通过哪个代理进行连接
# 下面支持填写针对server-url的TLS配置(sni, skip-cert-verify, fingerprint, certificate, private-key, alpn)
# skip-cert-verify: false
# ......
注意,这是用于自建hysteria2入站和出站中realm-opts中server-url的HTTP/HTTPS服务器,请勿混淆
name: hysteria2-realm-in-1
type: hysteria2-realm
port: 10820 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
token: public # hysteria2入站和出站通过
Authorization: Bearer <token>出示的 Bearer 令牌。
max-realms: 65536 # maximum total realms (0 = unlimited)
max-realms-per-ip: 4 # maximum realms per client IP (0 = unlimited)
trusted-proxy-header: "" # header to read real client IP from (e.g. X-Forwarded-For)
realm-name-pattern: "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$" # regex realm names must match# 下面内容如果配置, realm 将通过 TLS 提供 HTTPS 服务;否则提供明文 HTTP
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
alpn: ["h2", "http/1.1"]
name: trusttunnel-in-1
type: trusttunnel
port: 10821 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
listen: 0.0.0.0routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)
rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
users:
- username: 1
password: 9d0cb9d0-964f-4ef6-897d-6c6b3ccf9e68
certificate: ./server.crt # 证书 PEM 格式,或者 证书的路径
private-key: ./server.key # 证书对应的私钥 PEM 格式,或者私钥路径
network: ["tcp", "udp"] # http2+http3
congestion-controller: bbr
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
下面两项为mTLS配置项,如果client-auth-type设置为 "verify-if-given" 或 "require-and-verify" 则client-auth-cert必须不为空
client-auth-type: "" # 可选值:""、"request"、"require-any"、"verify-if-given"、"require-and-verify"
client-auth-cert: string # 证书 PEM 格式,或者 证书的路径
如果填写则开启ech(可由 mihomo generate ech-keypair <明文域名> 生成)
ech-key: |
-----BEGIN ECH KEYS-----
ACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK
madSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz
dC5jb20AAA==
-----END ECH KEYS-----
- username: 1
注意,listeners中的tun仅提供给高级用户使用,普通用户应使用顶层配置中的tun
name: tun-in-1
type: tunrule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules
proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)
stack: system # gvisor / mixed / mips
dns-hijack:- 0.0.0.0:53 # 需要劫持的 DNS
auto-detect-interface: false # 自动识别出口网卡
auto-route: false # 配置路由表
mtu: 9000 # 最大传输单元
inet4-address: # 必须手动设置 ipv4 地址段
- 198.19.0.1/30
inet6-address: # 必须手动设置 ipv6 地址段 - "fdfe:dcba:9877::1/126"
strict-route: true # 将所有连接路由到 tun 来防止泄漏,但你的设备将无法其他设备被访问
inet4-route-address: # 启用 auto-route 时使用自定义路由而不是默认路由
- 0.0.0.0/1
- 128.0.0.0/1
inet6-route-address: # 启用 auto-route 时使用自定义路由而不是默认路由
- "::/1"
- "8000::/1"
endpoint-independent-nat: false # 启用独立于端点的 NAT
include-uid: # UID 规则仅在 Linux 下被支持,并且需要 auto-route
- 0
include-uid-range: # 限制被路由的的用户范围
- 1000:99999
exclude-uid: # 排除路由的的用户
- 1000
exclude-uid-range: # 排除路由的的用户范围
- 1000:99999
include-mac-address:
- 00:11:22:33:44:55
exclude-mac-address:
- 00:11:22:33:44:55
Android 用户和应用规则仅在 Android 下被支持
并且需要 auto-route
include-android-user: # 限制被路由的 Android 用户
- 0
- 10
include-package: # 限制被路由的 Android 应用包名
- com.android.chrome
exclude-package: # 排除被路由的 Android 应用包名
- com.android.captiveportallogin
disable-icmp-forwarding: true # 禁用 ICMP 转发,防止某些情况下的 ICMP 环回问题,ping 将不会显示真实的延迟
入口配置与 Listener 等价,传入流量将和 socks,mixed 等入口一样按照 mode 所指定的方式进行匹配处理
shadowsocks,vmess 入口配置(传入流量将和 socks,mixed 等入口一样按照 mode 所指定的方式进行匹配处理)
ss-config: ss://2022-blake3-aes-256-gcm:vlmpIPSyHH6f4S8WVPdRIHIlzmB+GIRfoH3aNJ/t9Gg=@:23456
vmess-config: vmess://1:9d0cb9d0-964f-4ef6-897d-6c6b3ccf9e68@:12345
tuic 服务器入口(传入流量将和 socks,mixed 等入口一样按照 mode 所指定的方式进行匹配处理)
tuic-server:
enable: true
listen: 127.0.0.1:10443
token: # tuicV4 填写(可以同时填写 users)
- TOKEN
users: # tuicV5 填写(可以同时填写 token)
00000000-0000-0000-0000-000000000000: PASSWORD_0
00000000-0000-0000-0000-000000000001: PASSWORD_1
certificate: ./server.crt
private-key: ./server.key
congestion-controller: bbr
bbr-profile: "" # Available: "standard", "conservative", "aggressive". Default: "standard"
max-idle-time: 15000
authentication-timeout: 1000
alpn:
- h3
max-udp-relay-packet-size: 1500
File: luci-app-openclash/root/usr/share/rpcd/acl.d/luci-app-openclash.json
{
"luci-app-openclash": {
"description": "Grant UCI access for luci-app-openclash",
"read": {
"uci": [ "openclash" ]
},
"write": {
"uci": [ "openclash" ]
}
}
}
File: luci-app-openclash/root/usr/share/ucitrack/luci-app-openclash.json
{
"config": "openclash",
"init": "openclash"
}
File: luci-app-openclash/tools/codemirror/package.json
{
"name": "openclash-codemirror6",
"private": true,
"type": "module",
"_comment": "@codemirror/* packages are pinned to ~2025-11 versions (pre-tile-system) to avoid @codemirror/view TilePointer.advance() crash in merge view. DO NOT upgrade @codemirror/* unless the upstream tile.ts bug is confirmed fixed.",
"dependencies": {
"codemirror": "6.0.2",
"@codemirror/view": "6.38.8",
"@codemirror/state": "6.5.0",
"@codemirror/language": "6.11.2",
"@codemirror/commands": "6.8.0",
"@codemirror/search": "6.5.8",
"@codemirror/lint": "6.8.4",
"@codemirror/lang-yaml": "6.1.2",
"@codemirror/lang-markdown": "6.3.2",
"@codemirror/merge": "6.8.0",
"@codemirror/legacy-modes": "6.4.3",
"@codemirror/autocomplete": "6.18.6",
"@lezer/common": "1.2.3",
"@lezer/highlight": "1.2.1",
"@lezer/lr": "1.4.2",
"@fsegurai/codemirror-theme-bundle": "6.4.2",
"@babel/runtime": "8.0.0",
"js-yaml": "5.4.1",
"marked": "18.0.5",
"highlight.js": "11.11.1",
"esbuild": "0.28.1",
"lightningcss-cli": "1.32.0"
}
}
File: .github/FUNDING.yml
These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: vernesong
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
File: .github/ISSUE_TEMPLATE/bug_report.yml
name: Bug报告
title: "[Bug] "
labels: ["bug"]
body:
type: checkboxes
id: verify_step
attributes:
label: Verify Steps
在提交之前,请确认 / Please verify that you've followed these steps.
options:
- label: Tracker 我已经在 Issue Tracker 中找过我要提出的问题
required: true
- label: Branch 我知道 OpenClash 的 Dev 分支切换开关位于插件设置-版本更新中,或者我会手动下载并安装 Dev 分支的 OpenClash
required: true
- label: Latest 我已经使用最新 Dev 版本测试过,问题依旧存在
required: true
- label: Relevant 我知道 OpenClash 与 内核(Core)、控制面板(Dashboard)、在线订阅转换(Subconverter)等项目之间无直接关系,仅相互调用
required: true
- label: Definite 这确实是 OpenClash 出现的问题
required: true
- label: Contributors 我有能力协助 OpenClash 开发并解决此问题
required: false
- label: Meaningless 我提交的是无意义的催促更新或修复请求
required: falsetype: input
id: openclash_version
attributes:
label: OpenClash Version
OpenClash 版本号
placeholder: "v0.0.0-beta"
validations:
required: truetype: dropdown
id: bug_os
attributes:
label: Bug on Environment
发现问题所在的系统环境 / System Environment
multiple: true
options:
- Official OpenWrt
- Lean
- Immortalwrt
- Istoreos
- Docker
- Other
validations:
required: truetype: input
id: openwrt_version
attributes:
label: OpenWrt Version
Openwrt 固件版本
placeholder: "OpenWrt 0.0.0 r0-0"
validations:
required: truetype: dropdown
id: bug_platform
attributes:
label: Bug on Platform
发现问题所在的架构平台 / Platform
multiple: true
options:
- Linux-386
- Linux-amd64(x86-64)
- Linux-amd64-v3(x86-64)
- Linux-armv5
- Linux-armv6
- Linux-armv7
- Linux-arm64
- Linux-loong64
- Linux-mips-hardfloat
- Linux-mips-softfloat
- Linux-mips64
- Linux-mips64le
- Linux-mipsle-hardfloat
- Linux-mipsle-softfloat
- Linux-riscv64
- Other
- All
validations:
required: truetype: textarea
id: describe_bug
attributes:
label: Describe the Bug
对 Bug 本身清晰而简洁的描述 / Describe the Bug
validations:
required: truetype: textarea
id: reproduce_bug
attributes:
label: To Reproduce
复现此 Bug 的步骤 / How to reproduce?
validations:
required: truetype: textarea
id: openclash_log
attributes:
label: OpenClash Log
在下方附上 OpenClash 调试日志 / OpenClash Debug Log
调试日志在插件设置-调试日志中生成,并非只有运行日志,如调试日志过长,可作为附件在最下方上传
隐私提示: 上传此日志前请注意检查、屏蔽公网IP、节点、密码等相关敏感信息
placeholder: "我已知晓缺失日志可能会导致开发者无法了解我的情况并降低本issue的处理优先级"
render: log
validations:
required: truetype: textarea
id: openclash_config
attributes:
label: OpenClash Config
在下方附上与 Bug 相关的系统配置、防火墙规则或环境变量 / System config
非 Clash Yaml 文件
非必填项
render: shell
validations:
required: falsetype: textarea
id: excepted_behavior
attributes:
label: Expected Behavior
对预期修复后情况的清晰明了的描述 / Expected behavior
validations:
required: truetype: textarea
id: additional_context
attributes:
label: Additional Context
在此处添加其它信息或屏幕截图 / Additional Context
validations:
required: false
File: .github/ISSUE_TEMPLATE/config.yml
[Binary file]
File: .github/ISSUE_TEMPLATE/feature_request.yml
name: 功能请求
title: "[Feature] "
labels: [enhancement]
body:
type: checkboxes
id: verify_step
attributes:
label: Verify Steps
options:
- label: Tracker 我已经在 Issue Tracker 中找过我要提出的问题
required: true
- label: Latest 我已经使用最新 Dev 版本查看过,并不包含该功能特性或者还不完善
required: true
- label: Relevant 我知道 OpenClash 与 内核(Core)、控制面板(Dashboard)、在线订阅转换(Subconverter)等项目之间无直接关系,仅相互调用
required: true
- label: Definite 这确实是 OpenClash 应包含的特性
required: true
- label: Contributors 我有能力协助 OpenClash 开发或完善此功能特性
required: false
- label: Meaningless 我提交的是无意义的催促更新或修复请求
required: falsetype: textarea
attributes:
label: Describe the Feature
清晰明了地描述您的想法. 例如你想实现什么 Feature 特性或功能? 如何实现该功能? 目前 OpenClash 的行为是什么?
validations:
required: truetype: textarea
attributes:
label: Describe Alternatives
对您考虑过的任何替代解决方案或备选功能进行清晰、简洁的描述.
validations:
required: false
File: .github/skills/openclash-user-guide/01-architecture.md
[Binary file]
File: .github/skills/openclash-user-guide/02-dependencies.md
[Binary file]
File: .github/skills/openclash-user-guide/03-errors.md
[Binary file]
File: .github/skills/openclash-user-guide/04-firewall-chains.md
[Binary file]
File: .github/skills/openclash-user-guide/05-firewall-special.md
ICMP/Ping 处理与高级流量控制
用途: ICMP/Ping 在各运行模式下的处理机制,以及按设备/协议/端口/DSCP 的高级流量控制(§5.1–5.2)。
5.1 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 虚拟网卡:
# Step 1: 标记 ICMP
nft add rule inet fw4 openclash_mangle ip protocol icmp \
icmp type echo-request mark set "$PROXY_FWMARK" counter accept
# Step 2: 策略路由(系统层面)— 所有标记 0x162 的流量路由到 TUN
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:
# INPUT 链 — 阻止路由器自身收到发往 Fake-IP 的 ping
nft insert rule inet fw4 input position 0 ip protocol icmp \
icmp type echo-request ip daddr { 198.18.0.0/16 } counter reject
# FORWARD 链 — 阻止局域网设备间转发 Fake-IP 的 ping
nft insert rule inet fw4 forward position 0 ip protocol icmp \
icmp type echo-request ip daddr { 198.18.0.0/16 } counter reject
# OUTPUT 链 — 阻止路由器发出对 Fake-IP 的 ping(排除 OpenClash 自身进程 skgid=65534)
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 虚假延迟),不产生实际网络流量。
4. IPv6 ICMP(ICMPv6):
仅在 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 acceptIPv6 非 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() 处理(伪造回复)。
一句话说明:普通模式下 ping 不会进隧道、不被代理;TUN/混合模式下 ping 会进隧道,但 Fake-IP ping 到的是本地虚假延迟,不代表真能访问:
| 运行模式 | 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 处理机制(github.com/metacubex/mihomo/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 流量(经代理转发)的行为不同。
5.2 高级流量控制 (`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 规则。
UCI 配置字段:
| 字段 | 类型 | 可选值 | 说明 |
|---|---|---|---|
enabled |
bool | 0/1 |
是否启用此规则 |
src_ip |
string | IP/CIDR 或 localnetwork |
源 IP 地址(localnetwork 表示匹配所有本地网络设备) |
src_port |
string | 端口范围 (如 0-65535) |
源端口范围 |
proto |
string | tcp/udp/both |
匹配的协议 |
target |
string | return/accept/drop |
动作:return=跳过代理(默认)/accept=放行/drop=丢弃(等效return) |
dscp |
string | DSCP 值 (如 46) |
DSCP 标记匹配(需 iptables DSCP 模块,fw4 无需额外模块) |
family |
string | ipv4/ipv6/both |
IP 协议族 |
interface |
string | 接口名 (如 br-lan) |
入接口匹配 |
user |
string | UID | 按用户 ID 匹配(仅 OUTPUT 链) |
comment |
string | 描述文字 | 规则注释/标识 |
规则插入位置 (fw4):
每条规则根据协议和模式被插入到以下链的最前面:
| 流量方向 | IPv4 TCP 链 | IPv4 UDP 链 | IPv6 TCP 链 | IPv6 UDP 链 |
|---|---|---|---|---|
| 入站 (LAN→路由器) | openclash (非TUN) / openclash_mangle (TUN) |
openclash_mangle |
openclash_v6 / openclash_mangle_v6 |
openclash_mangle_v6 |
| 出站 (路由器自身) | openclash_output (非TUN) / openclash_mangle_output (TUN) |
openclash_mangle_output |
openclash_output_v6 / openclash_mangle_output_v6 |
openclash_mangle_output_v6 |
| 旁路由 SNAT | openclash_post |
openclash_post |
openclash_post_v6 |
openclash_post_v6 |
规则格式示例 (fw4 nftables):
# 入站规则: 跳过代理
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"
# OUTPUT 规则: 含 user 匹配
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 规则。
File: .github/skills/openclash-user-guide/06-firewall-options-dnsmasq.md
防火墙选项影响、fw3 等效链与 Dnsmasq 修改
用途: 各选项对防火墙规则的影响速查表、fw3 等效链与 Dnsmasq 劫持实现(§6.1–6.3)。
AI 行为指引: 当用户询问「改哪个 UCI 选项会生成什么防火墙规则」「fw3 与 fw4 后端差异」「DNS 劫持的 dnsmasq 实现」时,AI 应结合本文件(§6.2 选项→规则映射、§6.3 Dnsmasq)与
04-firewall-chains.md(§4.2 链结构)回答,说明选项如何影响set_firewall()生成的规则链,而非仅给出选项说明。涉及实现细节时查阅 OpenClash 源码 中init.d/openclash的set_firewall()与change_dnsmasq()函数。
6.1 fw3 (iptables/ipset) 等效链
| iptables 链 | 表 | 等效 nftables 链 |
|---|---|---|
openclash |
nat |
inet fw4 openclash (TCP) |
openclash |
mangle |
inet fw4 openclash_mangle (UDP) |
openclash_output |
nat |
inet fw4 openclash_output (TCP) |
openclash_output |
mangle |
inet fw4 openclash_mangle_output (UDP) |
openclash_post |
nat |
inet fw4 openclash_post |
openclash_wan_input |
filter |
inet fw4 openclash_wan_input |
openclash_dns_redirect |
nat |
inet fw4 openclash_dns_redirect |
openclash_upnp |
mangle |
inet fw4 openclash_upnp |
fw3 兼容性层 — 自动检测 iptables 是否支持 owner/gid 模块:
if iptables 不支持 owner 模块; then
owner="-m mark --mark 0x1a0a" # 回退: 按 fwmark 匹配
noowner="-m mark ! --mark 0x1a0a"
else
owner="-m owner --gid-owner 65534" # 标准: owner 模块
noowner="-m owner ! --gid-owner 65534"
fi示例 fw3 REDIRECT (TCP):
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示例 fw3 TPROXY (UDP):
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 openclash6.2 各选项对防火墙规则的具体影响
| 选项 | 值 | 防火墙规则变化 |
|---|---|---|
china_ip_route (实验性:绕过指定区域 IP / China IP Route) |
0 (关闭,默认) |
不生成绕行规则 |
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) |
0 (关闭,默认) |
不生成绕行规则 |
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) |
1 |
IPv4: 创建 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) |
1 |
IPv4: 创建 openclash_post 链(从 srcnat/POSTROUTING jump)。规则顺序: skgid == 65534 return(跳过内核自身)→ mark 0x162 accept(已标记的代理流量不做 SNAT)→ ip daddr @localnetwork return(内网目标不 NAT)→ ct direction reply return(回程方向不 NAT)→ fib saddr type != local masquerade(只对“源地址非本机”的转发流量做 SNAT)。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) |
1 |
IPv4+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)。详见 05-firewall-special.md §5.1 |
| 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。详见 05-firewall-special.md §5.2 |
旁路由模式下的回程与「IP 动态伪装」(
bypass_gateway_compatible默认 0)
- 被代理的流量由旁路由本机发起连接(源 = 旁路由在上游子网内的地址),上游天然能回程,因此与 SNAT 无关。
- 绕过代理的流量(「绕过大陆」
china_ip_route、黑白名单、common_ports、非代理端口等)在openclash/openclash_mangle链中 RETURN 后按普通路由转发,源 IP 仍是客户端地址;只有上游能把回包送达该客户端网段时才能通。客户端网段不被上游所知(客户端挂在旁路由自己的 LAN/WLAN)或上游有 ARP 绑定、客户端隔离、防二级路由时,回包被丢弃 → 症状是走代理的站点正常、国内直连站点一直转圈。- 两种修法:① 插件设置 → 模式设置 →「旁路网关兼容 (
bypass_gateway_compatible)」= IPv4+IPv6 双栈开关,只 SNAT 源地址非本机的转发流量(不影响代理流量、内网目标与回程方向;IPv6 部分随ipv6_enable=1创建);② 防火墙对应区域的「IP 动态伪装」——masq只覆盖 IPv4、masq6只覆盖 IPv6(只想修一侧时用②对应当前族别)。- 性能:SNAT 只在每条流的首包生效(建立 conntrack + 改写源地址),转发 + NAT ≈ 线路速率,不是性能瓶颈(同链路下的转发/代理数据面开销对比见 08 号文档 §8.2.13)。要省开销应改代理模式或开
gso,而不是关掉伪装。- 想彻底不做 NAT:上游设备加静态路由(客户端网段 → 旁路由),或让客户端与出口处于同一子网(扁平组网,回程由上游 ARP 直达)。
IPv6 的同一问题(旁路由)
- IPv6 没有默认 NAT:区域的「IP 动态伪装」只覆盖 IPv4,IPv6 要
firewall.@zone[].masq6='1';插件侧的bypass_gateway_compatible=1会创建openclash_post_v6(规则逻辑同 IPv4:已标记流量跳过 → 内网目标跳过 → 回程跳过 →fib saddr type != localmasquerade),默认 0(关闭),两种方式任选其一。- 是否需要 SNAT 取决于客户端用的前缀:地址来自上游可路由前缀(与主路由同 on-link,通常是 ISP 下发的 /64)时,回程由主路由直接二层送达客户端 ⇒ 不需要 NAT66;地址来自旁路由自己宣告/下发的私有前缀(ULA
fd**::/8、旁路由 DHCPv6 分配的地址)时上游无法回程 ⇒ 必须 NAT66。判定一条命令即可:客户端上ip -6 route get <国内 IPv6 目标>看src是否为上游前缀。- RA 卫生(IPv6 独有):同一二层网段里只应有一个 RA 源。旁路由、以及其它自建路由器如果都发 RA,客户端会随机选默认网关与前缀,表现为「IPv6 时通时断 / 有时绕过代理」。旁路由正确姿势:不抢主路由的前缀 —— 用
dhcp.lan.ra='relay'、dhcp.lan.dhcpv6='relay'(或直接关闭自身 RA/DHCPv6);只保留主路由宣告 ISP 前缀。- 症状辨识:IPv4 正常、部分 IPv6 站点(国内大站多为双栈)打不开或加载极慢,优先怀疑本节;反过来若让旁路由当 IPv6 网关且要代理 IPv6,则需要
ipv6_enable=1+china_ip6_route旁路(chnr6_custom_url)。客户端侧的具体做法(三种方式对比与 Windows/Linux 命令)见 09 号文档 §9.5.1。
6.3 Dnsmasq 修改详解 (`change_dnsmasq` / `revert_dnsmasq`)
修改流程 (change_dnsmasq(), 仅在 enable_redirect_dns=1 时执行):
# 1. 备份原始配置到 openclash.config.*
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)"
# 2. 重定向 DNS
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
# 3. IPv6 DNS (ipv6_dns=1 时)
uci set dhcp.@dnsmasq[0].filter_aaaa=0 # 允许 AAAA 记录
# 4. chnroute_pass 处理 — 加载 ipset/nftset
load_ip_route_pass()
# 创建 china_ip_route_pass ipset/nftset
# 将 openclash_custom_chnroute_pass.list 中的域名加入 set
# 对 china_ip_route_pass UCI 列表中的域名加入 set
# 5. 自定义域名 DNS
/usr/share/openclash/openclash_custom_domain_dns.sh
# 6. 重启 dnsmasq
/etc/init.d/dnsmasq restart恢复流程 (revert_dnsmasq()):
# 1. 删除 OpenClash 注入的 server
uci del dhcp.@dnsmasq[-1].server
# 2. 恢复原始 server 列表
for server in $(uci get openclash.config.dnsmasq_server); do
uci add_list dhcp.@dnsmasq[0].server="$server"
done
# 3. 恢复 resolvfile / noresolv / cachesize / filter_aaaa
uci set dhcp.@dnsmasq[0].noresolv="$saved_noresolv"
uci set dhcp.@dnsmasq[0].resolvfile="$saved_resolvfile"
uci set dhcp.@dnsmasq[0].cachesize="$saved_cachesize"
# 4. DNS 验证 — 测试修改后的 DNS 是否可用
if nslookup www.apple.com 127.0.0.1:<dnsmasq_port> 失败; then
# 创建 fallback resolv.conf (114.114.114.114, 8.8.8.8)
fichnroute_pass 的 dnsmasq 集成:
- 创建
china_ip_route_passipset/nftset - 将 chnroute_pass 域名加入 set:
ipset=/domain.com/china_ip_route_pass或nftset=/domain.com/4#inet#fw4#china_ip_route_pass - 效果: DNS 解析这些域名时加入 set 便于在匹配时绕过(而非被 chnroute 影响)
6.4 Dnsmasq 重绑定保护(`rebind_protection`)的影响
rebind_protection 是系统 dnsmasq 的开关(dhcp.@dnsmasq[0],作用是阻断 DNS 重绑定攻击),插件不读写它。开启时 dnsmasq 丢弃上游应答里指向保留地址的记录;而 Mihomo 的 hosts(「覆写设置 → DNS → Hosts」)与 Fake-IP 的 IPv6 池返回的正是这类地址 ⇒ 相关域名在客户端侧解析不到地址。
选项 → dnsmasq 参数(/etc/init.d/dnsmasq)
| UCI 选项 | 默认 | dnsmasq 参数 | 作用 |
|---|---|---|---|
rebind_protection |
1 |
--stop-dns-rebind |
丢弃上游应答中的保留地址 |
rebind_localhost |
视固件为 1 或未设置(未设置等于 0) |
--rebind-localhost-ok |
额外放行 127.0.0.1 / ::1 应答 |
rebind_domain(列表) |
空 | --rebind-domain-ok=<域名> |
白名单,整个域名放行 |
被丢弃的地址范围(dnsmasq 2.93)
| 类别 | 地址 | 处理 |
|---|---|---|
| IPv4 私网、链路本地 | 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16 |
丢弃 |
| IPv4 文档 / 测试网段 | 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24、255.255.255.255 |
丢弃 |
| IPv6 ULA / 链路本地 / 站点本地 | fc00::/7、fe80::/10、fec0::/10 |
丢弃 |
| IPv4-mapped IPv6(内嵌私网 IPv4) | ::ffff:192.168.1.1 |
丢弃 |
| 本机地址 | 127.0.0.1、::1 |
rebind_localhost=1 放行,0 丢弃 |
| 其它 | 198.18.0.0/16(Fake-IP 的 IPv4 池)、0.0.0.0、192.0.0.1、公网地址 |
放行 |
三个判定要点
- 整条应答一起丢弃:应答里只要有一条地址落入上表(例如一条 A 应答同时含
8.8.8.8与192.168.3.99),整条应答都不返回,客户端得到「无记录」而不是 NXDOMAIN。- 对任意上游生效:包括
127.0.0.1#7874(Mihomo)⇒ 只要 dnsmasq 处在客户端与内核之间就会触发。enable_redirect_dns=2(nft 把 53 端口直接重定向到dns_port)时客户端 DNS 不经过 dnsmasq,不受影响(见 §6.2 该选项行)。- 日志可查:触发时系统日志记录
possible DNS-rebind attack detected: <域名>(logread | grep DNS-rebind)。
受影响场景
| 场景 | 现象 | 做法 |
|---|---|---|
| 「覆写设置 → DNS → Hosts」把域名指向内网(保留)地址 | 该域名解析不到地址,其余域名正常 | 把域名加入「域名白名单」,或关闭「重绑定保护」 |
Fake-IP 模式 + IPv6(ipv6_dns=1) |
域名只有 IPv4 地址、IPv6 访问失败 | Fake-IP 的 IPv6 池是 ULA(fdfe:dcba:9876::/64 一类)⇒ 同上一行处理,或按 09-settings-dns-ac-ipv6.md §9.5.1 关闭 IPv6 DNS |
内网自建 DNS、NAS、.lan 域名由上游返回私网地址 |
仅这些域名解析失败 | 把对应域名加入「域名白名单」 |
启动日志出现 You May Need to Turn off The Rebinding Protection Option of Dnsmasq When Hosts Has Set a Reserved Address... |
Hosts 含保留地址 | 本节问题 |
做法 — LuCI 路径:网络 → DHCP/DNS → 常规设置 → 「重绑定保护」开关、「域名白名单」字段。
# 域名白名单(保留防护)
uci add_list dhcp.@dnsmasq[0].rebind_domain='example.com'
uci commit dhcp && /etc/init.d/dnsmasq restart
# 关闭重绑定保护(Hosts 需要解析内网地址时最省事,代价是失去该防护)
uci set dhcp.@dnsmasq[0].rebind_protection='0'
uci commit dhcp && /etc/init.d/dnsmasq restart自查:客户端 nslookup <域名> 无地址返回,且设备 logread 命中该域名。
File: .github/skills/openclash-user-guide/07-page-overview.md
运行状态页面 (Overviews / client)
用途: 运行状态页面各卡片/按钮的功能与后端操作,含模式切换、仪表盘、IP 检测与 oixCloud(§7.1–7.12)。
AI 行为指引: 当用户询问「运行状态页的某个按钮/卡片是干什么的」「如何切换运行/代理模式」「仪表盘入口怎么访问」「IP 检测/oixCloud 怎么用」时,AI 应结合本文件各小节(§7.1–7.12)说明每个控件的后端操作与生效方式,并给出 LuCI 操作路径。涉及 API 端点细节时参考
15-api.md。
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(action_status) 聚合返回:运行状态(clash/run_mode/rule_mode/meta_sniffer/respect_rules/oversea/stream_unlock)、仪表盘信息(cn_port/daip/dase/db_foward_port/db_foward_domain/db_forward_ssl)、仪表盘可用性(yacd/dashboard/metacubexd/zashboard)、核心类型core_type、代理信息(mixed_port/auth_user/auth_pass),不含任何版本号。
7.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_.json JSON 缓存),经独立 /last_version 端点 (action_last_version) 获取并据此显示「新版本可用」红点,均非 /status 端点 |
| 主题切换 | Light(太阳)/Dark(月亮)/Auto(自动) 三档切换 | 前端 CSS 变量 + localStorage |
| 公告横幅 | 滚动显示项目公告 (24h 缓存) | /announcement 端点 |
| 社交链接 | Wiki / Tutorials / Star / Telegram / Sponsor / Mihomo 图标 | 外部链接 window.open() |
| 开发者头像 | 12 位贡献者头像 + 末尾「More」占位(共 13 格,悬停显示名称) | 来自 GitHub 头像 URL |
7.2 运行模式卡片 (Running Mode)
| 模式 | UCI en_mode 值 |
说明 |
|---|---|---|
| 兼容 (Compat) | redir-host |
Redir-Host 模式,使用 iptables redirect 转发流量 |
| TUN 模式 | redir-host-tun / fake-ip-tun |
使用 TUN 虚拟网卡接管所有流量 |
| 混合 (Mix) | redir-host-mix / fake-ip-mix |
TUN + Redirect 混合,TCP 走 system 栈、UDP 走 gvisor 栈 |
切换触发:
action_switch_run_mode→ 修改 UCIen_mode,若运行中则自动重启
7.3 代理模式卡片 (Proxy Mode)
| 模式 | Mihomo mode 值 |
效果 |
|---|---|---|
| 策略代理 (Rule) | rule |
按 YAML 中 rules: 规则集合分流 |
| 全局代理 (Global) | global |
所有流量走 GLOBAL 策略组所选代理 |
| 全局直连 (Direct) | direct |
所有流量直连,不经过任何代理 |
切换触发:
action_switch_rule_mode→ PATCH Mihomo API/configs的mode字段,同时更新 UCIproxy_mode
7.4 快捷设置网格
| 设置项 | 功能 | UCI 选项 | 触发函数 |
|---|---|---|---|
| 地区绕行 (Area Bypass) | 切换中国 IP/海外绕行 | china_ip_route (0/1/2) |
action_switch_oc_setting → 修改 UCI + 重启 |
| 域名嗅探 (Sniffer) | 是否启用 Mihomo 域名嗅探 | enable_meta_sniffer |
action_switch_oc_setting → 动态修改运行时 YAML sniffer.enable |
| DNS 尊重规则 (DNS Proxy) | DNS 查询是否遵守路由规则 | enable_respect_rules |
action_switch_oc_setting → 动态修改 YAML dns.respect-rules |
| 流媒体解锁 (Stream Unlock) | 一键启用流媒体解锁 | stream_auto_select |
action_switch_oc_setting → 设置 stream_auto_select=1 及 Netflix/Disney/HBO 默认参数 |
7.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 自动轮询 |
7.6 控制面板卡片
显示当前 Dashboard 访问地址及 Secret 密码。对应 UCI:
cn_port— API 端口 (默认 9090),对应 Mihomoexternal-controllerdashboard_password— API 密钥,对应 Mihomosecretdashboard_forward_domain/dashboard_forward_port/dashboard_forward_ssl— 公网访问设置(dashboard_forward_domain可填域名或 IP/IPv6,端口可留空默认 443/80)dashboard_custom_url/dashboard_custom_clash_compatible— 自定义外部仪表盘地址(详见09-settings-dns-ac-ipv6.md§9.4)- 提供 复制 IP 和 复制密钥 按钮;若设置了
dashboard_custom_url,复制地址优先复制该自定义 URL
7.7 混合代理卡片
显示 SOCKS5/HTTP 代理地址,可复制或生成 PAC 文件:
mixed_port(默认 7893),http_port(7890),socks_port(7891)- 用户认证:
authenticationTypedSection 中的username/password,对应 Mihomoauthentication配置 - 提供 复制代理地址、复制认证信息、生成 PAC 配置 按钮
7.8 仪表盘入口 (Control Panel)
4 种可选仪表盘:Dashboard (Yacd)、Yacd、Metacubexd、Zashboard
- 对应 Mihomo
external-ui配置 - 切换触发:
action_switch_dashboard→openclash_download_dashboard.sh - 默认仪表盘: UCI
default_dashboard - 前端访问地址: 由
status.htm调用common.js的ocGetDashboardBaseURL等函数,根据「浏览器 hostname 是否匹配 LAN IP」「是否配置公网地址dashboard_forward_domain/dashboard_forward_port/dashboard_forward_ssl」等场景构造http[s]://<host>:/ui/<dashboard>/;公网地址支持域名/IP/IPv6 及内嵌端口。若配置了dashboard_custom_url,额外显示 External Dashboard 按钮并优先用于复制地址。完整逻辑见09-settings-dns-ac-ipv6.md§9.4 外部控制标签页 → 实现细节。 - 各仪表盘子路径:
/ui/dashboard/、/ui/yacd/、/ui/metacubexd/、/ui/zashboard/
7.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 靠 GEO 更新入口) | openclash_update.sh 'one_key_update' |
7.10 统计信息
页面底部显示 8 项实时统计指标,通过 WebSocket 和 XHR 轮询更新。数据源为 /toolbar_show(返回原始数值,见 15-api.md)与各 WebSocket。统计卡片标题栏右侧提供 卡片 / 图表 视图切换按钮(stats-view-toggle),图表视图用 chart.umd.min.js 绘制实时曲线:
| 指标 | 说明 |
|---|---|
| 上行速率 | 当前上传速率 |
| 下行速率 | 当前下载速率 |
| 上行总量 | 累计上传流量 |
| 下行总量 | 累计下载流量 |
| 连接数 | 当前活动连接数 |
| 内存 | 核心内存占用 |
| CPU | 核心 CPU 占用 |
| 平均负载 | 系统平均负载 |
7.11 IP 检测页 (IP Address / 访问检查)
IP 地址部分 (IP Address):
- 并行查询 4 个 IP 源:PConline(whois.pconline.com.cn)、IPIP.NET、IP.SB、IPIFY,每个显示 IP 地址 + 地理信息
- 隐私切换按钮(眼睛图标):点击后用
***.***.***.***隐藏所有 IP 显示(状态持久化到 localStorage)
访问检测部分 (Access Check):
- 两种检测模式:路由器模式(后端 XHR 代理检测)和浏览器模式(前端 fetch 直接检测),通过模式切换图标切换
- 4 个网站可达性检测:Baidu Search (百度搜索)、NetEase Music (网易云音乐)、GitHub、YouTube,各显示 HTTP 状态码和加载延迟(ms)
- 刷新按钮:重新执行所有 IP 查询和 HTTP 检测
轮询间隔: HTTP 检测 5-20 秒,IP 检测 15-40 秒。
7.12 oixCloud 面板 (oixCloud)
仅在设置了 oix_token 且 oix_show_info_page 为 1 时显示,展示 oixCloud 订阅服务信息:
- Logo + 标语(随机变化)
- 公告横幅(60 秒后自动消失)
- 计划信息:计划类型、到期时间、账户余额、推广余额、积分
- 流量统计:今日已用、计划已用、剩余流量、总流量
- 签到按钮:每日签到获取流量
- 底部链接:"Powered by oixcloud.com"
登录入口:在「插件设置 → oixCloud」标签页中通过 Login Account 按钮登录。
File: .github/skills/openclash-user-guide/08-settings-mode-traffic.md
插件设置页面 (Plugin Settings / settings)
用途: 插件设置页的模式与流量控制标签页各选项(UCI 与实现,§8.1–8.3)。
小节索引: §8.1 实现总览(§8.1.1 强制覆盖/禁用)· §8.2 模式设置(en_mode / stack_type / proxy_mode / …,§8.2.12 四栈选型、§8.2.13 转发模式、§8.2.14 默认值与 MIPS 来源、§8.2.15 TUN 数据面参数结论与选型)· §8.3 流量控制(router_self_proxy / disable_udp_quic / china_ip_route / …)· §8.4 性能实测数据(§8.4.1 测量条件、§8.4.2 四栈 × gso 主表、§8.4.3 转发路径、§8.4.4 TUN 参数、§8.4.5 持续负载与延迟、§8.4.6 内核 sysctl)
UCI Section:
openclash(anonymous section)
所有选项通过uci set openclash.@openclash[0].<option>=<value>设置
8.1 实现总览
插件设置页的选项通过以下路径生效:
UCI 写入 → init.d start_service() → get_config() 读取所有 UCI 变量
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
yml_change.sh set_firewall() change_dnsmasq()
(修改 YAML 配置) (iptables/nftables) (DNS 劫持转发)
│ │ │
▼ ▼ ▼
Mihomo 核心 系统防火墙规则 Dnsmasq → Mihomo DNS| 脚本 | 输入 | 输出 | 负责的设置 |
|---|---|---|---|
yml_change.sh |
~48 个 UCI 参数 | 修改运行 YAML | 端口、模式、DNS、TUN、Sniffer、认证、Meta、GEO、Smart |
yml_rules_change.sh |
UCI 覆写 + 自定义规则 | 修改运行 YAML | URL-Test 覆写、GitHub CDN、自定义规则注入、BT 直连规则 |
set_firewall() |
所有流量控制 UCI | iptables/nftables 规则 | 透明代理、黑白名单访问控制、中国 IP 绕行、QUIC 阻断、UPNP 排除 |
change_dnsmasq() |
DNS 相关 UCI | dnsmasq 配置修改 | DNS 劫持转发、自定义域名 DNS、chnroute 旁路 |
8.1.1 插件强制覆盖/禁用的设置(用户不可修改)
重要:以下设置由
yml_change.sh在每次启动时无条件硬编码写入 YAML,用户在 LuCI 中无法修改或关闭。但可以通过覆写模块的[YAML]段和[Overwrite]段尝试覆盖,插件不保证覆写后的效果及工作逻辑正常。
| 强制设置 | 硬编码值 | 说明 |
|---|---|---|
allow-lan |
true |
始终允许局域网设备使用代理端口 |
bind-address |
* |
始终监听所有网络接口 |
external-controller |
0.0.0.0:<cn_port> |
API 始终监听所有接口 (非仅 127.0.0.1) |
external-ui |
/usr/share/openclash/ui |
Dashboard 路径不可更改 |
dns.listen |
0.0.0.0:<dns_port> |
DNS 始终监听所有接口 |
profile.store-selected |
true |
始终保存策略组选择状态 |
iptables |
删除 | 强制移除 iptables 相关配置 |
ebpf |
删除 | 强制移除 eBPF 相关配置 |
auto-redir |
删除 | 强制移除 auto-redir(由 OpenClash 防火墙管理) |
routing-mark |
6666 (非自定义标记时) |
固定路由标记值 |
external-controller-cors.allow-private-network |
true (有 CORS origin 时) |
允许私有网络访问 API |
有条件默认设置(仅在用户未配置时自动添加):
| 设置 | 默认值 | 条件 |
|---|---|---|
keep-alive-interval |
15 |
仅当配置中未设置 |
keep-alive-idle |
600 |
仅当配置中未设置 |
ntp.enable |
true |
无条件启用(yml_change.sh 始终设置);仅 server/port/interval/write-to-system 为未设置时添加 |
ntp.server |
time.apple.com |
仅当配置中未设置 |
ntp.port |
123 |
仅当配置中未设置 |
ntp.interval |
30 (分钟) |
仅当配置中未设置 |
ntp.write-to-system |
true |
仅当配置中未设置 |
sniffer.sniff |
HTTP:80,8080-8880 / TLS:443,8443 / QUIC:443 | 嗅探端口不可修改 |
sniffer.override-destination |
false |
始终用嗅探结果覆盖连接目标 |
sniffer.force-domain |
+.netflix.com, +.nflxvideo.net, +.amazonaws.com, +.media.dssott.com |
强制嗅探的流媒体域名 |
sniffer.skip-domain |
Mijia Cloud, dlg.io.mi.com, +.oray.com, +.sunlogin.net, +.push.apple.com |
跳过嗅探的智能家居/推送域名 |
sniffer.force-dns-mapping |
true (Redir-Host 时) |
Redir-Host 模式下强制 DNS 映射嗅探 |
防火墙固定值(硬编码在 init.d/openclash 中):
| 常量 | 值 | 说明 |
|---|---|---|
PROXY_FWMARK |
0x162 |
所有被代理流量的防火墙标记,不可修改 |
PROXY_ROUTE_TABLE |
0x162 |
策略路由表 ID,不可修改 |
| (内联字面量 skgid) | 65534 |
绕过代理的组 ID;直接写在 nft 规则里(init.d/openclash 中没有同名变量) |
内核模块依赖(缺少时会导致启动报错):
| 运行模式 | fw4 (nftables) 需要的 kmod | fw3 (iptables) 需要的 kmod |
|---|---|---|
| Redir-Host / Fake-IP (非TUN) | kmod-nft-tproxy |
kmod-ipt-tproxy |
| TUN 模式 | kmod-tun + kmod-nft-tproxy |
kmod-tun + kmod-ipt-tproxy |
| 混合模式 (Mix) | kmod-tun + kmod-nft-tproxy |
kmod-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。
8.2 模式设置标签页 (op_mode)
8.2.1 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 模式」(选项
fake-ip)——DNS 解析快、占资源低,日常够用;若个别应用连不上(NAT 问题)改用「Fake-IP 混合」(选项fake-ip-mix),或者「Fake-IP TUN」(选项fake-ip-tun) - TUN 模式: 创建虚拟网卡,以网络层接管所有流量。对应 Mihomo
tun.enable=true。需要kmod-tun内核模块 - 混合模式: TCP 使用 redirect,UDP 使用 TUN。对应 Mihomo
tun.stack=mixed。适合非直连游戏等对 NAT 类型有要求的场景
8.2.2 stack_type — TUN 堆栈类型 (Select Stack Type)
- UCI 选项:
openclash.@openclash[0].stack_type - 可选值:
system/gvisor/mixed/mips - Mihomo 对应配置:
tun.stack - system: 内核协议栈,每字节 CPU 最低;吞吐约为
mips的一半 - gvisor: 隔离性最好,但除纯大流量上传外均不可靠(单连接吞吐低、短连接不稳、UDP 200 B 丢包约 55%)
- mixed: TCP 走 system、UDP 走 gvisor;UDP 丢包与
system同档 - mips(插件默认): 轻量用户态协议栈(mipstack,纯 Go、无 cgo),两种形态吞吐最高、短连接最快
- 依赖: 仅在 TUN/混合模式下显示
- 四栈性能数据与选型: 选型见 §8.2.12、完整数据见 §8.4.2;转发模式见 §8.2.13;默认值与 MIPS 来源见 §8.2.14;TUN 数据面参数(
gso等)结论见 §8.2.15
8.2.3 proxy_mode — 代理模式 (Proxy Mode)
- UCI 选项:
openclash.@openclash[0].proxy_mode - 可选值:
rule/global/direct - Mihomo 对应配置:
mode - 默认:
rule - 此选项等同一键切换全局/规则/直连模式
8.2.4 enable_udp_proxy — UDP 流量转发 (Proxy UDP Traffics)
- UCI 选项:
openclash.@openclash[0].enable_udp_proxy - 默认: 1 (开启)
- 说明: 节点需支持 UDP 转发。
- 依赖: 仅非 TUN 模式(
fake-ip/redir-host)显示 - 注意: Fake-IP 模式即使关闭此选项,域名类 UDP 连接仍会经过核心
8.2.5 delay_start — 延迟启动(秒) (Delay Start)
- UCI 选项:
openclash.@openclash[0].delay_start - 默认: 0 (不延迟)
- 说明: 开机后延迟指定秒数再启动 OpenClash
8.2.6 log_size — 日志大小(KB) (Log Size)
- UCI 选项:
openclash.@openclash[0].log_size - 默认: 1024 (1MB)
- 说明: 核心日志文件
/tmp/openclash.log的最大大小
8.2.7 bypass_gateway_compatible — 旁路网关(旁路由)兼容 (Bypass Gateway Compatible)
- UCI 选项:
openclash.@openclash[0].bypass_gateway_compatible - 默认: 0 (关闭)
- 说明: 旁路由 (旁路网关) 模式下无法上网时尝试开启。如果设备没有 WLAN,建议禁用 LAN 接口的桥接选项
8.2.8 disable_quic_go_gso — 禁用 quic-go GSO (Disable QUIC Go GSO)
- UCI 选项:
openclash.@openclash[0].disable_quic_go_gso - 默认: 0 (关闭);但
uci-defaults/luci-openclash在 Linux 内核 > 6.6 的固件上初始化为 1 - 说明: Linux 内核 6.6 以上版本遇到 QUIC UDP 问题时尝试开启。Hysteria / Hysteria2 / TUIC 等基于 QUIC 协议的节点出现连接超时、断流、握手失败时,优先尝试开启此选项
- Mihomo 对应配置:
experimental.quic-go-disable-gso: true(注意键名顺序是quic-go-disable-gso)
8.2.9 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 配置 验证节点字段是否正确。
8.2.10 运行模式切换按钮 (switch_mode)
- 模板:
openclash/switch_mode - 功能: 一键在 Redir-Host 和 Fake-IP 之间切换当前页面显示
- 触发:
action_switch_mode→ 修改 UCIoperation_mode
8.2.11 运行模式实现详解
启动流程中的关键变量传递 (来自 init.d start_service()):
get_config()读取 UCIen_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: 由
stack_type写入(system/gvisor/mixed/mips,插件默认mips);各栈含义与选型见 §8.2.2、§8.2.12
防火墙层面的影响 (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 栈)
8.2.12 TUN 堆栈选型
各栈定义
system:系统协议栈(内核)gvisor:用户态 gVisor 栈,隔离性最好mixed:TCP 走system、UDP 走gVisor(源码:Mixed内嵌*System,仅给 UDP 注册 gVisor handler/forwarder)mips(插件默认):mihomo 自研纯 Go 用户态栈(mipstack)
选型结论(性能数据见 §8.4.2)
- 默认
mips(插件默认,见 §8.2.14):两种形态吞吐最高、短连接最快。 gso保持开启(插件默认):全栈全形态正收益,是唯一有量级影响的数据面参数。- 看重每字节 CPU 选
system(吞吐约为mips的一半);mixed≈system;gvisor不建议使用(除纯大流量上传外均不可靠)。 - 必须整机接管时才用 TUN:REDIRECT / TPROXY 的内核短路比 TUN 数据面便宜 1–2 个数量级(见 §8.2.13)。
- 高并发会明显降速:40/100 连接时四栈同档回落到 32–57 MB/s(合批失效,见 §8.4.5);连接数多的场景宜用 REDIRECT/TPROXY(见 §8.4.3)。
四种栈均可代理路由器自身流量:经插件默认的「标记 + 策略路由进 TUN」即可(见 §8.2.11),无需其它开关。
8.2.13 转发模式(tun / redirect / tproxy)与建议
OpenClash 现状(init.d 的 set_firewall)
- 非 TUN 模式:TCP 用 REDIRECT(
redirect to $proxy_port),UDP 用 TPROXY(mark set 0x162+tproxy ip to 127.0.0.1:$tproxy_port),LAN 与「路由器自身」各一套链(openclash_mangle*/openclash_output) - TUN 模式:流量进
utun,由所选栈处理
建议(对比数据见 §8.4.3)
- 优先 REDIRECT/TPROXY:批量吞吐与直连同级(内核
splice零拷贝中继),每 256 MB core CPU 约 0.1 s、只有 TUN 数据面的约 1/30–1/100;短连接约为直连的 50%,高于 TUN。 - TPROXY-TCP 的意义在于透明代理链路更干净,属功能取舍而非性能优化:REDIRECT 在 PREROUTING 把目标 DNAT 成本地地址,代理只能靠
getsockopt(SO_ORIGINAL_DST)从 conntrack 反查客户端原本要去的目标(查不到就静默断连);TPROXY 不改写报文,目标直接来自报文本身(github.com/metacubex/mihomo/listener/tproxy/tproxy.go读conn.LocalAddr())。源 IP 两种方式都会保留。 - 旁路由纯转发(不经代理)不是瓶颈:转发 + NAT 可达线路速率,CPU 开销可忽略(
FLOWOFFLOAD把已建立连接交给 flowtable,开关无差异,且不影响被代理流量——命中 mark/TPROXY 的报文本就不走 offload)。旁路由的 masquerade 可关(主路由能回程即可)但收益≈零。 - UDP 小包路径:丢包基本由「每秒包数」而非转发方式决定(
mips/system下 TPROXY 与 TUN 同档);flood 场景交付 TUN ≈ TPROXY(约 43–45 MB/s),gvisor只有约 1/4(见 §8.4.3)。
8.2.14 默认值与 MIPS 来源
- mihomo 内核:主配置
tun:段未写stack时默认 =mips(config/config.go的DefaultRawConfig写Stack: C.TunMips,上游提交「change default IP stack mode to mips」)。仅listeners:内联的 tun 项默认gvisor(listener/parse.go);TUNStack类型零值仍是gvisor(constant/tun.go,内部实现细节)。 - OpenClash 插件默认 =
mips(settings.lua的stack_type/stack_type_v6默认值,yml_change.sh取不到参数时同样回退为mips),且yml_change.sh每次都会把stack与gso: true显式写入配置 ⇒ 插件与内核默认值一致。 - 官方 wiki(TUN → stack)写「如无使用问题,建议使用
mixed栈,默认gvisor」,与内核、插件默认mips不一致,以本文档数据为准。 mips基于github.com/metacubex/mipstack(README 自述:pure-Go、无需 cgo);在 mihomo 中先用于 ZeroTier 与 WireGuard 出站的ip-stack,TUN 集成较晚(随 sing-tun v0.4.24 引入)。
8.2.15 TUN 数据面参数(gso / mtu / congestion-controller / stack)
参数分类(字段定义:github.com/metacubex/mihomo/listener/config/tun.go)
| 类别 | 参数 | 说明 |
|---|---|---|
| 影响数据面吞吐/CPU | stack、gso、gso-max-size、mtu、congestion-controller、endpoint-independent-nat |
congestion-controller 仅 mips 生效;endpoint-independent-nat 只改 UDP NAT 行为 |
| 只影响路由/抓取范围(控制面) | auto-route、auto-redirect、strict-route、route-address(-set)、route-exclude-address(-set)、include/exclude-interface、include/exclude-uid(-range)、include/exclude-mac-address、exclude-src/dst-port(-range)、iproute2-table-index、iproute2-rule-index、loopback-address |
改的是哪些流量进 TUN,不改变单连接处理开销 |
| 协议辅助 / 运维 | dns-hijack(DNS)、disable-icmp-forwarding(ICMP)、udp-timeout/icmp-timeout(会话存活时长)、file-descriptor(fd 上限)、processors-per-channel(gvisor 专用)、recvmsgx/sendmsgx(darwin 专用) |
拿去测「吞吐」没有意义 |
参数结论与建议(适用于路由器自身流量、LAN 转发两种形态)
gso是唯一有量级影响的参数,插件默认开启(yml_change.sh重建tun段时写入gso: true)。- 全栈全形态正收益:下载/短连接
system/mixed/mips明显提升、每 256 MB CPU 降 30~45%;上传gvisor+637%、mips+45%。完整量化见 §8.4.2。 - 代价:仅 Linux 支持;GSO 超包在出口网卡按 MTU 分段(对端 MTU 较小时多一层分片)。遇到兼容性问题时可按文末方法关闭。
- 实现位置:
github.com/metacubex/sing-tun/tun_linux.go(enableGSO();UDP offload 失败会被忽略,TCP offload 失败则建 tun 失败)——GSO 属设备层,与所选栈无关。
- 全栈全形态正收益:下载/短连接
mtu、gso-max-size、congestion-controller、processors-per-channel、endpoint-independent-nat无可测收益,保持默认(对比数据见 §8.4.4)。mtu: 9000不是提速手段(GSO 超包在出口网卡仍需按 MTU 分段;改小mtu反而约 -6%);gso-max-size默认 65536 已足够。congestion-controller仅mips消费(唯一使用点github.com/metacubex/sing-tun/stack_mipstack.go,gvisor/system/mixed忽略该字段):cubic/reno/bbr/bbr3差异在 ±5% 波动范围内,保持cubic;填非法值会使核心启动失败(invalid TCP congestion control)。endpoint-independent-nat只改 UDP NAT 行为;processors-per-channel对gvisor无改善。
- 栈选择见 §8.2.12(数据见 §8.4.2):默认
mips+gso(两种形态吞吐最高、短连接最快);看重每字节 CPU 选system;gvisor仅在纯大流量上传时有优势;四种栈代理路由器自身流量经插件默认的标记 + 策略路由即可(无需auto-redirect)。 - 延迟:满载时小请求延迟
mips升高约 320–360%(~2 ms → ~8–12 ms/req)、mixed约 43 ms、gvisor约 105 ms 且伴随失败(32 KB ×200;见 §8.4.5);低延迟优先选内核短路路径(REDIRECT/TPROXY,见 §8.2.13)。 - 内核 sysctl 无需调优:
rmem_max/wmem_max/tcp_rmem/tcp_wmem(调至 16 MB)、tcp_congestion_control=bbr、default_qdisc=fq、netdev_max_backlog/netdev_budget、tcp_fastopen/tcp_max_syn_backlog/somaxconn等即使全部一起修改,差异仍 ≤5%(bbr反而略差)——TUN、REDIRECT、TPROXY 三种路径均已验证(见 §8.4.6)。 tun.gso与experimental.quic-go-disable-gso(插件「禁用 quic-go GSO」开关)互不影响:前者作用于 tun 设备层;后者在核心启动前设置环境变量QUIC_GO_DISABLE_GSO(github.com/metacubex/mihomo/hub/executor/executor.go),作用于 QUIC 的 UDP socket。内核并未默认禁用 GSO:setsockopt(UDP_SEGMENT)/UDP_GRO均可用。QUIC 报文同样经过 tun,故tun.gso对 UDP/QUIC 吞吐同样有正收益。- 持续满载无衰减:连续满载 10 分钟(四栈均验证:单连接 2 GB 循环 + 4 连接循环)吞吐、每 256 MB CPU、RSS/fd 均平稳,无热降频——可长期满速(见 §8.4.5)。
如何覆盖默认值:tun 段由 yml_change.sh 按模板重建(写入 enable/stack/device/dns-hijack/endpoint-independent-nat/auto-route/auto-detect-interface/auto-redirect/strict-route/disable-icmp-forwarding/gso);需要不同取值时用覆写模块的 [YAML] 块(在 yml_change.sh 之后执行,可覆盖最终配置),保存后重启 OpenClash(覆写模块仅在 start/restart 生效):
tun:
gso: false # 遇到 GSO 兼容性问题时关闭;插件默认开启8.3 流量控制标签页 (traffic_control)
生效路径: 绝大多数流量控制选项不修改 YAML,而是影响
set_firewall()生成的 iptables/nftables 规则链。AI 行为指引: 当用户询问流量路由问题时(如「TUN 和 TPROXY 有什么区别」「如何让某设备不走代理」、
「旁路由/网关模式下如何配置」「IPv6 流量如何控制」),AI 应结合本章节的防火墙规则详解
和 Mihomo 监听器文档 回答,说明不同模式
的工作原理(而非仅给出操作步骤),帮助用户理解后做出选择。
涉及防火墙实现细节时,查阅 OpenClash 源码 中init.d/openclash和yml_change.sh的相关逻辑。set_firewall()通过 UCIfirewall.openclash注册为/var/etc/openclash.include,由 OpenWrt firewall3/firewall4 框架加载。
支持 fw4 (nftables) 和 fw3 (iptables) 双后端自动检测。
注意:如需按接口/用户/DSCP 等维度精细绕过,请使用「插件设置页面底部 → 来源流量访问控制」(10-settings-geo-misc-src.md§10.3)。黑白名单设备级绕过使用「插件设置 → 黑白名单」(09-settings-dns-ac-ipv6.md§9.2)。
8.3.1 router_self_proxy — 路由本机代理 (Router-Self Proxy)
- UCI 选项:
openclash.@openclash[0].router_self_proxy - 默认: 1 (开启)
- 说明: 开启后,路由器本身发出的流量也会经过代理核心。仅在规则模式下生效。关闭后流媒体增强标签页所有功能将失效
- 实现细节: 控制 OUTPUT 链规则是否生成(fw4
openclash_output/openclash_mangle_output,fw3 OUTPUT 规则),决定路由器自身出站流量是否重定向到 Mihomo。规则细节见06-firewall-options-dnsmasq.md§6.2「各选项对防火墙规则的具体影响 →router_self_proxy」。(注意:非 TUN 模式下 Fake-IP 模式即使关闭本选项,仍会为 Fake-IP 流量创建 OUTPUT 链)
8.3.2 disable_udp_quic — 禁用 QUIC (Disable QUIC)
- UCI 选项:
openclash.@openclash[0].disable_udp_quic - 默认: 1 (开启)
- 效果: 对 UDP 443 端口的流量执行 REJECT,阻止 YouTube 等使用 QUIC 协议传输 (降级到 TCP)
- 执行方式: 通过 iptables/nftables 规则阻断 UDP 443,排除中国大陆 IP 段
- 实现细节:
set_firewall()在 filter INPUT 链 + FORWARD 链 插入 QUIC REJECT 规则(fw4:nft insert rule inet fw4 input position 0 udp dport 443 <匹配条件> counter reject,fw3 等效)。匹配条件由china_ip_route决定方向:china_ip_route=1(绕过大陆)时为ip daddr != @china_ip_route(REJECT 除国内外的 UDP 443),china_ip_route=2(绕过海外)时为ip daddr @china_ip_route。TUN 模式额外在forward oifname utun插入同规则覆盖经 utun 转发的流量;IPv6 按china_ip6_route对应处理(ip6 daddr [!=] @china_ip6_route)。与china_ip_route_pass/dnsmasq ipset 无直接关系。详见06-firewall-options-dnsmasq.md§6.2「各选项对防火墙规则的具体影响 →disable_udp_quic」。
8.3.3 skip_proxy_address — 绕过服务器地址 (Skip Proxy Address)
- UCI 选项:
openclash.@openclash[0].skip_proxy_address - 默认: 0 (关闭)
- 说明: 绕过配置中服务器地址的代理,防止重复代理 (代理嵌套)
- 实现细节: 开启后看门狗脚本
openclash_watchdog.sh中的skip_proxies_address()函数(每 30 个看门狗周期执行一次)解析 YAML 中所有代理节点(proxies和proxy-providers)的server地址,域名通过openclash_debug_dns.lua调用 Mihomo 内核 API(/dns/query)解析为 IP 后,加入已存在的localnetworknft set(或 ipset),复用链首ip daddr @localnetwork counter return规则跳过代理。见06-firewall-options-dnsmasq.md§6.2「各选项对防火墙规则的具体影响 →skip_proxy_address」。
8.3.4 common_ports — 仅允许常用端口流量 (Common Ports Proxy Mode)
- UCI 选项:
openclash.@openclash[0].common_ports - 默认: 0 (禁用)
- 说明: 仅让常用端口 (HTTP/HTTPS/邮件等) 的流量走代理,防止 BT/P2P 流量占用线路
- 预设值:
21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 2197 5222 5223 5228 5229 5230 8080 8443 8880 8888 8889 - 自定义格式: 空格分隔的端口号,如
443 80或范围20-443 - 依赖: 仅 Redir-Host 系列模式
- 实现细节: 非 0 时在代理链插入
th dport != @common_ports counter return,仅代理常用端口、绕过 P2P/BT 等非标端口;禁用时不加端口限制,所有 TCP 都重定向。规则细节见06-firewall-options-dnsmasq.md§6.2「各选项对防火墙规则的具体影响 →common_ports」。
8.3.5 china_ip_route — 实验性:绕过指定区域 IP (China IP Route)
- UCI 选项:
openclash.@openclash[0].china_ip_route - 默认: 0 (关闭)
- 可选值:
0— 关闭1— 绕过中国大陆 IP (将国内 IP 直连,提升性能)2— 绕过海外 IP
- 说明: 强烈推荐启用「绕过中国大陆」。启用后,默认在
fake-ip-filter添加rule-set:oc-cn-domain,也可选择使用当前 GeoSite 数据库中的cn分类;解析 IP 位于大陆 IP 段范围内的流量将不进入内核,显著降低内核性能开销。旁路由模式下如果遇到大陆域名无法访问可尝试开启「旁路由兼容」选项 - Mihomo 对应: 根据
china_ip_route_domain_source,通过dns.fake-ip-filter添加 MRS Rule-Set 或 GeoSite CN 规则,使中国大陆域名返回真实 IP 而非 Fake-IP;选择 MRS 时同时自动注册对应的rule-providers条目 - 实现细节(双重机制): 1) YAML 层面:
yml_change.sh根据域名数据源和fake-ip-filter-mode修改dns.fake-ip-filter;默认 MRS 使用rule-set:oc-cn-domain,GeoSite 使用geosite:cn,rule 模式则使用对应的大写规则语法,whitelist 模式不追加并移除已有 CN 相关过滤器。2) 防火墙层面:set_firewall()使用 chnroute IP 列表构建 nftables set(china_ip_route或者china_ip6_route),在 redirect/TPROXY 链中匹配国内真实 IP 直连 return。两层面互为补充——YAML fake-ip-filter 确保大陆域名获得真实 IP,防火墙 nft set 匹配这些真实 IP 使其跳过代理。
8.3.5.1 china_ip_route_domain_source — 中国大陆域名数据源 (China IP Route Domain Source)
- UCI 选项:
openclash.@openclash[0].china_ip_route_domain_source - 可选值:
mrs(默认)/geosite - 界面名称:
mrs显示为「MetaCubeX 规则 cn.mrs(默认)」;geosite显示为「GeoSite 规则 geosite:cn」 - 选择保留: 关闭区域 IP 绕行后保存设置,会保留已保存的数据源选择;重新开启时继续使用该选择。
- 依赖: 仅 Fake-IP 系列模式,并在
china_ip_route或china_ip6_route启用时显示 - 说明:
mrs使用MetaCubeX/meta-rules-dat提供的独立cn.mrs规则集,blacklist 模式追加rule-set:oc-cn-domain,rule 模式追加RULE-SET,oc-cn-domain,real-ip;geosite使用当前/etc/openclash/GeoSite.dat中的cn分类,分别追加geosite:cn或GEOSITE,cn,real-ip。whitelist 模式下两种来源都不自动追加 CN 过滤器。选择geosite时不会自动注册rule-providers.oc-cn-domain,并会跟随用户配置的 GeoSite 数据源与更新周期。 - 资源与故障差异: MRS 是默认值,使用独立 CN 规则集;GeoSite 从当前数据库读取
cn分类。实测geosite:cn比 MRS 约多占用 20 MiB 内存(差值因内核和规则库而异)。MRS 本地文件缺失或损坏且下载失败时,Mihomo 仍可启动,但依赖该规则集的域名可能返回 Fake-IP,影响区域绕行;所需的 GeoSite 数据无法加载或缺少cn分类时,Mihomo 配置校验和启动会失败。
8.3.6 intranet_allowed — 仅允许内网 (Only Intranet Allowed)
- UCI 选项:
openclash.@openclash[0].intranet_allowed - 默认: 1 (开启)
- 说明: 开启后控制面板和连接代理端口仅能从内网访问,不暴露到公网
- Mihomo 对应:
allow-lan: true+bind-address: "*" - 实现细节: 双重保护——1) YAML 层面:
yml_change.sh无条件设置allow-lan: true+bind-address: "*"使内核监听所有接口(该选项本身不控制 YAML)。2) 防火墙层面:创建openclash_wan_input链,REJECT 来自 WAN 口对全部服务端口的访问,关闭时删除该链。规则细节见06-firewall-options-dnsmasq.md§6.2「各选项对防火墙规则的具体影响 →intranet_allowed」。
8.3.7 intranet_allowed_wan_name — WAN 接口名称 (WAN Interface Name)
- UCI 选项:
openclash.@openclash[0].intranet_allowed_wan_name - 说明: 指定哪个接口被识别为 WAN。用于仅允许内网功能区分内外网
- 依赖:
intranet_allowed=1
8.3.8 lan_interface_name — LAN 接口名称 (LAN Interface Name)
- UCI 选项:
openclash.@openclash[0].lan_interface_name - 可选值: 系统中所有网络接口名
- 默认: 0 (禁用)
- 说明: 指定 LAN 接口名称,用于通过
ip address show <接口>获取路由器 LAN IP 地址(供控制面板地址显示、API 调用、调试日志等使用)。设为 0 则自动检测
8.3.9 local_network_pass — 本地 IPv4 网络绕过列表 (Local Network Pass)
- UCI 选项:
openclash.@openclash[0].local_network_pass - 存储文件:
/etc/openclash/custom/openclash_custom_localnetwork_ipv4.list - 说明: 目标地址为列表中 IP 的流量不经过核心
8.3.10 chnroute_pass — 绕过指定区域 IPv4 黑名单 (Chnroute Bypassed List)
- UCI 选项:
openclash.@openclash[0].chnroute_pass - 存储文件:
/etc/openclash/custom/openclash_custom_chnroute_pass.list - 说明: 列表中的域名/IP 不受中国 IP 绕行选项影响,依赖 Dnsmasq
- 依赖:
enable_redirect_dns != 2 - Fake-IP 模式下的额外处理: 「绕过指定区域」开启(
china_ip_route或china_ip6_route非 0)且en_mode=fake-ip+enable_redirect_dns != 2时,列表中的域名会被写入dns.fake-ip-filter(黑名单模式写入+.域名,规则模式写入DOMAIN-SUFFIX,域名,real-ip,白名单模式则查找现有fake-ip-filter并删除包含这些域名的条目),不再依赖custom_fakeip_filter开关 - 注意: chnroute_pass 仅在 DNS 解析层面将域名解析 IP 加入
china_ip_route_passnft set 使其跳过绕行规则,但若上游 DNS 本身将这些域名解析到国内 IP,加入 set 后仍会被china_ip_route规则误判为国内 IP 而绕行。仅靠 chnroute_pass 不足以解决 Google Play 下载问题——必须同时从 DNS 解析(nameserver-policy强制走境外 DNS,见内置覆写模块Google_Play)和规则匹配(自定义规则走代理)两方面入手,详见03-errors.md§3.14 功能异常类
8.3.11 UPNP 流量排除(无 UCI 选项,自动生效)
- 触发条件: 系统已安装并运行
upnpd(/etc/config/upnpd存在且upnp_lease_file指向有效租约文件) - 说明: 自动读取 upnpd 租约文件,为 UPnP 端口映射创建防火墙绕过规则,防止 BT/PT 下载、游戏主机等 UDP UPnP 流量被 TPROXY 错误代理
- 实现细节: 防火墙初始化阶段
set_firewall()创建openclash_upnp链并在openclash_mangle链中通过jump openclash_upnp(规则位置在最终 TPROXY 之前)。upnp_exclude()函数读取 upnpd 租约文件(格式UDP:<ext_port>::),为每条租约在openclash_upnp链中添加ip saddr sport counter return规则。看门狗openclash_watchdog.sh每 30 个周期(首周期立即执行,之后每UPNP_INTERVAL=30即约 30 分钟)执行 UPNP 规则同步:① 清理过期规则——遍历openclash_upnp链现有规则,删除租约文件中已不存在的条目;② 添加新规则——读取租约文件,为新增的 UPnP 映射补充 RETURN 规则。规则细节见06-firewall-options-dnsmasq.md§6.2「各选项对防火墙规则的具体影响 → UPNP 流量排除」。
8.4 性能实测数据
本章所有性能数字的完整明细。
8.4.1 测量条件
- 两种形态:路由器自身(本机客户端 ↔ 本机源站;域名经核心 fake-ip 解析 → 输出标记 → 策略路由进 TUN 闭环)与 LAN 转发(veth 命名空间客户端 ↔ 源站,同路径进 TUN);并发档位另以 LAN 侧真实客户端(PC)交叉验证(见 §8.4.5)。§8.4.3 的转发路径与 UDP 对比也在设备内部完成(不经物理链路)。
- 场景:批量 TCP 256 MB(下载=服务端→客户端:单连接测 2 次、4 连接并发测 1 次;上传=
iperf3 -P4 -t 6,4 连接并发);短连接 3000 次 × 32 KB(20 并发);UDP 200 B @20 kpps、1400 B @7.5 kpps 各 5 s。 - CPU:核心进程 utime+stime(s/256MB);
tun段与插件生成的标准配置一致。 - 数值单位:吞吐 MB/s、短连接 rps、丢包 %;单连接为两次测量(区间/并列);
gso对比见 §8.4.2(表中为「关 → 开」的数值与变化幅度)。
8.4.2 TUN 四栈 × `gso` 对比(主表)
单元格为
gso关 → 开 的数值;括号内为开启后的变化幅度(按两组数据均值计算;单连接为两次测量的区间)。
路由器自身流量
| 场景 | system |
mixed |
mips |
gvisor |
|---|---|---|---|---|
| 下载×单连接(MB/s) | 69 → 109(+58%) | 68 → 111(+63%) | 98–104 → 164–168(+64%) | 28 → 28(持平) |
| 下载×单连接 CPU(s/256MB) | 4.3 → 2.6(-40%) | 4.4 → 2.6(-41%) | 5.2 → 3.0(-42%) | 12.6 → 12.9(+2%) |
| 下载×4 连接(MB/s) | 63 → 99(+57%) | 62 → 90(+45%) | 77 → 115(+49%) | 54 → 53(-2%) |
| 上传×4 连接(MB/s) | 78 → 108(+38%) | 64 → 112(+75%) | 128 → 185(+45%) | 35 → 258(+637%) |
| 短连接(rps) | 729 → 716(-2%) | 715 → 758(+6%) | 1051 → 1277(+22%) | 647 → 62(-90%)* |
| UDP 200 B 丢包(%) | 0.4 → 0.5(+0.1 个百分点) | 0.1 → 0.0(-0.1 个百分点) | 0.6 → 0.4(-0.2 个百分点) | 54 → 54(持平) |
LAN 转发流量
| 场景 | system |
mixed |
mips |
gvisor |
|---|---|---|---|---|
| 下载×单连接(MB/s) | 44–47 → 66–68(+47%) | 46–47 → 67–69(+46%) | 66–72 → 147–148(+112%) | 22 → 22(持平) |
| 下载×单连接 CPU(s/256MB) | 5.1 → 3.5(-31%) | 5.1 → 3.6(-29%) | 6.2 → 3.5(-44%) | 15.3 → 14.5(-5%) |
| 下载×4 连接(MB/s) | 43 → 60(+40%) | 45 → 61(+36%) | 57 → 98(+72%) | 50 → 49(-2%) |
| 上传×4 连接(MB/s) | 71 → 102(+44%) | 64 → 98(+53%) | 106 → 185(+75%) | 34 → 253(+644%) |
| 短连接(rps) | 656 → 635(-3%) | 647 → 597(-8%) | 872 → 1162(+33%) | 93 → 401(+331%)* |
| UDP 200 B 丢包(%) | 0.3 → 0.1(-0.2 个百分点) | 0.3 → 0.3(持平) | 1.6 → 1.5(-0.1 个百分点) | 55 → 52(-3 个百分点) |
- *:
gvisor短连接呈双峰波动——间歇处于劣化档(约 30–90 rps、大量请求失败)或正常档(150–650 rps、仍偶有失败),与gso、客户端形态、平台均无关(表中 62/93/401 均为该区间的真实取值)。其余数据波动在 ±10% 内。- UDP 1400 B @7.5 kpps 丢包:各栈均 ≤0.9%(
gvisor0.8%)。
8.4.3 转发路径对比
本轮对比使用设备内部测试环境(客户端与源站均位于设备内部、经虚拟网卡互通,不经物理链路),
gso开启。真实 PC 客户端另有链路上限(1GbE ≈ 110 MB/s、WiFi 更低)——此前表中 30–35 MB/s 的数字即受当时 PC 客户端链路限制。
| 路径 | 批量 TCP(单连接 / 4 连接) | 短连接(3000 次 × 32 KB,20 并发) | 每 256 MB core CPU |
|---|---|---|---|
| 直连(不经代理,基线) | 0.96–1.15 / 1.64 GB/s | 5114 rps | 0 |
| LAN 客户端 → REDIRECT(TCP) | 0.97–1.13 / 1.55–1.63 GB/s | 2368–2636 rps | ~0.05–0.11 s |
| LAN 客户端 → TPROXY(TCP) | 0.86–1.10 / 1.55–1.63 GB/s | 2428–2556 rps | ~0.04–0.20 s |
| LAN 客户端 → TUN(四种栈) | 单连接 22–148 MB/s;4 连接 49–98 MB/s(见 §8.4.2) | 635–1162 rps(gvisor 波动) |
2.6–14.5 s |
- REDIRECT / TPROXY 的批量吞吐与直连同级(中继走内核
splice零拷贝,mihomo TCP↔TCP 转发;每 256 MB 只消耗约 0.1 s core CPU);短连接约为直连的 50%(每条连接多约 0.2 ms 的核心建连开销)。TUN 数据面逐包过用户态栈,吞吐低一个数量级、CPU 高 1–2 个数量级。- REDIRECT 与 TPROXY(TCP)彼此持平;TPROXY 多需要一套
ip rule+ 本地路由表,日常保持插件现状(TCP=REDIRECT、UDP=TPROXY)即可。
高负载 UDP 对比(同一测试环境;UDP 在非 TUN 模式下固定走 TPROXY,REDIRECT 只承载 TCP)
| 场景 | TPROXY | TUN mips |
TUN system |
TUN gvisor |
|---|---|---|---|---|
| UDP 200 B @20 kpps:丢包 | 0.3% | 0.5% | 0.2% | 54% |
| UDP 200 B @40 kpps:丢包 | 13.2% | 13.2% | 10.9% | 55% |
| UDP 1400 B @7.5 kpps:丢包 | 0.0% | 0.0% | 0.0% | 0.0% |
| QUIC 形态(40 流 × 200 B × 500 pps):丢包 | 0.1% | 0.0% | 0.0% | 55% |
| flood 1400 B(客户端尽力约 80 kpps):丢包 / 交付 | ~62% / ~43 MB/s | ~62% / ~44 MB/s | ~60% / ~45 MB/s | ~91% / ~11 MB/s |
mips/system上 TPROXY 与 TUN 的 UDP 丢包同级:小包丢包由「每秒包数」决定,不随转发方式变化;gvisor无论走哪种路径都不可用(55% 以上丢包)。flood 场景交付 TUN ≈ TPROXY(~43–45 MB/s,受客户端发送能力限制),gvisor仅约 1/4。- 旁路由纯转发(不经代理):转发 + NAT 达 97–106 MB/s(≈线路速率),CPU 开销可忽略;
FLOWOFFLOAD开关无差异。
8.4.4 TUN 数据面参数(单连接对照)
mips + gso,单连接 256 MB 批量,其余参数保持默认:
| 参数 | 自身×下载单连接 | LAN×下载单连接 |
|---|---|---|
默认(mtu 1500 / gso-max-size 默认 / cubic) |
165 / 166 | 161 |
mtu: 9000 |
161 / 165 | 159 |
mtu: 1280 |
155 / 157 | 151 |
gso-max-size: 16384 |
161 / 170 | 155 |
congestion-controller: bbr |
156 / 165 | 159 |
endpoint-independent-nat: false |
162 / 166 | 156 |
除
mtu: 1280低约 6%(分段数随 MTU 变小而增多)外,其余差异均在 ±5% 的波动范围内:mtu: 9000、gso-max-size放大、bbr均无收益;endpoint-independent-nat只影响 UDP NAT 行为,对 TCP 单连接无副作用 ⇒ 全部保持默认(见 §8.2.15)。
8.4.5 持续满载、高并发与延迟
四栈对照(gso 开启,路由器自身形态;mips 为原表数据,其余为本轮补测):
| 场景 | mips |
system |
mixed |
gvisor |
|---|---|---|---|---|
| 持续满载 10 分钟:单连接 2 GB 循环(MB/s) | ~165–167 | — | 108–113 | 28.3–28.8 |
| 持续满载 10 分钟:4 连接 2 GB 循环(MB/s) | ~116–120 | — | 95–100 | 54.1–55.0 |
| 40 连接并发(512 MB,MB/s) | ~38–41 | ~46–49 | 46.6 | 56.5 |
| 100 连接并发(512 MB,MB/s) | ~32 | ~35–42 | 40.8 | 48.5 |
| 混合:短连接(20 并发、32 KB)+ 后台 2 连接批量 | 526–714 rps / 83–109 MB/s | — | 183 rps / 60 MB/s | 60 rps / 33 MB/s |
| 延迟(32 KB 请求 ×200):空载 → 满载 | ~2 ms → ~8–12 ms | — | ~2.1 ms → ~43 ms | ~3.3 ms → ~105 ms(含失败) |
四栈连续满载 10 分钟均无衰减(
mixed单连接循环 32+ 轮、gvisor4 连接循环 16 轮全程平稳,无热降频)。并发 ≥40 连接时各栈同档回落(40–57 MB/s,原因见下);gvisor的并发吞吐靠极低的单连接吞吐(~1.4 MB/s)叠加而来,且满载延迟与失败率最差。满载延迟从好到差:mips(升高约 320–360%)<mixed(~43 ms)<gvisor(~105 ms,200 次中失败 4 次)。
吞吐随并发数下降的原因(mips + gso,512 MB 批量;含无代理直连参照)
| 并发连接数 | 2 | 4 | 8 | 16 | 40 | 100 |
|---|---|---|---|---|---|---|
| 吞吐(MB/s) | 143 | 119 | 102 | 81 | 50 | 40 |
| 核心写 tun 的平均合批大小 | 24.3 KB | 13.1 KB | 7.8 KB | 4.2 KB | 2.1 KB | 1.7 KB |
| 每 256 MB CPU(s) | 3.9 | 4.7 | 5.4 | 7.1 | 11.6 | 14.1 |
- 吞吐随连接数平滑下降;40 连接连续传输 2 GB 期间全程稳定,无随时间衰减。核心向 tun 写出的包速率封顶约 2.5 万包/秒,吞吐 ≈ 包速率上限 × 合批尺寸——直接原因是单次写入的合批尺寸随并发数变小(近似 ∝ 1/连接数)。
- 两种栈的每个包/每批都要经用户态处理(
system:用户态地址改写 + 内核 TCP;mips:全用户态 TCP),读/写循环各只有一条运行在单线程上 ⇒ 并发升高后合批失效,逐批处理能力成为瓶颈;每字节 CPU 升至约 3 倍,并伴随重传(最多 1.4 万段);system趋势相同(107 降至 42 MB/s,-61%)。合批为何失效:sing-tun 单次写调用最多向栈取 64 个包、且 GRO 只在该批内合并(github.com/metacubex/sing-tun/stack_mipstack.go、github.com/metacubex/sing-tun/tun_offload_linux.go),而栈输出为全局单队列(256 槽,github.com/metacubex/mipstack/stack.go)⇒ 批内同连接连续包 ≈ 64/并发数。 - 交叉验证(LAN 侧真实客户端):以 PC 作为客户端验证同一路径——40/100 连接 = 59 / 52 MB/s(
mips)、system40 连接 53 MB/s,合批 2.2–2.5 KB、包速率 ~2.5 万/秒,与表中规律一致;不经代理直连时同路径 40/100 连接达 106 / 94 MB/s ⇒ 该下降属 TUN 数据面特有(逐包用户态 + 合批失效),与客户端、链路无关。
8.4.6 内核 sysctl 调优
net.core.rmem_max/wmem_max 调至 16 MB、tcp_rmem/tcp_wmem 调至 16 MB、tcp_congestion_control=bbr、default_qdisc=fq、netdev_max_backlog=5000、netdev_budget=600、tcp_fastopen=3、tcp_max_syn_backlog=8192、somaxconn=8192(mips + gso):
| 阶段 | 自身×下载单连接 | 短连接 rps | LAN×下载单连接 |
|---|---|---|---|
| 默认 | 159 / 159 | 1288 | 141 |
| 全部调优 | 154 / 154 | 1286 | 143 |
| 调优后还原 | 159 / 158 | 1245 | 147 |
同样参数在 REDIRECT / TPROXY 路径(同一测试环境;单连接 MB/s、短连接 rps)上也无影响:
| 阶段 | REDIRECT 单连接(两次) | REDIRECT 短连接 | TPROXY 单连接(两次) | TPROXY 短连接 |
|---|---|---|---|---|
| 默认 | 974 / 1033 | 2368 rps | 1096 / 860 | 2556 rps |
| 全部调优 | 970 / 1078 | 2509 rps | 921 / 804 | 2428 rps |
| 调优后还原 | 1052 / 1129 | 2504 rps | 958 / 1005 | 2443 rps |
TPROXY 的 UDP 场景(200 B @20/40 kpps、1400 B @7.5 kpps、QUIC-40、flood)在三相位间的丢包差异也都在 3 个百分点以内。
调整上述全部参数对三种路径(TUN / REDIRECT / TPROXY)的吞吐、短连接、UDP 丢包影响都在 ±5% 波动范围内(
bbr反而略差)⇒ 无需调优,保持系统默认(bbr模块本身可用:reno cubic bbr)。
File: .github/skills/openclash-user-guide/09-settings-dns-ac-ipv6.md
[Binary file]
File: .github/skills/openclash-user-guide/10-settings-geo-misc-src.md
插件设置:GEO、其他与来源流量控制
用途: 插件设置页的 GEO 订阅、其他(定时重启/版本更新/开发者/oixCloud)与来源流量控制(§10.1–10.3)。
10.1 GEO 数据库订阅 / 大陆白名单订阅标签页
10.1.1 GEO 数据库订阅 (GEO Update / geo_update)
| 数据类型 | 启用 UCI | 更新脚本 | 更新星期 UCI | 更新时间 UCI | 自定义 URL UCI |
|---|---|---|---|---|---|
| 自动更新 GeoIP MMDB 数据库 (Auto Update GeoIP MMDB) | geo_auto_update |
openclash_geo.sh ipdb |
geo_update_week_time |
geo_update_day_time |
geo_custom_url |
| 自动更新 GeoIP Dat 数据库 (Auto Update GeoIP Dat) | geoip_auto_update |
openclash_geo.sh geoip |
geoip_update_week_time |
geoip_update_day_time |
geoip_custom_url |
| 自动更新 GeoSite 数据库 (Auto Update GeoSite) | geosite_auto_update |
openclash_geo.sh geosite |
geosite_update_week_time |
geosite_update_day_time |
geosite_custom_url |
| 自动更新 Geo ASN 数据库 (Auto Update Geo ASN) | geoasn_auto_update |
openclash_geo.sh geoasn |
geoasn_update_week_time |
geoasn_update_day_time |
geoasn_custom_url |
共享配置项:*_update_week_time (周几): *=每天, 1=周一, 2=周二, …, 0=周日; *_update_day_time (小时): 0-23; *_custom_url (自定义下载地址,留空使用默认)
Mihomo 对应: geox-url 中的各字段 + geo-auto-update + geo-update-interval
- 实现细节:
- Cron 触发:
add_cron()(定义在/etc/init.d/openclash)由 GEO 更新脚本调用,为每种 GEO 类型注册 cron 任务 - 下载流程:
openclash_geo.sh使用自定义 URL(*_custom_url)或默认地址下载,保存到/etc/openclash/目录 - Mihomo 使用: MMDB 用于
GEOIP规则匹配(IP→国家),Dat 用于GEOSITE规则匹配(域名→类别),ASN 用于 Smart 策略 - 更新后重启: GEO 文件更新成功后
openclash_geo.sh置restart=1并由dec_job_counter_and_restart触发/etc/init.d/openclash restart(yml_change.sh不写geo-auto-update;默认 YAML 里该值为false)
- Cron 触发:
10.1.2 大陆白名单订阅 (Chnroute Update / chnr_update)
| 选项 | UCI Key | 默认 | 说明 |
|---|---|---|---|
| 自动更新 (Auto Update) | chnr_auto_update |
0 | 启用定时更新大陆 IP 路由表 |
| 更新时间/每周 (Update Time (Every Week)) | chnr_update_week_time |
1(周一) |
*=每天, 1=周一, …, 0=周日 |
| 更新时间/每天 (Update time (every day)) | chnr_update_day_time |
0(0:00) |
0-23,每小时一个选项 |
| 大陆 IP 段更新 URL (Custom Chnroute Lists URL) | chnr_custom_url |
https://ispip.clang.cn/all_cn.txt |
中国 IPv4 CIDR 列表下载地址 |
| 大陆 IPv6 段更新 URL (Custom Chnroute6 Lists URL) | chnr6_custom_url |
https://ispip.clang.cn/all_cn_ipv6.txt |
中国 IPv6 CIDR 列表下载地址 |
更新脚本: openclash_chnroute.sh
10.2 其他标签页
10.2.1 定时重启 (Auto Restart / auto_restart)
此标签页用于设置 OpenClash 定时自动重启。
| 选项 | UCI Key | 类型 | 默认 | 说明 |
|---|---|---|---|---|
| 定时重启 (Auto Restart) | auto_restart |
Flag | 0 | 0=关闭, 1=开启。开启后将在指定时间自动重启 OpenClash 服务 |
| 重启时间/每周 (Restart Time (Every Week)) | auto_restart_week_time |
ListValue | 1(周一) |
*=每天 (Every Day), 1=周一 (Every Monday), 2=周二 (Every Tuesday), 3=周三 (Every Wednesday), 4=周四 (Every Thursday), 5=周五 (Every Friday), 6=周六 (Every Saturday), 0=周日 (Every Sunday) |
| 重启时间/每天 (Restart time (every day)) | auto_restart_day_time |
ListValue | 0(0:00) |
0-23,每小时一个选项 |
- 实现细节:
add_cron()在/etc/crontabs/root中添加/etc/init.d/openclash restart的 cron 条目,按用户选择的时间和星期执行。
10.2.2 版本更新 (Version Update / version_update)
此标签页内嵌「检查更新」面板(update 模板的 version_tab 模式),以 CDN 地址列表 为核心,提供核心/插件版本选择、下载和更新操作。页面加载时通过 /update(action_update,本机配置与已装版本)、/version_history(版本历史)、/addr_info(CDN 地址列表)API 动态填充。远程最新版本(corelv/oplv,status 页红点用)由独立 /last_version 端点提供,本面板不使用。
顶部配置区(4 列,修改后自动保存):
| 选项 | UCI Key | 类型 | 默认 | 说明 |
|---|---|---|---|---|
| 处理器架构 (CPU Arch) | —(只读展示) | 文本 | — | 当前设备 CPU 架构,来自后端 coremodel(优先读 /etc/openwrt_release 的 DISTRIB_ARCH,opkg/apk 包数据库 libc 架构兜底),仅展示不可选 |
| 编译版本 (Compiled Version) | core_version |
Select | 安装时由 uci-defaults/luci-openclash 按 DISTRIB_ARCH 自动填入(如 x86_64 → linux-amd64-v1) |
选择与 CPU 匹配的编译版本:linux-amd64-v1/v2/v3(x86-64)、linux-arm64(armv8)、linux-armv7、linux-mips64 等 ~18 种架构。探测失败或为空时内核无法下载,点击会提示 "No Compiled Version Selected" |
| 更新分支 (Release Branch) | release_branch |
Select | master |
master(稳定版) / dev(开发版),决定插件/内核的下载分支 |
| Smart 内核 (Smart Core) | smart_enable |
Select | 0 |
0=禁用(使用 Meta 内核) / 1=启用(使用 Smart 内核),决定内核下载的 meta/smart 子路径 |
版本卡片(Installed / Select Version):
| 要素 | 显示内容 | 说明 |
|---|---|---|
| Installed(插件) | 已安装插件版本 | 只读,从 opkg/apk 包数据库读取(opcv) |
| Select Version(插件) | 插件版本下拉 | 来自 /version_history(package 分支的 CI commit),选项值为对应 commit 的 sha,Latest=最新版 |
| Installed(内核) | 已安装内核版本 | 只读,执行 clash_meta -v 获取(coremetacv) |
| Select Version(内核) | 内核版本下拉 | 来自 /version_history(core 分支的 CI commit),Latest=最新版 |
hint 提示区:默认显示随机提示(自动轮换)/ 操作错误提示 / 更新过程中的流式日志——点击更新后直接在提示区显示 startlog 日志(剥离时间戳,[Info]/[Warning]/[Error] 着色,固定高度滚动)。
CDN 地址列表(Address / Latency / Plugin / Core 四列):
- 预设 CDN:
raw.githubusercontent.com(RAW 直连)、fastly.jsdelivr.net、testingcf.jsdelivr.net、cdn.jsdelivr.net;也可在底部「Custom Your CDN URL」添加自定义 CDN(如https://ghfast.top/,添加后只拉取新增 CDN) - 每行 Latency 列显示测速延迟(
xxx ms,按快/中/慢着色);插件、内核、延迟三处只要有一处失败(延迟超时/无法访问,或该 CDN 没返回所选插件/内核版本),整行只显示一条错误信息(Access Timed Out/Access Denied,横跨 Latency/Plugin/Core 三列,版本列留空);三处都正常时 Plugin/Core 列显示该 CDN 获取到的插件/内核版本号 - 点击版本号链接 = 只安装该组件(插件→
one_key_update?update_type=plugin,内核→core_download);点击右侧下载图标按钮 = 直接下载对应 .ipk/.apk 或 .tar.gz - 点击行其他区域 = 一键更新插件 + 内核,根据两个 Select Version 下拉决定更新到历史版本还是 Latest
- 更新后面板保持打开,日志在 hint 区流式显示
底部操作区:
| 操作 | 功能 |
|---|---|
| 备份 (Backup File) | 先选备份范围下拉(Backup File 完整 / Backup Exclude Cores 排除内核 / Backup Core 仅内核 / Backup Config 仅配置 / Backup Rule Provider 仅规则提供者 / Backup Proxy Provider 仅代理提供者),再点按钮下载备份 |
| 还原默认 (Restore Default) | 恢复 OpenClash 为默认出厂配置(确认后跳回设置页) |
| 删除内核 (Remove Core) | 删除所有核心二进制文件(红色危险按钮) |
- 实现细节:
- 所有配置修改(编译版本/分支/Smart)通过
/save_corever_branchAPI 即时保存到 UCI。 - 内核下载:
core_download路由调用openclash_core.sh,前端始终传入完整下载 URL(download_url)。文件名clash-{arch}.tar.gz(arch 即core_version,已带linux-前缀);oix 内核为mihomo-{arch}-{version}.gz(走 github release / dl.dler.io)。 - 插件下载:
openclash_update.sh,文件名luci-app-openclash_{ver}_all.ipk(opkg)或luci-app-openclash-{ver}.apk(apk)。 - 下载 URL 结构:
package/core是仓库分支(非目录)。Latest(无历史 sha):package/{branch}/luci-app-openclash_{ver}_all.ipk、core/{branch}/{meta|smart}/clash-{arch}.tar.gz(把分支名作为 ref 段);选择历史版本(带 sha,为对应分支的 CI commit):{sha}/{branch}/luci-app-openclash_{ver}_all.ipk、{sha}/{branch}/{meta|smart}/clash-{arch}.tar.gz。jsdelivr CDN 前缀为gh/vernesong/OpenClash@{ref}/...,自定义 CDN 前缀直接拼接 raw URL。 - 下载失败不会触发 OpenClash 重启(
openclash_core.sh仅在内核真正更新成功后才置重启标志)。 - sha256sum 校验:下载内核/插件包后,脚本用发布目录的
checksums.txt比对实际哈希(openclash_curl.sh的verify_sha256_checksum());校验失败会中止更新,日志报Checksum Verification Failed等(见03-errors.md§3.4)。 - 插件更新通过 ubus 后台安装以避免 Web 界面断连。
- 所有配置修改(编译版本/分支/Smart)通过
10.2.3 开发者选项 (Developer Settings / developer)
- 自定义防火墙规则 (
firewall_custom): 在 LuCI 的「开发者设置」标签页中直接编辑的文本框,内容保存到/etc/openclash/custom/openclash_custom_firewall_rules.sh。该脚本不需要定义任何函数——它是一个命令式 Shell 脚本,在所有 OpenClash 内置防火墙规则添加完毕后被直接执行(chmod +x后运行)。可以在脚本中直接写iptables -I ...或nft add rule ...命令来追加自定义防火墙规则。 - 实现细节:
set_firewall()函数在所有内置的 REDIRECT/TPROXY/TUN/IPv6/访问控制规则建立完毕后,检查此文件是否存在,若存在则chmod +x并执行。由于它在所有内置规则之后运行,自定义规则可以引用 OpenClash 已创建的 nftables 链和 set。每次 OpenClash 启动或防火墙重载时都会重新执行此脚本。
10.2.4 内核测试 (Core Test / debug)
此标签页提供二种独立的诊断工具,位于「内核测试」标签页:
| 工具 | 功能 | 触发方式 | 后端路由 |
|---|---|---|---|
| 连接测试 (Connection Test) | 测试指定域名是否可达 | 输入域名 + 点击「Click to Test」(点击测试) 按钮 | /diag_connection |
| DNS 测试 (DNS Test) | 测试 DNS 解析结果 | 输入域名 + 点击「Click to Test」(点击测试) 按钮 | /diag_dns |
连接测试实现细节: 前端先尝试 Image 加载 https://{domain}/favicon.ico 作为快速预检,若失败则回退到后端 /diag_connection 调用。
10.2.5 oixCloud (oixcloud)
- 第三方云服务,需账号密码登录
oix_email/oix_passwd→oix_login获取 tokenoix_checkin— 自动签到 (需 token)- 登录后自动获取 Oix 专属核心和订阅
10.3 来源流量访问控制 (Source Traffic Bypass / lan_ac_traffic)
页面位置:插件设置页面底部(不属于任何标签页,以独立的 TypedSection 形式存在)
生效路径:通过init.d/openclash的firewall_lan_ac_traffic()函数在代理链 position 0 插入规则,
优先级高于所有其他代理规则。配置通过config_foreach firewall_lan_ac_traffic "lan_ac_traffic"遍历执行。AI 行为指引:当用户询问「如何让某个接口(如 WireGuard/Docker 网桥)的流量完全绕过内核」、
「如何按用户 UID 绕过代理」、「如何精细控制特定来源流量」时,AI 应告知用户使用此功能,
并结合下方字段表和防火墙逻辑给出具体配置方案。涉及底层实现时查阅
OpenClash 源码 中init.d/openclash的firewall_lan_ac_traffic()函数。
10.3.1 lan_ac_traffic TypedSection
支持按七维度组合匹配流量,匹配后执行 target 动作:
| 字段 | UCI Key | 类型 | 说明 |
|---|---|---|---|
| 备注 | comment |
Value | 规则说明 |
| 启用 | enabled |
Flag | 默认 1 |
| 内部地址 | src_ip |
Value | IP/CIDR/localnetwork(匹配本地网络地址集 @localnetwork) |
| 内部端口 | src_port |
Value | 端口或范围,如 5000 或 1234-2345 |
| 协议 | proto |
ListValue | both(默认)/tcp/udp |
| 地址族 | family |
ListValue | both(默认)/ipv4/ipv6 |
| 接口 | interface |
ListValue | 网络接口名(如 eth1、wg0、docker0),匹配从该接口进入的流量 |
| 用户 | user |
ListValue | Linux UID,匹配该用户进程发出的流量(仅 OUTPUT 链生效) |
| DSCP | dscp |
Value | 0-63,匹配 IP 头 DSCP 标记值 |
| 目标 | target |
ListValue | RETURN(默认,跳过代理走直连) / ACCEPT(放行) / DROP(静默丢弃) |
10.3.2 防火墙工作逻辑(基于 `init.d/openclash` → `firewall_lan_ac_traffic()` 源码)
规则生成流程:
config_foreach firewall_lan_ac_traffic "lan_ac_traffic"
→ 读取每个启用的 section 的 UCI 字段
→ 构建 nftables/iptables 匹配条件
→ 按运行模式 + 协议 + 地址族插入对应链的 position 0fw4 (nftables) 规则插入的目标链(按运行模式区分):
| 运行模式 | TCP 进入 | TCP 发出 | UDP 进入 | UDP 发出 | 旁路由 SNAT |
|---|---|---|---|---|---|
| 非 TUN(redir-host/fake-ip) | openclash |
openclash_output |
openclash_mangle |
openclash_mangle_output |
openclash_post |
| TUN 模式 | openclash_mangle |
openclash_mangle_output |
openclash_mangle |
openclash_mangle_output |
openclash_post |
| IPv6(ipv6_enable=1) | openclash_v6 |
openclash_output_v6 |
openclash_mangle_v6 |
openclash_mangle_output_v6 |
openclash_post_v6 |
关键匹配逻辑:
src_ip=localnetwork:特殊值,nftables 端展开为ip saddr @localnetwork(匹配整个本地网络地址集),iptables 端使用-m set --match-set localnetwork src- 接口匹配:nftables 用
iifname "接口名",iptables 用-i 接口名 - 用户匹配:nftables 用
meta skuid UID(仅 OUTPUT 链生效),iptables 用-m owner --uid-owner UID - DSCP 匹配:nftables 用
ip dscp 值,iptables 需dscp模块(不可用时跳过并输出警告:iptables DSCP module not available) - Fake-IP 排除:所有规则自动排除 Fake-IP 地址段
ip daddr != {198.18.0.0/16},避免影响 Fake-IP 内部映射 - drop→return 转换:当
target=DROP时,nftables 实际动作为return(因 mangle 链不支持 drop),iptables 保持DROP
常见场景示例:
| 需求 | 规则配置 |
|---|---|
| 某接口(如 WireGuard)流量不走代理 | interface=wg0, target=RETURN |
| Docker 网桥流量绕过内核 | interface=docker0, target=RETURN |
| 某设备所有流量不走代理 | src_ip=192.168.1.100/32, target=RETURN |
| 某端口范围的 TCP 流量不走代理(BT 端口) | src_port=6881-6889, proto=tcp, target=RETURN |
| 某用户进程流量完全丢弃 | user=65534, target=DROP |
| 本地网络所有 UDP 流量直连 | src_ip=localnetwork, proto=udp, target=RETURN |
File: .github/skills/openclash-user-guide/11-overwrite-settings.md
覆写设置页面 (Overwrite Settings / config-overwrite)
用途: 覆写设置页各 CBI 选项:常规、DNS、Meta、Smart、规则与认证(§11.1–11.7)。
小节索引: §11.1 实现总览 · §11.2 常规 · §11.3 DNS · §11.4 Meta · §11.5 Smart · §11.6 规则 · §11.7 认证
UCI Section:
openclash.config_overwrite
此页面用于覆写订阅配置中的特定字段,设置后通过 openclash.sh 脚本注入到生成的 YAML 中
11.1 实现总览
UCI config_overwrite 写入
│
▼
yml_change.sh (优先级最高) yml_rules_change.sh
├─ 端口、模式、DNS、TUN ├─ tolerance / url-test 覆写
├─ Sniffer、认证、Meta ├─ GitHub CDN 替换
├─ GEO、Smart、NTP ├─ enable_rule_proxy → BT/P2P 直连
└─ 自定义 DNS servers └─ 自定义规则注入关键机制: yml_change.sh 以 YAML 深度合并 + 覆盖的方式修改配置,覆写优先级高于订阅原始值。yml_rules_change.sh 使用 Ruby YAML 库操作策略组、规则、URL-Test 参数和规则提供者地址。
两个脚本在 start_service() 流程中先于核心启动执行。
11.2 常规设置标签页 (General Settings / settings)
11.2.1 interface_name — 绑定网络接口 (Bind Network Interface)
- UCI:
openclash.@config_overwrite[0].interface_name - 默认: 0 (禁用)
- 说明: 绑定核心出站流量到指定网络接口
- Mihomo 对应:
interface-name - 实现细节:
yml_change.sh将值写入 YAMLinterface-name。Mihomo 内核所有出站连接(代理节点连接、DNS 查询、GEO 下载)都通过此接口发送。用于多 WAN 环境指定出口。
11.2.2 tolerance — URL-Test 策略组切换灵敏度 (URL-Test Group Tolerance)
- UCI:
openclash.@config_overwrite[0].tolerance - 默认: 0 (禁用)
- 说明: 当前代理与新最快代理的延迟差值大于此值时自动切换。0 表示关闭
- Mihomo 对应: proxy-groups 中 url-test 类型的
tolerance字段 - 实现细节:
yml_rules_change.sh遍历所有type: url-test的策略组,设置其tolerance值。Mihomo 内核定期测试组内所有节点延迟,当当前选中节点的延迟与新最快节点的延迟差 > tolerance 时自动切换。设为 0 则每次测试都切换到最快节点。
11.2.3 urltest_address_mod — 测速(连通性)地址修改 (URL-Test Address Modify)
- UCI:
openclash.@config_overwrite[0].urltest_address_mod - 默认: 0 (禁用)
- 预设:
http://www.gstatic.com/generate_204/http://cp.cloudflare.com/generate_204/https://cp.cloudflare.com/generate_204/http://captive.apple.com/generate_204 - Mihomo 对应: proxy-groups 中 url-test 类型的
url字段 - 实现细节:
yml_rules_change.sh替换所有 url-test 策略组的测试 URL。Mihomo 内核周期性向此 URL 发送 HTTP HEAD/GET 请求测量延迟,作为节点选择的依据。
11.2.4 github_address_mod — Github 地址修改 (GitHub Address Proxy)
- UCI:
openclash.@config_overwrite[0].github_address_mod - 说明: 通过代理/CDN 加速 GitHub 文件下载。强烈推荐在 OpenClash 启动前就设置好此项,因为插件和内核更新、GEO 数据库下载、Dashboard 下载均依赖 GitHub 连通性。推荐优先尝试
https://testingcf.jsdelivr.net/(jsDelivr 的 Cloudflare CDN),如不可用再切换其他 CDN - 预设: 多个 jsdelivr CDN 地址(testingcf / fastly 等)
- 实现细节:
yml_rules_change.sh用 Ruby 正则/raw\.githubusercontent\.com/匹配所有 rule-providers 和 proxy-providers 的url字段,将域名替换为 CDN 地址。解决中国大陆无法访问 GitHub 的问题。 - 已知限制:
github_address_mod仅对 rule-providers 和 proxy-providers 的 URL 生效。openclash_download_dashboard.sh(Dashboard 下载)和openclash_geo.sh(GEO 更新)不使用此变量,这些脚本的下载 URL 为硬编码的 GitHub 直连地址。如需对 Dashboard/GEO 下载使用 CDN,可通过覆写模块的[General]段设置DOWNLOAD_FILE或使用自定义规则使相关域名直连。
11.2.5 log_level — 日志等级 (Log Level)
- UCI:
openclash.@config_overwrite[0].log_level - 可选值:
0(禁用) /info/warning/error/debug/silent - Mihomo 对应:
log-level - 0 表示不覆写,使用订阅原有设置
- 实现细节:
yml_change.sh将值写入 YAMLlog-level。Mihomo 内核根据级别过滤日志输出:silent(无输出) →error(仅错误) →warning(+警告) →info(+一般信息) →debug(+调试详情)。
11.2.6 端口设置
| 端口用途 | UCI Key | 默认 | Mihomo 对应 |
|---|---|---|---|
| DNS 端口 (DNS Port) | dns_port |
7874 | dns.listen |
| 流量转发端口 (Redir Port) | proxy_port |
7892 | listeners.redirect (仅 TCP) |
| TProxy 端口 (TProxy Port) | tproxy_port |
7895 | listeners.tproxy (TCP+UDP) |
| HTTP(S) 代理端口 (HTTP(S) Port) | http_port |
7890 | listeners.http |
| SOCKS5 代理端口 (SOCKS5 Port) | socks_port |
7891 | listeners.socks |
| HTTP(S)&SOCKS5 混合代理端口 (Mixed Port) | mixed_port |
7893 | listeners.mixed (HTTP+SOCKS) |
- 端口实现细节:
yml_change.sh将所有端口写入 YAML 对应字段。Mihomo 内核启动时在这些端口上创建监听器,接受来自 iptables/nftables 重定向的流量或客户端直连的代理请求。修改后需重启插件(本页「应用设置」会自动执行/etc/init.d/openclash restart)。
11.3 DNS 设置标签页 (DNS Settings / dns)
生效路径: DNS 覆写通过
yml_change.sh的yml_dns_custom()函数处理,
构建完整的dns:YAML 段并合并到运行配置。AI 行为指引: 当用户询问 DNS 配置问题时(如"如何配置 DoH/DoT"、"nameserver-policy 怎么写"、"hosts 格式是什么"、
"fallback-filter 各字段含义"等),AI 应查阅 Mihomo DNS 配置文档
了解各字段的详细含义和用法,涉及 OpenClash 侧 DNS 覆写实现时查阅
OpenClash 源码 中yml_change.sh的yml_dns_custom()函数,
然后结合 OpenClash 覆写模块的操作方式告知用户如何配置,而非仅给出文档链接。
11.3.1 enable_custom_dns — 自定义上游 DNS 服务器 (Custom DNS Setting)
- UCI:
openclash.@config_overwrite[0].enable_custom_dns - 默认: 0
- 说明: 开启后将通过 TypedSection
dns_servers中的配置覆写 YAML 的dns段 - 最佳实践: 在 Fake-IP 模式下推荐以下配置策略:① Nameserver 仅负责直连类域名的解析(使用运营商 DNS 或国内 DoH 如 AliDNS/DNSPod);② 取消所有 Fallback 服务器——Fake-IP 模式下若无 Fallback,非直连域名的解析请求将交由远端(代理节点侧)完成,解析结果与实际出站链路一致,可获得更一致的 CDN 命中并防止 DNS 泄露;③ 若出站侧解析不可用(罕见),可启用 Fallback 作为兜底并同时开启「遵循规则」功能。不建议套娃其他 DNS 插件(如 MosDNS/SmartDNS/AdGuardHome),多插件叠加会引入缓存一致性问题、增加内网解析延迟,且破坏 Mihomo 向客户端传递的 TTL 值
- 实现细节: 开启后
yml_dns_custom()遍历所有dns_servers条目,按 group 分类(nameserver/fallback/default)构建 DNS 服务器列表,通过 Ruby YAML 合并写入dns.nameserver、dns.fallback、dns.default-nameserver。
11.3.2 enable_respect_rules — 遵守路由规则 (Respect Rules)
- UCI:
openclash.@config_overwrite[0].enable_respect_rules - 默认: 0
- Mihomo 对应:
dns.respect-rules - 说明: DNS 连接是否遵守 YAML 中的路由规则
- 实现细节: 写入 YAML
dns.respect-rules: true。Mihomo 内核的 DNS 解析器发出的连接将经过rules规则引擎匹配——意味着 DNS 查询本身也会被代理(通过匹配的代理节点发出),防止 DNS 泄露。需要配合proxy-server-nameserver防止鸡生蛋问题。
11.3.3 append_wan_dns — 附加上游 DNS (Append Upstream DNS)
- UCI:
openclash.@config_overwrite[0].append_wan_dns - 默认: CBI 未设值时相当于开(
Flag,源码里o.default = 1),但出厂/etc/config/openclash已显式写入0⇒ 装好后的界面里是关的 - 说明: 将 WAN 口自动分配的运营商 DNS 和网关 IP 追加到 nameserver 列表。主路由拨号环境推荐启用:运营商 DNS 对直连类域名的解析延迟通常最低(1-2ms),CDN 命中更接近实际链路,省去手动配置的麻烦。若使用第三方加密 DNS(如 DoH/DoT),则需禁用此项并在 NameServer 中手动添加服务器
- 实现细节:
sys_dns_append()调用openclash_get_network.lua获取 WAN 口的 DNS 和网关地址,追加到/tmp/yaml_config.namedns.yaml,后续被合并到 YAMLdns.nameserver。支持 dhcp:// 协议直接从 DHCP 接口获取 DNS。
11.3.4 fakeip_range — Fake-IP 范围 (IPv4) (Fake-IP Range)
- UCI:
openclash.@config_overwrite[0].fakeip_range - 默认: 0 (禁用)
- 预设:
198.18.0.1/16(标准 Fake-IP 段) - Mihomo 对应:
dns.fake-ip-range - 仅: Fake-IP 模式显示
- 实现细节: 写入 YAML
dns.fake-ip-range。Mihomo 在 Fake-IP 模式下,将 DNS 查询的域名映射到此 CIDR 段中的虚拟 IP。应用连接到虚拟 IP 时内核通过路由表将流量导向 Mihomo,Mihomo 根据映射表还原真实域名后进行规则匹配。
11.3.5 store_fakeip — 持久化 Fake-IP (Persistence Fake-IP)
- UCI:
openclash.@config_overwrite[0].store_fakeip - 默认: CBI 未设值时相当于开(
o.default = 1),但出厂/etc/config/openclash已显式写入0 - Mihomo 对应:
profile.store-fake-ip - 说明: 缓存 Fake-IP DNS 解析记录到文件,启动后加速响应
- 实现细节: 写入 YAML
profile.store-fake-ip: true。Mihomo 将域名→Fake-IP 映射持久化到cache.db文件,重启后恢复映射,避免重启后所有域名需要重新解析。
11.3.6 custom_fallback_filter — 自定义 Fallback-Filter (Fallback-Filter)
- UCI:
openclash.@config_overwrite[0].custom_fallback_filter - 默认: 0
- 说明: 配置 DNS 防污染回退过滤器
- 配置文件:
/etc/openclash/custom/openclash_custom_fallback_filter.yaml - Mihomo 对应:
dns.fallback-filter段
Fallback-Filter 格式示例:
yamlgeoip: true geoip-code: CN geosite: - gfw domain: - '+.google.com'
11.3.7 custom_fakeip_filter — 自定义 Fake-IP-Filter (Fake-IP-Filter)
- UCI:
openclash.@config_overwrite[0].custom_fakeip_filter - 默认: 0
- 仅: Fake-IP 模式显示
- Mihomo 对应:
dns.fake-ip-filter
11.3.8 custom_fakeip_filter_mode — Fake-IP-Filter 模式 (Fake-IP-Filter-Mode)
- UCI:
openclash.@config_overwrite[0].custom_fakeip_filter_mode - 可选:
blacklist/whitelist/rule - 默认:
blacklist - 说明:
blacklist: 匹配成功的域名不返回 Fake-IP (黑名单)whitelist: 只有匹配成功的域名返回 Fake-IP (白名单)rule: 规则模式,支持 GEOSITE、RuleSet、DOMAIN* 等语法
- Mihomo 对应:
dns.fake-ip-filter-mode
11.3.9 域名过滤文件 (custom_fake_filter)
- 文件:
/etc/openclash/custom/openclash_custom_fake_filter.list - 格式: 每行一个域名通配符,如
*.lan,+.example.com
11.3.10 custom_name_policy — 自定义 Nameserver-Policy (Nameserver-Policy)
- UCI:
openclash.@config_overwrite[0].custom_name_policy - 文件:
/etc/openclash/custom/openclash_custom_domain_dns_policy.list - Mihomo 对应:
dns.nameserver-policy - 格式: 每行
域名=DNS服务器组或使用 geosite/rule-set
11.3.11 custom_proxy_server_policy — 自定义 Proxy-Server-Nameserver-Policy (Proxy-Server-Nameserver-Policy)
- UCI:
openclash.@config_overwrite[0].custom_proxy_server_policy - 文件:
/etc/openclash/custom/openclash_custom_proxy_server_dns_policy.list - Mihomo 对应:
dns.proxy-server-nameserver-policy - 说明: 仅用于解析代理节点域名的 DNS 策略
11.3.12 custom_host — 自定义 Hosts (Hosts)
- UCI:
openclash.@config_overwrite[0].custom_host - 文件:
/etc/openclash/custom/openclash_custom_hosts.list - Mihomo 对应:
dns.hosts
11.3.13 DNS 服务器列表 (dns_servers TypedSection)
AI 行为指引: 当用户询问 DNS 服务器类型(如"DoH 和 DoT 有什么区别"、"quic 类型怎么用"、
"dns 服务器的#proxy和#RULES后缀是什么意思")时,AI 应查阅
Mihomo DNS 类型文档 了解每种 DNS 协议的使用方法和参数,
涉及 OpenClash 侧实现时查阅 OpenClash 源码 中yml_change.sh的 DNS 相关逻辑,然后告知用户具体的配置写法。
用户可以添加多条 DNS 服务器记录,每条包含:
| 字段 | UCI Key | 说明 |
|---|---|---|
| 启用 | enabled |
Flag,默认 1 |
| 分组 | group |
nameserver(默认DNS) / fallback(后备DNS) / default(默认DNS) |
| 地址 | ip |
DNS 服务器 IP |
| 端口 | port |
端口号 |
| 类型 | type |
udp / tcp / tls / https / quic |
| 禁用 IPv6 | disable_ipv6 |
丢弃 AAAA 记录 |
Mihomo YAML 格式示例:
dns:
nameserver:
- 223.5.5.5
- tls://8.8.4.4
fallback:
- tls://1.1.1.1DNS 服务器地址后缀语法(#):
nameserver / fallback / default-nameserver / proxy-server-nameserver / nameserver-policy 的值都支持在 # 后追加“出站方式”,多个后缀用 & 连接:
| 后缀 | 含义 | 示例 |
|---|---|---|
#RULES |
按内核 rules 决定出站,无需指定策略组名(github.com/metacubex/mihomo/tunnel/dns_dialer.go 的 DnsRespectRules);匹配对象为该 DNS 服务器的域名或解析出的 IP,命中策略组走代理、命中 DIRECT 直连,结果见内核连接日志 |
'https://dns.google/dns-query#RULES' |
#<策略组名/节点名> |
强制经该策略组/节点查询。名字必须精确存在,否则会被当成出站网卡名(dialer.WithInterface)而静默失败 |
'https://dns.google/dns-query#🚀 节点选择' |
#<网卡名> |
从指定网卡发出 | '8.8.8.8#eth0' |
#k=v |
传给该协议的参数,可与上面的出站后缀用 & 组合。常见参数:h3=true(DoH 强制 HTTP/3,github.com/metacubex/mihomo/dns/doh.go)、skip-cert-verify=true、name-cert-verify=(DoH/DoT/DoQ)、disable-reuse=true(DoT)、ecs=(EDNS Client Subnet)、disable-ipv4=true/disable-ipv6=true |
'https://dns.google/dns-query#Proxy&h3=true' |
#RULES与全局「遵守路由规则 (respect-rules)」的区别:全局开关开启时还必须配置proxy-server-nameserver,否则内核启动即报错(if “respect-rules” is turned on, “proxy-server-nameserver” cannot be empty);写成#RULES只影响这一条服务器,不触发该强校验,也不用预先配置proxy-server-nameserver- 实现:
github.com/metacubex/mihomo/config/config.go的parseNameServer()把#后不含=的片段当作proxyName;github.com/metacubex/mihomo/tunnel/dns_dialer.go中proxyName == "RULES"(常量DnsRespectRules)时调用resolveMetadata()走规则引擎 - 插件内置示例:覆写模块
Google_Play的'https://8.8.8.8/dns-query#RULES'与'https://dns.google/dns-query#RULES'两条并发查询
11.4 Meta 设置标签页 (Meta Settings / meta)
生效路径: Meta 选项通过
yml_change.sh写入 YAML,所有选项在 Mihomo 启动时加载生效。
部分选项(sniffer)支持运行时通过 API 热修改。AI 行为指引: 当用户询问 Meta 相关问题(如"tcp-concurrent 和 unified-delay 有什么区别"、
"find-process-mode 各模式的含义"、"sniffer 如何自定义"、"geodata-loader 选哪个"),
AI 应查阅 Mihomo 全局配置文档 和
Mihomo Sniffer 文档 了解各选项的详细含义,
涉及 OpenClash 侧 Meta 选项注入实现时查阅 OpenClash 源码 中yml_change.sh的 sniffer/Meta 相关段,然后结合 OpenClash 的覆写设置操作路径告知用户。
11.4.1 enable_tcp_concurrent — 启用 TCP 并发 (Enable Tcp Concurrent)
- UCI:
openclash.@config_overwrite[0].enable_tcp_concurrent - 默认: 0
- Mihomo 对应:
tcp-concurrent: true - 说明: 同时使用 DNS 解析的所有 IP 地址发起连接,使用最先成功的连接
- 实现细节:
yml_change.sh写入 YAMLtcp-concurrent: true。Mihomo 对每个目标域名解析出所有 IP 后,同时向所有 IP 发起 TCP 连接,使用第一个 TCP 握手成功的连接,丢弃其余。可大幅降低首次连接延迟,但会增加并发连接数。
11.4.2 enable_unified_delay — 启用统一延迟 (Enable Unified Delay)
- UCI:
openclash.@config_overwrite[0].enable_unified_delay - 默认: 0
- Mihomo 对应:
unified-delay: true - 说明: 消除连接握手等带来的不同类型节点延迟差异
- 实现细节: 写入 YAML
unified-delay: true。Mihomo 在 URL-Test 延迟测量时计算 RTT(Round-Trip Time),而非简单的 TCP 握手时间 + HTTP 响应时间。这样 Shadowsocks、Trojan、VMess 等不同协议的节点延迟可公平比较。
11.4.3 find_process_mode — 启用进程规则 (Enable Process Rule)
- UCI:
openclash.@config_overwrite[0].find_process_mode - 可选值:
0(禁用) /off/always/strict - 默认: 0
- Mihomo 对应:
find-process-mode - 说明: 依赖
kmod-inet-diag内核模块。路由器上推荐off以提升性能 - 实现细节: 写入 YAML
find-process-mode。控制 Mihomo 是否通过 Netlink INET_DIAG 匹配每个连接的发起进程名(用于 PROCESS-NAME 规则)。路由器上设为off可避免内核模块依赖和性能开销。
11.4.4 enable_meta_sniffer — 启用流量(域名)探测 (Enable Sniffer)
- UCI:
openclash.@config_overwrite[0].enable_meta_sniffer - 默认: 0 (关闭)
- Mihomo 对应:
sniffer.enable: true - 说明: 防止域名代理和 DNS 劫持失败。通过嗅探 TLS/HTTP/QUIC 握手获取真实目标域名
- 实现细节:
yml_change.sh写入完整的sniffer:YAML 段:sniff.TLS.ports: [443, 8443]— 解析 TLS ClientHello 中的 SNI 字段获取域名sniff.HTTP.ports: [80, 8080-8880]— 解析 HTTP Host 头获取域名sniff.QUIC.ports: [443]— 解析 QUIC Initial 包中的 SNIforce-dns-mapping: true(仅 Redir-Host) — 对 DNS 解析过的 IP 强制嗅探override-destination: false— 用嗅探到的域名覆盖连接目标,确保规则基于域名匹配- 预置
force-domain: ['+.netflix.com', '+.nflxvideo.net', '+.amazonaws.com', '+.media.dssott.com']— 强制嗅探流媒体 - 预置
skip-domain: ['Mijia Cloud', 'dlg.io.mi.com', '+.oray.com', '+.sunlogin.net', '+.push.apple.com']— 跳过智能家居/推送
11.4.5 enable_meta_sniffer_pure_ip — 探测(嗅探)纯 IP 连接 (Forced Sniff Pure IP)
- UCI:
openclash.@config_overwrite[0].enable_meta_sniffer_pure_ip - 默认: 1
- Mihomo 对应:
sniffer.parse-pure-ip: true - 说明: 强制识别所有拿不到域名的连接(比如直接连 IP 的流量)
11.4.6 enable_meta_sniffer_custom — 自定义流量探测(嗅探)设置 (Custom Sniffer Settings)
- UCI:
openclash.@config_overwrite[0].enable_meta_sniffer_custom - 默认: 0
- 说明: 启用后将使用下方文本框中的自定义 sniffer YAML 配置替代默认嗅探设置
11.4.7 sniffer_custom — 自定义 Sniffer 文本框 (Sniffer Custom)
- UCI:
openclash.@config_overwrite[0].sniffer_custom - 存储:
/etc/openclash/custom/openclash_custom_sniffer.yaml - 说明: 多行 YAML 文本框,可自定义完整的
sniffer:配置段。仅在enable_meta_sniffer_custom=1时生效
11.4.8 geodata_loader — Geodata 数据加载方式 (Geodata Loader Mode)
- UCI:
openclash.@config_overwrite[0].geodata_loader - 可选值:
0(禁用) /memconservative/standard - 默认:
0(禁用;yml_change.sh仅在非 0 时才写入该键) - Mihomo 对应:
geodata-loader - 说明:
memconservative专为小内存设备优化的加载器(逐段读取),standard为标准加载器(一次性加载到内存,速度快但占内存)
11.4.9 enable_geoip_dat — 启用 GeoIP Dat 版数据库 (Enable GeoIP Dat)
- UCI:
openclash.@config_overwrite[0].enable_geoip_dat - 默认: 0
- Mihomo 对应:
geodata-mode: true - 说明: 使用 Dat 格式替换 MMDB 格式 GeoIP 文件。Dat 文件较大需单独下载,可通过「GEO 数据库订阅」页面获取
11.4.10 global_ua — 全局 User-Agent (Global User-Agent)
- UCI:
openclash.@config_overwrite[0].global_ua - 默认: 0 (禁用,使用系统默认
clash.meta) - Mihomo 对应:
global-ua - 预设:
clash-verge/v2.4.5/clash.meta/1.19.20/Clash - 说明: 设置 Mihomo 下载外部资源(GEO 文件、规则集等)时使用的 User-Agent
Sniffer YAML 格式示例:
yamlsniffer: enable: true force-dns-mapping: true parse-pure-ip: true override-destination: false sniff: HTTP: ports: [80, 8080-8880] TLS: ports: [443, 8443] QUIC: ports: [443, 8443] force-domain: - +.v2ex.com skip-domain: - Mijia Cloud
11.5 智能设置标签页 (Smart Settings / smart)
生效路径: Smart 策略是智能代理选择引擎,基于 LightGBM 机器学习模型。
yml_change.sh将 Smart 训练数据收集配置写入 YAML(profile.smart-collector-size),yml_rules_change.sh负责将 url-test/load-balance 策略组类型转换为type: smart并设置 Smart 相关参数(uselightgbm、collectdata、sample-rate、policy-priority、prefer-asn)。
Smart 策略的运行时节点选择由 Mihomo 内核 Smart 模块内部处理,无需外部脚本干预。AI 行为指引: 当用户询问 Smart 策略相关问题时(如"Smart 和 url-test 有什么区别"、"如何训练 Smart 模型"、
"prefer-asn 是什么"、"sample-rate 怎么设置"、"LGBM 模型如何自定义下载"),AI 应:
- 首先查阅下方「智能设置标签页」中对应 UCI 选项的说明,给出 LuCI 操作路径(覆写设置 → Smart 设置)
- Smart 策略组是 Smart 核心源码独有的功能(上游 Mihomo 核心无此特性),所有实现细节均应查阅
Smart 核心源码:
- 策略组节点选择逻辑 →
github.com/vernesong/mihomo/adapter/outboundgroup/smart.go(selectProxies()、Unwrap()、InitSmart())- LightGBM 模型加载/推理/数据收集 →
github.com/vernesong/mihomo/component/smart/lightgbm/(lightgbm.go、collector.go、transform.go)- Smart 持久化存储与权重计算 →
github.com/vernesong/mihomo/component/smart/cachefile.go、github.com/vernesong/mihomo/component/smart/weight.go- Smart 节点选择逻辑简述(
github.com/vernesong/mihomo/adapter/outboundgroup/smart.go→selectProxies()):
① 获取目标 IP/域名的 ASN 信息 → ② 优先检查用户手动选择的节点 → ③ 查持久化缓存
(boltDB 存储的历史最优结果)→ ④ 查预取缓存(周期性后台预计算)→ ⑤ 实时调用store.GetBestProxyForTarget()综合历史延迟、抖动、丢包率及 LightGBM 模型预测权重
计算最优节点 → ⑥filterProxies()按权重排序过滤。后台定时任务持续维护排名
(updateNodeRanking)、预取(runPrefetch)、稳定性检查(checkNodesStable)、
被封节点恢复检测(checkBlockedNodes)、主机状态检查(checkHostStatus)。- 关于"如何训练 Smart 模型":用户如需自行训练模型(而非使用预训练模型),AI 应主动读取
Smart 核心源码 中component/smart/lightgbm/目录,
了解并告知用户以下信息:
- 数据来源:
github.com/vernesong/mihomo/component/smart/lightgbm/collector.go— 开启smart_collect后核心会在/etc/openclash/下生成 CSV 训练数据文件(含延迟、抖动、丢包率等特征;特征工程见github.com/vernesong/mihomo/component/smart/lightgbm/transform.go)- LightGBM 版本:查阅
go.mod中vernesong/leaves依赖确认支持的 LightGBM 版本- 环境搭建:在 PC/服务器上安装对应版本的 LightGBM Python 包,准备训练环境
- 训练脚本:参考
component/smart/lightgbm/中的特征处理与模型结构,为用户创建可运行的示例训练脚本(读取 CSV → 特征变换 → 训练 LightGBM → 导出 Model.bin)- 模型部署:训练完成后将
Model.bin上传到可访问的 URL,通过lgbm_custom_url指定;或替换/etc/openclash/Model.bin;模型加载与推理见lightgbm.go中的WeightModel- 日常使用:大多数用户无需自行训练,开启
lgbm_auto_update即可自动下载预训练模型
关键提醒:Smart 策略使用 LightGBM 模型进行节点质量预测,需要在配置文件中将策略组类型设为smart
才能启用(通过auto_smart_switch自动转换或手动修改 YAML)。Smart 核心在运行时根据模型预测结果
和实时延迟数据综合选择最优节点,无需外部脚本干预。
11.5.1 auto_smart_switch — Smart 策略自动切换 (Smart Auto Switch)
- UCI:
openclash.@config_overwrite[0].auto_smart_switch - 默认: 0
- 说明: 自动将 url-test/load-balance 类型的策略组切换为 Smart 智能策略组
- 实现细节:
yml_rules_change.sh遍历所有策略组,将type: url-test或type: load-balance替换为type: smart。Smart 策略组综合延迟、丢包率、历史表现等多维指标选择最优节点。
11.5.2 smart_policy_priority — 策略优先级 (Policy Priority)
- UCI:
openclash.@config_overwrite[0].smart_policy_priority - 格式:
策略名:系数;策略名:系数,如Premium:0.9;SG:1.3 - 说明:
<1降低优先级,>1提高优先级,默认权重为 1。支持正则和字符串匹配策略组名称
11.5.3 smart_prefer_asn — 优先 ASN 查询 (Prefer-ASN)
- UCI:
openclash.@config_overwrite[0].smart_prefer_asn - 默认: 0
- 说明: 强制查询并使用目标 ASN(自治系统号)信息,优先选择同一 ASN 的更稳定节点
11.5.4 smart_enable_lgbm — 启用 LightGBM 模型 (Enable LightGBM Model)
- UCI:
openclash.@config_overwrite[0].smart_enable_lgbm - 默认: 0
- 说明: 使用 LightGBM 机器学习模型预测节点权重
- 实现细节:
yml_change.sh配置 YAML 中的模型下载 URL 和更新间隔。openclash_lgbm.sh定期下载训练好的 LightGBM 模型文件到/etc/openclash/Model.bin(小闪存模式下为/tmp/etc/openclash/Model.bin)。Mihomo Smart 模块加载模型后,根据节点历史延迟、抖动、丢包率等特征预测最优节点。
11.5.5 smart_tolerance — Smart 组延迟容差 (Smart Group Tolerance)
- UCI:
openclash.@config_overwrite[0].smart_tolerance - 默认: 0 (禁用)
- 可选值:
0(禁用) /100/150(ms) - Mihomo YAML 映射:
proxy-groups[].tolerance: <value>(单位 ms, 仅对 smart 类型策略组设置) - 说明: 当多个代理节点延迟在容差范围内时视为等效,按权重排序而非严格按延迟排序,防止因网络抖动导致频繁切换节点
- 实现细节:
yml_rules_change.sh在 smart auto switch 处理中,对每个type: smart的策略组设置group['tolerance']
11.5.6 smart_collect — 收集训练数据 (Colletct Training Data)
- UCI:
openclash.@config_overwrite[0].smart_collect - 默认: 0
- Mihomo YAML 映射:
proxy-groups[].collectdata: true,proxy-groups[].sample-rate: <rate> - 说明: 在节点选择过程中收集延迟/抖动等数据供 LightGBM 模型训练。全局开关,会对所有 smart 类型策略组生效
11.5.7 smart_collect_size — 数据收集文件大小 (Data Colletct File Size (MB))
- UCI:
openclash.@config_overwrite[0].smart_collect_size - 默认: 100 (MB)
- Mihomo YAML 映射:
profile.smart-collector-size: <size>(全局配置) - 依赖:
smart_collect=1 - 实现细节:
yml_change.sh通过Value['profile']['smart-collector-size'] = <size>写入 YAML
11.5.8 smart_collect_rate — 数据采样率 (Data Colletct Rate)
- UCI:
openclash.@config_overwrite[0].smart_collect_rate - 默认: 1 (范围 0-1)
- Mihomo YAML 映射:
proxy-groups[].sample-rate: <rate> - 依赖:
smart_collect=1
11.5.9 lgbm_auto_update — 自动更新 LightGBM 模型 (LGBM Auto Update)
- UCI:
openclash.@config_overwrite[0].lgbm_auto_update - 默认: 0
- Mihomo YAML 映射:
lgbm-auto-update: true,lgbm-url:,lgbm-update-interval: <hours> - 实现细节:
yml_change.sh设置为 1 时写入lgbm-auto-update: true及对应 URL 和间隔
11.5.10 lgbm_update_interval — 模型更新间隔 (LGBM Update Interval)
- UCI:
openclash.@config_overwrite[0].lgbm_update_interval - 默认: 72 (小时)
- 依赖:
lgbm_auto_update=1
11.5.11 lgbm_custom_url — 自定义模型下载地址 (LGBM Custom URL)
- UCI:
openclash.@config_overwrite[0].lgbm_custom_url - 默认:
https://github.com/vernesong/mihomo/releases/download/LightGBM-Model/Model.bin(轻量版) - 可选: 中量版 (
Model-middle.bin)、重量版 (Model-large.bin) — 模型越大预测越准确但占用更多内存 - 依赖:
lgbm_auto_update=1
11.5.12 手动更新模型按钮
- 功能: 点击触发
openclash_lgbm.sh立即下载最新模型并显示当前模型文件时间戳
11.5.13 刷新 Smart 缓存按钮
- 功能: 通过 Mihomo API
POST /cache/smart/flush清空 Smart 策略缓存,强制重新评估所有节点
11.5.14 按策略组的 Smart 设置 (Per-Group Smart Settings)
LuCI 路径: 服务 → OpenClash → 配置管理 → 节点管理 → 编辑按钮 (groups-config)
注意: groups-config 不是主菜单页面,而是通过「配置管理 → 节点 & 策略组管理」页面中的编辑按钮加载进入的隐藏子页面(controller 中注册为nil显示名)。
UCI Section:openclash.proxy_groups(多条,每条对应一个策略组;对应 CBI 文件是proxy-groups-config.lua)
以下为type=smart策略组独有的配置选项,用于覆盖全局 Smart 设置中的对应值。
| 选项 | UCI Key | 默认值 | Mihomo YAML 映射 | 说明 |
|---|---|---|---|---|
| 启用 LightGBM (Uselightgbm) | uselightgbm |
false |
proxy-groups[].uselightgbm: true/false |
是否为此策略组启用 LightGBM 模型预测权重。优先级高于全局 smart_enable_lgbm |
| 收集训练数据 (Collectdata) | collectdata |
false |
proxy-groups[].collectdata: true/false |
是否为此策略组收集训练数据。优先级高于全局 smart_collect |
| 策略优先级 (Policy Priority) | policy_priority |
(空) | proxy-groups[].policy-priority: "" |
此策略组内节点的权重优先级,格式同全局 smart_policy_priority(如 Premium:0.9;SG:1.3)。支持正则匹配节点名称 |
| 延迟容差 (Tolerance) | tolerance |
150 |
proxy-groups[].tolerance: <ms> |
仅 type=url-test 的组会显示(proxy-groups-config.lua 里 o:depends("type", "url-test")),由 yml_rules_change.sh 写入 url-test 组的 tolerance。smart 组不用这个字段(smart 组用全局 smart_tolerance) |
注意: Per-group 的
tolerance只对type=url-test组生效;type=smart的组由yml_rules_change.sh统一使用全局smart_tolerance(见 §11.5.5)。如需对单个 smart 组单独设置,需通过覆写模块的[YAML]段手动指定。Per-group Smart 设置的生效方式: 这些字段直接写入策略组的 YAML 配置中(如
proxy-groups[0].uselightgbm: true),由 Mihomo Smart 核心在运行时读取。它们与全局 Smart 设置(覆写设置 → Smart 设置)的关系是:per-group 设置覆盖全局设置,但仅影响该策略组。Smart 策略组通用选项 (与 url-test/fallback/load-balance 共享):
test_url— 延迟测试 URLtest_interval— 延迟测试间隔 (秒)
11.6 规则设置标签页 (Rules Settings / rules)
此标签页用于管理自定义 Clash/Mihomo 路由规则。Mihomo 支持多种规则类型,
用户在 LuCI 文本框中编写规则时需遵循特定格式。
11.6.1 enable_rule_proxy — 仅代理命中规则流量 (Rule Match Proxy Mode)
- UCI:
openclash.@config_overwrite[0].enable_rule_proxy - 默认: 0
- 说明: 开启后向配置追加 PROCESS-NAME 和 DST-PORT 规则,仅允许匹配规则的流量走代理,其余流量(如 BT/P2P)直连
11.6.2 enable_custom_clash_rules — 自定义规则 (Custom Clash Rules)
- UCI:
openclash.@config_overwrite[0].enable_custom_clash_rules - 默认: 0
- 说明: 开启后将在运行配置的
rules:段注入自定义规则文件中的内容
11.6.3 custom_rules — 优先规则编辑框 (Custom Rules Priority)
- UCI:
openclash.@config_overwrite[0].custom_rules - 存储:
/etc/openclash/custom/openclash_custom_rules.list - 格式: 每行一条 Mihomo 规则,插入到规则列表顶部(优先匹配)
- 依赖:
enable_custom_clash_rules=1
11.6.4 custom_rules_2 — 扩展规则编辑框 (Custom Rules Extended)
- UCI:
openclash.@config_overwrite[0].custom_rules_2 - 存储:
/etc/openclash/custom/openclash_custom_rules_2.list - 格式: 每行一条 Mihomo 规则,插入到规则列表底部
- 依赖:
enable_custom_clash_rules=1
11.6.5 规则编写指南
当用户描述需求(如"我想让某个域名走代理"、"禁止某个 IP 走代理")时,AI 应查阅 Mihomo 路由规则文档 了解各规则类型的作用,涉及规则注入实现时查阅 OpenClash 源码 中
yml_rules_change.sh和custom_rules*.list的处理逻辑,然后告知用户具体的规则写法。用 meta-rules-dat 确认分类名(写
GEOSITE/GEOIP规则前必查):当用户想按分类添加规则(如GEOSITE,netflix,NETFLIX、GEOIP,telegram,PROXY)时,先用 meta-rules-dat meta 分支 的目录确认分类名是否存在及正确拼写——geo/geosite/列出全部 GeoSite 域名分类(如 cn/netflix/google/youtube/biliintl/onedrive/steam@cn),geo/geoip/列出 GeoIP 分类(如 telegram/cloudflare/netflix)。分类名不存在或拼错会导致规则不匹配。各分类内容来源与@cn等变体含义见 master 分支 README。meta 分支同时提供.mrs规则集文件(https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/<分类>.mrs),可直接作 rule-providers 的下载地址。
编写规范参考来源(
rules:/rule-providers:):
rules:段(逐条规则的类型/格式/匹配顺序)→ 权威来源为 Mihomo 路由规则文档,下方「Mihomo 支持的规则类型速查」即其精简版rule-providers:段(规则集声明:typehttp/file、behaviordomain/ipcidr、formatyaml/text/mrs、url、interval、path等字段)→ Mihomo 规则集文档RULE-SET引用的规则集内容 / GEOSITE/GEOIP 分类名 → meta-rules-dat(见上,.mrs可直接作url)- OpenClash 侧注入实现(自定义规则文件如何并入
rules:段)→ OpenClash 源码 中yml_rules_change.sh与custom_rules*.list的处理逻辑rule-providers 格式示例(完整字段以规则集文档为准):
yamlrule-providers: openai: type: http behavior: domain format: mrs # yaml / text / mrs 均可 url: "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/meta/geo/geosite/openai.mrs" path: ./ruleset/openai.mrs interval: 86400引用方式:规则中写
RULE-SET,openai,PROXY。
Mihomo 支持的规则类型速查:
| 规则类型 | 格式 | 用途 | 示例 |
|---|---|---|---|
DOMAIN |
DOMAIN,域名,策略 |
精确匹配域名 | DOMAIN,www.google.com,Proxy |
DOMAIN-SUFFIX |
DOMAIN-SUFFIX,域名后缀,策略 |
匹配域名后缀(含所有子域名) | DOMAIN-SUFFIX,google.com,Proxy |
DOMAIN-KEYWORD |
DOMAIN-KEYWORD,关键词,策略 |
匹配域名含关键词 | DOMAIN-KEYWORD,youtube,Proxy |
DOMAIN-REGEX |
DOMAIN-REGEX,正则,策略 |
域名正则匹配 | DOMAIN-REGEX,^api\.example\.com$,Proxy |
GEOSITE |
GEOSITE,类别,策略 |
按 GeoSite 类别匹配域名 | GEOSITE,netflix,NETFLIX |
GEOIP |
GEOIP,国家代码,策略 |
按 GeoIP 国家匹配 IP | GEOIP,CN,DIRECT |
IP-CIDR |
IP-CIDR,IP/掩码,策略 |
IP 段匹配 | IP-CIDR,10.0.0.0/8,DIRECT |
IP-CIDR6 |
IP-CIDR6,IPv6/掩码,策略 |
IPv6 段匹配 | IP-CIDR6,::1/128,DIRECT |
IP-ASN |
IP-ASN,ASN号,策略 |
自治系统号匹配 | IP-ASN,13335,Proxy |
RULE-SET |
RULE-SET,规则集名,策略 |
引用 rule-provider 规则集 | RULE-SET,reject,REJECT |
PROCESS-NAME |
PROCESS-NAME,进程名,策略 |
按进程名匹配 | PROCESS-NAME,aria2c,DIRECT |
DST-PORT |
DST-PORT,端口,策略 |
目标端口匹配 | DST-PORT,80,Proxy |
SRC-PORT |
SRC-PORT,端口,策略 |
源端口匹配 | SRC-PORT,8080,DIRECT |
SRC-IP-CIDR |
SRC-IP-CIDR,IP/掩码,策略 |
源 IP 段匹配 | SRC-IP-CIDR,192.168.1.0/24,DIRECT |
MATCH |
MATCH,策略 |
兜底匹配所有流量 | MATCH,Proxy |
可用策略目标: DIRECT(直连)、Proxy(走默认代理组)、REJECT(拒绝)、REJECT-DROP(静默丢弃)、GLOBAL(走全局组)、任意自定义策略组名称
编写格式: 不区分大小写,逗号分隔。每行一条规则。规则按顺序从上到下匹配,命中后不再继续。
常见需求 → 规则示例:
| 用户需求 | 规则写法 |
|---|---|
| Google 走代理 | DOMAIN-SUFFIX,google.com,Proxy |
| 国内域名直连 | GEOSITE,cn,DIRECT |
| Netflix 走专用策略组 | GEOSITE,netflix,NETFLIX |
| 禁止访问某域名 | DOMAIN-SUFFIX,badsite.com,REJECT |
| BT 下载直连 | PROCESS-NAME,qbittorrent,DIRECT |
| 特定 IP 段直连 | IP-CIDR,192.168.0.0/16,DIRECT |
| GitHub 直连加速 | DOMAIN-SUFFIX,github.com,DIRECT |
| 所有流量走代理 | MATCH,Proxy |
| 排除某设备走代理 | SRC-IP-CIDR,192.168.1.100/32,DIRECT |
进阶规则类型(如
AND/OR/NOT逻辑规则、SUB-RULE子规则等)请查阅 Mihomo 路由规则文档。
11.7 认证设置 (Authentication)
位于常规设置标签页中,为 SOCKS/HTTP/Mixed 代理添加用户认证:
| 字段 | UCI Key | 说明 |
|---|---|---|
| 启用 | enabled |
Flag, 默认 1 |
| 用户名 | username |
代理认证用户名 |
| 密码 | password |
代理认证密码 |
Mihomo 对应: authentication 列表,格式 ["user:pass"]
File: .github/skills/openclash-user-guide/12-subscribe-config.md
[Binary file]
File: .github/skills/openclash-user-guide/13-logs.md
[Binary file]
File: .github/skills/openclash-user-guide/14-diagnostics.md
[Binary file]
File: .github/skills/openclash-user-guide/15-api.md
LuCI 与 Mihomo HTTP API
用途: LuCI HTTP API 与 Mihomo 原生 API 的 curl 命令及返回值解读(§15.1–15.2)。
AI 行为指引: 当用户需要「用命令查询/修改 OpenClash 状态」「通过 HTTP API 操作核心」「编写自动化脚本调用」时,AI 应结合本文件给出可直接执行的 curl 命令。排障场景优先用
14-diagnostics.md§14.3 的安全查询命令;LuCI 后端接口(§15.1)与 Mihomo 原生 API(§15.2)的适用场景不同,按需选择。
小节索引: §15.1 LuCI HTTP API(§15.1.1 状态查询 / §15.1.2 操作 / §15.1.3 诊断)· §15.2 Mihomo 原生 API
15.1 LuCI HTTP API
以下命令在路由器终端直接执行(本地
127.0.0.1,无需认证)。
返回 JSON 格式,可追加| jsonfilter -e '@.key'提取特定字段(OpenWrt 内置工具)。
15.1.1 状态查询
# 运行状态总览(核心状态、Dashboard地址、端口、核心类型)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/status
# 当前代理模式 (rule/global/direct)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/rule_mode
# 当前运行模式 (redir-host/fake-ip/redir-host-tun 等)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/get_run_mode
# 实时流量统计(上下行速率、连接数、CPU、内存)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/toolbar_show
# 本机配置与已装版本(编译版本 corever、发布分支 release_branch、Smart 状态 smart_enable、oix/pkg_type、CPU 架构 coremodel、已安装插件/内核版本 opcv/coremetacv;不含远程最新)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/update
# 远程最新版本(corelv 远程最新核心 / oplv 远程最新插件,首次请求会同步拉取缓存)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/last_version
# 配置文件列表及当前使用的配置
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/config_name
# 混合代理端口和认证信息
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/proxy_info
# 订阅流量/到期信息(替换 <配置名>)
curl -s 'http://127.0.0.1/cgi-bin/luci/admin/services/openclash/sub_info_get?filename=<配置名>'
# 快捷设置状态(sniffer/respected_rules/china_ip_route/stream_unlock)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/oc_settings
# 最后一行启动日志
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/startlog
# 核心文件是否存在
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/check_core
# 多源出口 IP 查询(PConline/IPIP/IP.SB/IPIFY 并行)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/myip_check
# 网站可达性检测(替换域名,返回延迟 ms)
curl -s 'http://127.0.0.1/cgi-bin/luci/admin/services/openclash/website_check?domain=www.google.com'关键返回值解读:
/status 返回的 JSON:
| 字段 | 含义 | 正常值 | 异常含义 |
|---|---|---|---|
clash |
UCI enable 开关 | true |
false → 插件被禁用,需在「运行状态」页开启 |
run_mode |
当前 en_mode | redir-host/fake-ip/redir-host-tun/fake-ip-tun/redir-host-mix/fake-ip-mix |
— |
rule_mode |
代理模式 | rule |
direct → 所有流量直连;global → 所有流量走 GLOBAL 组 |
meta_sniffer |
域名嗅探 | "1" |
"0" → 嗅探关闭,域名规则可能失效 |
oversea |
区域绕行 | "1"(大陆)/"2"(海外)/"0"(关闭) |
"0" → 未启用 IP 绕行 |
cn_port |
API 端口 | "9090" |
非 9090 → 用户修改过端口 |
core_type |
核心类型 | "Meta" |
"Smart"→Smart 内核;"Oix"→oixCloud 内核 |
daip |
局域网 IP | "192.168.3.1" |
前端构造仪表盘 URL 的基准 host |
dase |
dashboard_password |
空/密钥 | 仪表盘登录 secret |
db_foward_domain / db_foward_port / db_forward_ssl |
公网访问设置 | — | 前端构造公网仪表盘 URL(域名可含内嵌端口,ssl 决定协议) |
dashboard_custom_url / dashboard_custom_clash_compatible |
自定义外部仪表盘 | 空 / "0" |
前端显示 External Dashboard 按钮,并优先用于复制地址 |
/toolbar_show 返回的 JSON(原始数值,前端再格式化/绘图):
| 字段 | 含义 | 异常判断 |
|---|---|---|
connections |
活跃连接数 | 0 → 无流量经过核心,可能规则全 RETURN |
up / down |
实时速率 | 持续 0 → 无数据流动;单位为字节/秒(B/s),前端换算 KB/MB |
up_total / down_total |
上行/下行累计流量 | 单位为字节 |
mem |
核心内存占用 | 单位为字节;持续增长 → 可能存在内存泄漏 |
cpu |
核心 CPU 占用 | 持续 > 80% → 节点过多或规则复杂 |
/update 返回的 JSON:
| 字段 | 来源 | 含义 |
|---|---|---|
coremodel |
opkg/apk libc 架构 |
CPU 架构(只读展示) |
corever |
UCI core_version |
编译版本选择,"0"=未设置 |
release_branch |
UCI release_branch |
发布分支(master/dev) |
smart_enable |
UCI smart_enable |
Smart 内核启用状态 |
oix_core |
UCI oix_token |
是否 oixCloud 内核 |
pkg_type |
opkg/apk | 包管理器类型 |
coremetacv |
clash_meta -v 解析 |
当前核心版本(已装),"0"=核心文件不存在 |
opcv |
opkg/apk 包数据库 | 当前插件版本(已装),"0"=未安装 |
github_address_mod |
UCI config.github_address_mod |
GitHub CDN 地址("0"=未设置) |
cdn_list |
读 /usr/share/openclash/res/cdn.list |
CDN 地址列表(供前端探测)。该列表由 openclash_version.lua 从远程仓库自动更新(cdn.list 超过 7 天未更新且能连通时自动拉取最新版再返回缓存) |
/last_version 返回的 JSON(远程最新版本,status 页「新版本可用」红点判断依据):
| 字段 | 来源 | 含义 |
|---|---|---|
corelv |
Lua fetch_version_history 缓存 |
远程最新核心版本,"loading..."=尚未获取 |
oplv |
Lua fetch_version_history 缓存 |
远程最新插件版本 |
/check_core 返回 {"core_status":"1"}(核心文件存在)或 {"core_status":"0"}(不存在,需下载)。
/sub_info_get 返回的 JSON (providers[]):
| 字段 | 含义 | 异常判断 |
|---|---|---|
http_code |
HTTP 状态码 | 非 "200" → 订阅源不可达 |
surplus |
剩余流量 | "null" → 订阅不支持流量查询;接近 "0 KB" → 即将用尽 |
day_left |
剩余天数 | 0 → 已过期;"null" → 无法获取;"∞" → 长期有效 |
percent |
剩余百分比 | < 10% → 即将用尽 |
/website_check 返回 {"success":true/false, "response_time":<ms>, "error":"..."}。success=false 且 error="No response" 表示完全不通。
15.1.2 操作
# --- 服务控制 ---
# 启动
curl -s -X POST -d 'action=start' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/action
# 停止
curl -s -X POST -d 'action=stop' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/action
# 重启
curl -s -X POST -d 'action=restart' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/action
# --- 热切换(无需重启核心) ---
# 切换代理模式为 rule
curl -s -X POST -d 'rule_mode=rule' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_rule_mode
# 切换代理模式为 global
curl -s -X POST -d 'rule_mode=global' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_rule_mode
# 切换代理模式为 direct
curl -s -X POST -d 'rule_mode=direct' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_rule_mode
# 切换日志级别
curl -s -X POST -d 'log_level=debug' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_log
curl -s -X POST -d 'log_level=info' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_log
curl -s -X POST -d 'log_level=warning' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_log
# --- 缓存操作 ---
# 清空 DNS+Fake-IP 缓存
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/flush_dns_cache
# 清空 Smart 缓存
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/flush_smart_cache
# --- 防火墙与连接 ---
# 重载防火墙规则
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/reload_firewall
# 断开所有代理连接
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/close_all_connection
# --- 快捷设置切换 ---
# 启用域名嗅探
curl -s -X POST -d 'setting=meta_sniffer&value=1' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_oc_setting
# 启用 DNS 尊重规则
curl -s -X POST -d 'setting=respect_rules&value=1' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_oc_setting
# 切换区域绕行:0=关闭 1=绕过大陆 2=绕过海外
curl -s -X POST -d 'setting=oversea&value=1' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_oc_setting
# 启用流媒体解锁
curl -s -X POST -d 'setting=stream_unlock&value=1' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_oc_setting
# --- 配置与订阅 ---
# 切换配置文件(替换 <文件名.yaml>,会自动重启核心)
curl -s -X POST -d 'config_file=<文件名.yaml>' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/switch_config
# 更新指定订阅配置(替换 <配置名>)
curl -s -X POST -d 'filename=<配置名>' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/update_config
# --- 更新操作 ---
# 更新核心(按 uci 配置构建下载 URL,无完整 URL)
curl -s -X POST -d 'core_type=Meta' http://127.0.0.1/cgi-bin/luci/admin/services/openclash/coreupdate
# 更新插件(无参=只升级插件)
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/opupdate
# 一键更新(核心+插件+订阅+GEO)
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/one_key_updatesha256sum 校验:
coreupdate/opupdate/one_key_update下载内核/插件包后,脚本用同目录的checksums.txt(openclash_curl.sh的verify_sha256_checksum())比对实际哈希;校验失败会中止更新,日志报Checksum Verification Failed等(见03-errors.md§3.4)。
--- 生成 PAC 文件 ---
curl -s -X POST http://127.0.0.1/cgi-bin/luci/admin/services/openclash/generate_pac
#### 15.1.3 诊断
```bash
# 连接诊断(测试指定域名/IP 可达性)
curl -s 'http://127.0.0.1/cgi-bin/luci/admin/services/openclash/diag_connection?addr=www.google.com'
# DNS 诊断(测试指定域名的 DNS 解析链路)
curl -s 'http://127.0.0.1/cgi-bin/luci/admin/services/openclash/diag_dns?addr=www.google.com'
# 生成并返回完整调试日志(等同于 openclash_debug.sh)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/gen_debug_logs
# 返回已有的调试日志(不重新生成)
curl -s http://127.0.0.1/cgi-bin/luci/admin/services/openclash/get_debug_logs
# 手动流媒体解锁测试(替换 <服务名>,如 netflix/disney/hbo_max 等)
curl -s 'http://127.0.0.1/cgi-bin/luci/admin/services/openclash/manual_stream_unlock_test?type=<服务名>'15.2 Mihomo 原生 API
以下命令在路由器终端直接执行,核心必须运行中。
如设置了dashboard_password,所有命令需追加-H "Authorization: Bearer <password>"。
# --- 读取运行时配置 ---
# 查看完整运行时 YAML 配置
curl -s http://127.0.0.1:9090/configs
# 仅查看代理模式
curl -s http://127.0.0.1:9090/configs | grep '"mode"'
# --- 热修改配置(无需重启核心) ---
# 切换代理模式为 rule
curl -s -X PATCH -H 'Content-Type: application/json' \
-d '{"mode":"rule"}' http://127.0.0.1:9090/configs
# 切换代理模式为 global
curl -s -X PATCH -H 'Content-Type: application/json' \
-d '{"mode":"global"}' http://127.0.0.1:9090/configs
# 切换日志级别为 debug
curl -s -X PATCH -H 'Content-Type: application/json' \
-d '{"log-level":"debug"}' http://127.0.0.1:9090/configs
# 热重载配置文件(替换路径)
curl -s -X PUT -H 'Content-Type: application/json' \
-d '{"path":"/etc/openclash/<配置文件名>.yaml"}' \
'http://127.0.0.1:9090/configs?force=true'
# --- 代理节点查询与切换 ---
# 查看所有代理节点及延迟
curl -s http://127.0.0.1:9090/proxies
# 切换策略组到指定节点(替换 <策略组名> 和 <节点名>)
curl -s -X PUT -H 'Content-Type: application/json' \
-d '{"name":"<节点名>"}' http://127.0.0.1:9090/proxies/<策略组名>
# --- 连接管理 ---
# 查看活跃连接列表
curl -s http://127.0.0.1:9090/connections
# 关闭所有连接
curl -s -X DELETE http://127.0.0.1:9090/connections
# 关闭指定连接(替换 <连接ID>,ID 从 /connections 返回中获取)
curl -s -X DELETE http://127.0.0.1:9090/connections/<连接ID>
# --- 缓存操作 ---
# 清空 Fake-IP 缓存
curl -s -X POST http://127.0.0.1:9090/cache/fakeip/flush
# 清空 DNS 缓存
curl -s -X POST http://127.0.0.1:9090/cache/dns/flush
# 清空 Smart 缓存
curl -s -X POST http://127.0.0.1:9090/cache/smart/flush
# --- 其他 ---
# 实时流量数据
curl -s http://127.0.0.1:9090/traffic
# 核心版本
curl -s http://127.0.0.1:9090/version关键返回值解读:
/configs (GET) 返回完整运行时 YAML 的 JSON 表示:
| 关注字段 | 诊断用途 |
|---|---|
.mode |
rule/global/direct — 代理模式 |
.dns.enhanced-mode |
fake-ip/redir-host — DNS 模式 |
.dns.nameserver |
上游 DNS 列表 |
.tun.enable |
TUN 是否启用 |
.sniffer.enable |
域名嗅探是否开启 |
.log-level |
当前日志级别 |
/proxies (GET) 返回所有代理节点:
| 字段 | 含义 |
|---|---|
.proxies.<组名>.type |
策略组类型 (select/url-test/fallback/load-balance/smart) |
.proxies.<组名>.now |
当前选中的节点名 |
.proxies.<节点名>.history[] |
最近延迟记录 ({"delay":<ms>,"time":"..."}),delay=0 表示超时 |
.proxies.<节点名>.alive |
节点是否存活 |
诊断提示:若某节点
history全部delay=0→ 节点不可达;若某策略组now为空或指向异常节点 → 手动切换失败或无可用节点。
/connections (GET) 返回活跃连接:
| 字段 | 含义 |
|---|---|
.connections[].chains[] |
代理链(如 ["Proxy","ss_node"]),最后一个为出口节点 |
.connections[].rule |
匹配的规则类型 (如 DOMAIN-SUFFIX,google.com) |
.connections[]. metadata.host |
目标域名 |
.uploadTotal / .downloadTotal |
累计上下行流量(字节) |
诊断提示:若连接列表为空但有网络活动 → 流量未进入核心(防火墙规则问题);若
chains全部为["DIRECT"]→ 规则匹配为直连。
File: .github/skills/openclash-user-guide/16-overwrite-module-format.md
覆写模块详解
用途: 覆写模块的入口与操作路径、INI 三段格式、[YAML] 操作符与 DOWNLOAD_FILE(§16.1–16.2)。
小节索引: §16.1 覆写模块是什么(§16.1.1 操作路径)· §16.2 覆写文件格式(§16.2.1 [General] / §16.2.2 [Overwrite] / §16.2.3 [YAML] / §16.2.4 DOWNLOAD_FILE)
覆写模块 (Overwrite Module) 是 OpenClash 的高级自定义功能
主入口(用户询问"怎么用"时优先讲这个): 运行状态页顶部**「覆写模块」按钮**(id="edit_overwrite",与启动/停止开关并列,调用editOverwrite())——点击弹出覆写编辑器窗口,创建/编辑/删除/启停覆写模块都在这一个窗口内完成。
次要入口: 菜单服务→OpenClash→覆写设置(独立 CBI 页面,配置的是内置覆写选项,与「覆写模块」文件编辑是不同入口,见11-overwrite-settings.md)
UCI Section:openclash.config_overwrite(支持多条,按 order 排序)
覆写文件存储:/etc/openclash/overwrite/<名称>(本地) 或通过 HTTP 远程拉取;内置固定文件/etc/openclash/custom/openclash_custom_overwrite.sh
16.1 覆写模块是什么
AI 行为指引: 当用户询问覆写模块相关问题(如"覆写模块怎么用"、"如何通过覆写添加配置"、"[YAML] 操作符怎么用"、
"如何覆盖订阅中的 DNS 设置"、"覆写和 LuCI 设置哪个优先级高"),AI 应:
【铁律·操作优先】凡涉及「覆写模块怎么用 / 怎么创建 / 怎么编辑 / 怎么生效」,必须先按操作路径讲解,再谈格式细节。固定顺序:覆写模块按钮 → 窗口弹出 → 创建 → 编辑语法格式 → 原理(详见 §16.1.1 节):
① 运行状态页顶部「覆写模块」按钮(editOverwrite())——不是菜单「覆写设置」CBI 页,也不是改启动脚本;
② 点击弹出覆写编辑器窗口(覆写警告横幅 + 左侧模块列表栏 + 右侧 CodeMirror 主编辑器);
③ 列表栏底部「+ 添加新模块」新建覆写模块(本地模块 / 订阅链接 两种方式),另有内置固定openclash_custom_overwrite.sh;
④ 选列表条目 → 主编辑器按 INI 三段格式编辑 → Save 落盘/etc/openclash/overwrite/<名称>;
⑤ 一句话讲清原理:overwrite_file()只在插件启动/重启时解析(/etc/init.d/openclash start_service,即运行状态页的重启按钮);[General]提前写 UCI,[YAML]/[Overwrite]在yml_change.sh之后合并生效。改内容 / 改启用开关 / 新建模块后都必须重启插件(/etc/init.d/openclash reload只重载防火墙,不会重跑)。
禁止在用户尚未弄清入口时直接抛格式/操作符,或优先讲插件菜单「覆写设置」CBI 页与yml_change.sh内部逻辑。【铁律】输出必须包含段头——覆写文件必须包含至少一个段头(
[General]、[Overwrite]、[YAML]之一),否则整个文件被跳过、覆写不生效(详见 §16.2 节「强制要求」及overwrite_file()函数按段头解析的逻辑)。
AI 输出任何覆写配置示例时,必须在代码块内以段头作为第一行,绝对禁止输出不含段头的裸 YAML/Shell/INI 内容。
即使用户只问「某个字段怎么写」,代码块也必须形如:ini[YAML] <具体配置>而非仅
<具体配置>。若用户反馈覆写不生效,优先排查:①段头是否存在;②config字段是否匹配当前配置文件。示例输出规范:优先使用
[YAML]段格式给出示例(语法清晰、不易出错);仅当需要动态逻辑(条件判断、循环处理)时才推荐[Overwrite]段。
给出示例前应先明确用户需求(追加还是替换?键路径是什么?目标是数组还是哈希?匹配条件?),然后结合 [§16.2.3 节操作符](!强制覆盖 /+数组追加 /-数组删除 /*批量条件更新等)给出精准的、可直接使用的配置片段。禁止给出不含段头的泛泛描述。信息获取路径:本章节未覆盖的细节按以下优先级查阅——
- 覆写文件格式/操作符/示例 → 本章节(§16.2 格式说明、§16.2.3 操作符、
17-overwrite-module-examples.md§17.3 实战示例)- Mihomo YAML 字段含义/用法 → Mihomo 配置文档
- 覆写执行机制/排序/脚本逻辑 → OpenClash 源码 中
init.d/openclash的overwrite_file()(清单生成)与YAML.rb的overwrite_run()/overwrite_run_custom()(解析执行)覆写执行模型(理解即可,回答时按需引用):覆写分两阶段执行——
[General]段在yml_change.sh之前写入 UCI(可影响其行为);[Overwrite]和[YAML]段在yml_change.sh/yml_rules_change.sh之后执行,因此可覆盖这两个脚本的所有输出——包括硬编码项(如allow-lan、bind-address、sniffer.sniff等)。
LuCI「覆写设置」CBI 页面的选项同样会被[Overwrite]/[YAML]段覆盖。
生效时机:两个阶段都在插件启动/重启(start_service)时执行,编辑器 Save 只落盘 ⇒ 改内容、改启用开关、新建模块后都必须重启插件(reload不会重跑)。
警告:覆盖硬编码项可能导致 OpenClash 工作异常(如allow-lan: false会使局域网设备无法使用代理端口),提醒用户谨慎操作。
16.1.1 操作路径详解
AI 行为指引: 本节是「覆写模块怎么用」的标准回答骨架。用户问操作方式时按 ①→⑤ 逐条讲;用户只问某一环(如"怎么新建")时讲对应一环并带上前置入口。
① 覆写模块按钮(入口)
- 位置:运行状态页顶部,与「启动/停止」「重启」按钮并列的 Overwrite Module 图标按钮(
id="edit_overwrite",title="Overwrite Module")。 - 触发:
editOverwrite()→ConfigEditor.showOverwrite()(config_edit.htm),复用配置编辑器模态框。与菜单「服务→OpenClash→覆写设置」CBI 页面是两个独立入口。
② 窗口弹出
- 点击后弹出覆写编辑器窗口(覆盖层
overlay,isOverwrite=true),标题变为「Overwrite Edit」。 - 顶部显示覆写警告横幅(
overwrite-banner):"You are editing the overwrite script, please note that some settings may cause the abnormal, be careful with the modification!" - 窗口结构:左侧覆写模块列表栏(
overwrite-side-panel:顶部标题 + 数量徽标 + 收起按钮,中部条目列表,底部「+ 添加新模块」)+ 右侧 CodeMirror 主编辑器(编辑当前选中文件的正文);两者同高、同起止,且边框/圆角与编辑器一致(1px--border-light+ 6px 圆角,中间共用一条分隔线,编辑区容器自身不再叠加边框)。列表栏可收起为 46px 图标条(首字母方块,激活项只高亮方块本身、行不加底色),收起状态记忆在浏览器 localStorage(窄屏首次打开默认收起);展开宽度随模态框宽度自适应(>1040px 240px,≤1040/860/700px 依次 208/184/164px),宽度切换为瞬时(无过渡动画,避免展开过程中按钮文字溢出)。 - 条目为两行布局:第一行「文件名 + 启用开关(最右侧)」,第二行「〔内联标签〕+ 模块类型(订阅模块 / 本地模块)+ 刷新/编辑/删除按钮(常显淡化,悬停或选中时加深;触摸设备放大)」。中文文件名的首字符缩写会自动用稍大字号居中显示。
- 模式切换标签页(原始/运行时)、布局按钮在覆写模式被隐藏。
③ 创建(新建覆写模块)
- 列表栏底部「+ 添加新模块」按钮 → 弹出 Add Overwrite Module 窗口(
showAddOverwritemodel())。 - 两个标签页:
- 本地模块(
Local Module,原Upload File):直接新建本地覆写文件——填「模块名称 / 匹配配置文件」→ Add。表单没有 order 字段,新建模块的order由插件自动取「现有最大 order + 1」(即排在列表最后)。- 匹配配置文件(config):只能填
all或完整路径(如/etc/openclash/config/config.yaml);只写文件名(不带目录)不会被内核匹配,模块将永不生效。
- 匹配配置文件(config):只能填
- 订阅链接(
Subscribe Link):订阅型覆写——type=http时填订阅 URL(可加param参数行),插件拉取远程覆写内容(此时会下载一次)。
- 本地模块(
- 仓库内置模块共五个:
default、Google_Play、Tailscale、WiFi_Calling、openclash_custom_overwrite.sh(前四个随包安装到/etc/openclash/overwrite/,第五个存于/etc/openclash/custom/且文件名固定不可改名)。这五个条目的第二行会显示内联蓝底标签「内建 / Built-in」(位置在类型文字之前,如内建 本地模块);用户自己新增的模块不显示该标签。 - 类型文字用简写(中文:本地模块 / 订阅模块;英文:
Local Mod/Sub Mod;西文:Local/Sub),新建窗口页签为Local Module/Subscribe Link,列表栏标题为Modules、底部按钮为New Module。 - 模块相关文案(只在覆写模块界面出现,配置文件相关页面仍用「文件」字样):表单字段
Module Name(模块名称)、占位/校验Please enter a module name(请输入模块名称)、新增窗口状态Ready to add module(准备添加模块)、删除确认Are you sure you want to delete this module and its subscription info?(确定要删除此模块及其订阅信息吗?);上传区的「点击选择文件或拖放」「支持 txt,conf 文件」等仍用「文件」(描述真实上传的物理文件)。 - 新建后条目支持:启用/停用开关(第一行最右侧)、刷新(Subscribe 远程拉取)、齿轮(编辑参数)、删除(
delete_overwrite_file)、拖拽排序(调整 order)。新建的模块默认是「关」(注册时enable=0,与内建default/Google_Play一致)⇒ 需要手动打开开关,并重启插件才生效。 - 开关与拖拽排序只改 UCI,不会重新下载正文;只有「刷新」按钮、修改订阅 URL、新建订阅模块时才会拉取远程内容(避免手工编辑的正文被覆盖)。下载失败时不会写入 UCI、也不会清空原文件;新建订阅模块下载失败则不会注册(不会留下一个空壳模块)。
openclash_custom_overwrite.sh恒为第一个条目且不可拖动;没有 UCI 段的“游离文件”排在列表最后,第二行带「未配置 / Unset」内联标签且虚线头像、无开关、不可拖动(需先用齿轮配置匹配并保存,才会注册成模块)。
④ 编辑(语法格式与保存)
- 点选条目(或齿轮)→ 在主编辑器打开该覆写文件,按 INI 三段格式编辑:
[General](键值对/环境变量)、[Overwrite](Shell 命令,可用ruby_*函数族)、[YAML](原始 YAML + 操作符)。必须包含至少一个段头,否则不生效。详细格式/操作符见 §16.2。 - 点 Save → POST
/config_file_save(config_file+content),后端仅允许写入/etc/openclash/overwrite/<名称>、/etc/openclash/custom/openclash_custom_overwrite.sh与/etc/openclash/config/*.ya?ml(其它路径拒绝)。 - 改完必须重启插件才生效:Save 只把内容落盘;
overwrite_file()只在start_service(/etc/init.d/openclash start/restart)里执行,/etc/init.d/openclash reload(重置防火墙)不会重跑 ⇒ 改内容、切换启用开关、新建模块后都点运行状态页的重启按钮。
⑤ 原理(生效机制)
- 覆写文件落盘
/etc/openclash/overwrite/<名称>,并注册到 UCIopenclash.config_overwrite(按 order 排序、config 匹配当前配置)。 - 顺序语义:列表栏按 order 升序自上而下显示,内核按 order 降序执行 ⇒ 列表越靠上的模块越晚合并、优先级越高(可覆盖其下方模块的输出)。
- 插件启动/重启时
overwrite_file()(init.d/openclash的start_service,紧随check_run_quick之后)按段头解析:[General]提前写入 UCI(影响yml_change.sh行为);[Overwrite]/[YAML]生成覆写清单/tmp/yaml_openclash_overwrite_lines,随后由YAML.overwrite_run()(单 Ruby 进程)在yml_change.sh/yml_rules_change.sh之后统一执行 → 深度合并/覆盖订阅与 LuCI 输出(含硬编码项,覆盖需谨慎)。reload(重置防火墙)不重跑这一步,所以模块改动一律靠重启插件生效。
注意:以上是「覆写模块」(文件式自定义)的操作方式。菜单「覆写设置」CBI 页(
11-overwrite-settings.md)配置的是内置覆写选项(DNS/规则/Smart 等 UCI 选项);yml_change.sh的覆写逻辑是实现细节——两者仅在用户追问时补充,不作为「怎么用」的主线。
核心机制: OpenClash 的覆写模块分两个阶段执行(均在 /etc/init.d/openclash start_service 流程中):
第一阶段 — UCI 预处理(overwrite_file() 函数,在 yml_change.sh 之前执行):
- 遍历 UCI 中所有
config_overwrite条目(按order排序) - 检查覆写是否匹配当前配置文件(
config字段只支持all或完整配置文件路径;为空或只写文件名都不会匹配,该模块直接跳过) - 读取
/etc/openclash/overwrite/<名称>文件内容 - 解析
[General]段 → 将键值对写入 UCIopenclash.@overwrite[0](如EN_MODE、DNS_PORT等),供后续yml_change.sh读取 - 处理
DOWNLOAD_FILE指令 → 下载外部文件 - 生成覆写清单
/tmp/yaml_openclash_overwrite_lines(M/Y/L记录 = 模块块 / 其[YAML]块路径 /[Overwrite]行,暂不执行)
第二阶段 — YAML 覆写(YAML.overwrite_run() 单进程执行,在 yml_change.sh 和 yml_rules_change.sh 之后):
7. 按模块顺序处理:先合并该模块 [YAML] 块,再执行其 [Overwrite] 段的 ruby_* 调用(等效旧行为)
8. 全部模块完成后统一 dump 一次运行配置
执行顺序含义:
[General]段在yml_change.sh之前生效(因为写入 UCI),因此可以影响yml_change.sh的行为;[Overwrite]和[YAML]段在yml_change.sh和yml_rules_change.sh之后执行,因此可以覆盖这两个脚本的所有输出——包括「插件强制覆盖/禁用的设置」表格中的硬编码项(如allow-lan、bind-address、sniffer.sniff等)。⚠️ 覆盖这些硬编码项可能导致功能异常,请谨慎使用。
覆写模块能做什么:
- 给订阅配置追加/覆盖任意 Mihomo YAML 字段(如 DNS、Sniffer、TUN、规则等)
- 设置环境变量供
yml_change.sh等后续脚本使用 - 下载外部文件(通过
DOWNLOAD_FILE指令) - 配置 LuCI 页面里没有的高级功能
16.2 覆写文件的格式
覆写文件使用 INI 风格的分段格式,支持三个段:
[General]
# 键值对,将作为环境变量导出
# 支持的 key 列表见下方
[Overwrite]
# Shell 命令,可使用 ruby_* 函数族操作 YAML
[YAML]
# 原始 YAML 片段,将合并到运行配置⚠️ 强制要求:覆写文件必须包含至少一个段头(
[General]、[Overwrite]、[YAML]之一),否则所有内容将被忽略,覆写模块不会生效。这是因为overwrite_file()函数(/etc/init.d/openclash)按段头解析文件内容——所有标志位in_general/in_overwrite/in_yaml初始为0,仅在遇到对应段头时才设为1。段头之前、之后无段头的内容均被跳过。空行和以#/;开头的注释行会被安全忽略,不影响段头解析。
16.2.1 `[General]` 段 — 键值对/环境变量
每行格式: KEY = VALUE(大小写不敏感,会自动转大写)
允许的所有 Key (共 102 个,由 overwrite_file() 函数中的 allowed_keys_types 定义):
| 类别 | Key 示例 | 类型 | 说明 |
|---|---|---|---|
| 端口 | DNS_PORT, PROXY_PORT, TPROXY_PORT, HTTP_PORT, SOCKS_PORT, MIXED_PORT |
int | 覆写端口号 |
| 模式 | EN_MODE, PROXY_MODE, STACK_TYPE |
string | 覆写运行/代理模式 |
| DNS | ENABLE_CUSTOM_DNS, ENABLE_RESPECT_RULES, APPEND_WAN_DNS, APPEND_DEFAULT_DNS |
int_bool | DNS 覆写 |
| Fake-IP | FAKEIP_RANGE, FAKEIP_RANGE6, STORE_FAKEIP, CUSTOM_FAKEIP_FILTER, CUSTOM_FAKEIP_FILTER_MODE |
string/int_bool | Fake-IP 相关 |
| Meta | ENABLE_TCP_CONCURRENT, ENABLE_UNIFIED_DELAY, ENABLE_META_SNIFFER, ENABLE_META_SNIFFER_PURE_IP, ENABLE_GEOIP_DAT |
int_bool | Meta 内核 |
| 流量 | ROUTER_SELF_PROXY, DISABLE_UDP_QUIC, SKIP_PROXY_ADDRESS, COMMON_PORTS, CHINA_IP_ROUTE, CHINA_IP_ROUTE_DOMAIN_SOURCE |
int_bool/int/string | 流量控制 |
| IPv6 | IPV6_ENABLE, IPV6_MODE, IPV6_DNS |
int_bool/int | IPv6 |
| GEO | GEO_AUTO_UPDATE, GEOIP_AUTO_UPDATE, GEOSITE_AUTO_UPDATE, GEOASN_AUTO_UPDATE |
int_bool | GEO 更新 |
| 自定义 | ENABLE_CUSTOM_CLASH_RULES, ENABLE_RULE_PROXY |
int_bool | 规则 |
| Smart | AUTO_SMART_SWITCH, SMART_ENABLE_LGBM, SMART_POLICY_PRIORITY |
int_bool/string | Smart 策略 |
| 特殊 | CONFIG_FILE |
string | 覆写 config_path(切换配置,仅接受 /etc/openclash/ 下的普通文件,见下注) |
| 特殊 | AGE_SECRET_KEY, AGE_PUBLIC_KEY |
string | Age 加密密钥 |
| 特殊 | SUB_INFO_URL |
string | 订阅信息 URL |
| 特殊 | DOWNLOAD_FILE |
string | 下载外部文件(见单独说明) |
| 特殊 | DASHBOARD_PASSWORD |
string | Dashboard 密码(写入 UCI dashboard_password) |
| 特殊 | GLOBAL_UA |
string | 全局 User-Agent |
| 特殊 | RESTART |
bool | 覆写变更后是否重启 |
类型说明: int=整数, int_bool=0/1, bool=true/false, string=任意字符串
⚠️
CONFIG_FILE路径限制:只接受/etc/openclash/下的普通文件——路径含..、以/结尾、文件名以.开头,或落在/etc/openclash/之外,整条都会被跳过并记录skip config file outside /etc/openclash/skip config file with unsafe path/skip hidden config file(日志末尾是【General Key => 模块名: 路径】)。合法写法如/etc/openclash/config/Custom_Clash.yaml。
这些环境变量在
yml_change.sh、yml_rules_change.sh及自定义覆写脚本中可通过$KEY_NAME直接引用。
本表按类别分组概览;完整 Key 列表与对应 UCI 见17-overwrite-module-examples.md§17.5.2 速查表。
⚠️ [General] 段 = 插件设置的修改来源:
[General]是覆写模块中唯一能修改「插件设置」(UCI 层选项)的途径——重启时overwrite_file()将键值对写入 UCI(openclash.@overwrite[0]),供yml_change.sh/yml_rules_change.sh读取生效;[YAML]/[Overwrite]段只能修改运行 YAML。凡修复涉及插件设置(运行/代理模式、端口、DNS、Fake-IP、Meta、流量控制、IPv6、GEO、Smart 等本表所列类别,对应 LuCI「覆写设置」CBI 页选项,见11-overwrite-settings.md)时,必须在[General]段以KEY = VALUE覆写,而非用[YAML]。示例见17-overwrite-module-examples.md§17.3(EN_MODE = fake-ip-tun)。
16.2.2 `[Overwrite]` 段 — Ruby 函数调用
此段每行是一次 ruby_* 函数的调用(均以目标 YAML 文件路径作为首个参数;编辑目标始终是当前运行配置),由 YAML.rb 的 YAML.overwrite_run() 以 root 权限统一解析执行(解析与安全规则见下方 ⚠️):
ruby_read <file> <key_path>— 读取 YAML 值ruby_read_hash <var> <key_path>— 读取 Ruby 变量中的哈希值ruby_read_hash_arr <file> <key_path> <sub_path>— 遍历哈希数组并读取每个元素的子值ruby_edit <file> <key_path> <value>— 修改 YAML 键值ruby_cover <file> <key_path> <src_file> <sub_path>— 覆盖 YAML 键值:来源文件存在时取其同名键的值赋给键路径,来源文件不存在则删除该键ruby_merge <file> <key_path> <src_file> [<sub_path>]— 从文件合并 YAML 哈希ruby_merge_hash <file> <key_path> <hash>— 合并指定哈希到键路径ruby_uniq <file> <key_path>— 数组去重ruby_arr_add_file <file> <key_path> <list_file> <sub_path>— 从文件将数组元素插入到指定下标ruby_arr_head_add_file <file> <key_path> <list_file> <sub_path>— 从文件将数组元素插入到数组开头ruby_arr_insert <file> <key_path> <value>— 在数组指定下标插入单个元素ruby_arr_insert_hash <file> <key_path> <hash>— 在数组指定下标插入哈希ruby_arr_insert_arr <file> <key_path> <array>— 在数组指定下标插入一个数组ruby_arr_edit <file> <key_path> <sub_key> <match_value> <new_sub_key> <new_value>— 按字段匹配编辑数组元素;末两参留空时退化为按值替换:ruby_arr_edit <file> <key_path> "" <old_value> "" <new_value>ruby_map_edit <file> <key_path> <map_key> <sub_path> <value>— 编辑哈希内嵌套哈希的字段ruby_delete <file> <key_path> [<key>]— 删除键/数组元素(省略键时删除键路径本身)uci_get_config <key>— 读取 UCI 配置(覆写优先)
⚠️ 行级解析与安全(
YAML.rb→overwrite_parse_line()+ AST 白名单):整行必须是单个白名单ruby_*函数调用,且每个参数整体被引号包裹。① 双引号参数:$NAME/${NAME}(NAME匹配[A-Za-z_][A-Za-z0-9_]*)展开为环境变量(含$CONFIG_FILE,执行器自动把它指向当前运行配置),其余一切字符一律按字面量处理——\、;、反引号、$( )都不会触发任何 shell 展开或命令替换(**不再需要转义**;$1、$$、$(非变量名形式原样保留)。② **单引号参数**:完全不展开,原样传给后续 Ruby 求值。③ **代码参数过 AST 白名单**(fail-closed):只放行Value读写与常见 String/Array/Hash 方法、lambda、条件/循环/插值等 YAML 编辑语法(名单见YAML.rb的OVERWRITE_NODES/OVERWRITE_METHODS/OVERWRITE_OPERATORS/OVERWRITE_CONSTANTS),未列入的调用(system/send/File./ENV/反引号/%x等)一律拒绝;纯值参数与引号内的选项字不受影响。④ 语法违反(未加引号、引号不配对、行尾多余内容、非白名单函数)或未通过白名单 → 跳过并记录skip invalid Overwrite command【Ruby Script => 模块名: 行】。⇒ 正则可直接写\.(旧写法[.]仍有效);值里有字面$仍建议用单引号参数(示例见17-overwrite-module-examples.md§17.3.6)。
自定义覆写脚本(§17.4)的ruby_*调用由ruby_record()(ruby.sh)以 NUL 分隔的定长记录写入/tmp/yaml_openclash_custom_calls,脚本运行完后由YAML.overwrite_run_custom()统一执行;代码参数未通过白名单时记录skip unsafe Overwrite command。
16.2.3 `[YAML]` 段 — 原始 YAML 注入(含操作符)
[YAML] 段使用 Ruby 将内容深度合并到运行配置文件。支持多种操作符后缀实现精细控制:
操作符速查表:
| 操作符 | 写法 | 行为 |
|---|---|---|
| 默认合并 | key 或 <key> |
Hash 递归合并,标量直接覆盖,键不存在则添加;数组整体替换(追加/插入须用 key+ / +key) |
| 强制覆盖 | key! 或 <key>! |
强制替换整个值(不做递归合并) |
| 数组后置追加 | key+ 或 <key>+ |
将新元素追加到数组末尾 |
| 数组前置插入 | +key 或 +<key> |
将新元素插入到数组开头 |
| 数组差集删除 | key- 或 <key>- |
从数组中删除指定元素;非数组则删除整个键 |
| 批量条件更新 | key* 或 <key>* |
按 where 条件匹配,用 set 子句更新(见下) |
<key> 语法用于键名含特殊字符或与操作符冲突时。
大白话:默认合并(key)= 只改你写的那几项,其余不动(但数组是整体替换:写 proxy-groups: 会丢掉全部已有策略组,追加请用 proxy-groups+:);强制覆盖(key!)= 把这一整块整个换成你写的。
环境变量展开:
${NAME}/$NAME(NAME匹配[A-Za-z_][A-Za-z0-9_]*)会展开为环境变量值([General]的 Key、订阅param等);其余$写法($1、${weird-name}、$(cmd)、反引号)原样保留且不执行命令替换,$紧跟$时两个$都原样保留(所以密码里的P@$$w0rd不会被吃掉)。因此正则里的$行尾锚、(?=…)、引号、反斜杠都可安全书写;目前没有保留字面量$名字的转义写法。
操作符详解与示例
1. 默认合并 (key / <key>)
Hash 值递归合并,键不存在则添加,标量直接覆盖。
dns:
enable: true # 修改现有键
cache-algorithm: lru # 添加新键
mixed-port: 10802 # 直接覆盖标量
tun:
enable: true # 合并 Hash(仅改指定字段,其余保留)
stack: mips2. 强制覆盖 (key! / <key>!)
强制替换整个值,不做递归合并。
dns:
fake-ip-filter!: # 替换整个 fake-ip-filter 数组
- '*.lan'
- 'new.domain.com'
rules!: # 强制覆盖整个 rules 数组
- DOMAIN-SUFFIX,example.com,DIRECT
- MATCH,PROXY
<dns>!: # <> 语法:强制覆盖整个 dns 配置
enable: false
nameserver:
- '114.114.114.114'3. 数组后置追加 (key+ / <key>+)
将新元素追加到数组末尾。
dns:
nameserver+:
- '1.1.1.1'
- '8.8.8.8'
rules+:
- DOMAIN-SUFFIX,example.com,REJECT
<nameserver>+:
- '8.8.8.8'4. 数组前置插入 (+key / +<key>)
将新元素插入到数组开头(优先匹配)。
dns:
+nameserver:
- '223.5.5.5'
+rules:
- DOMAIN-SUFFIX,priority.com,DIRECT
+<nameserver>:
- '119.29.29.29'5. 数组删除/键删除 (key- / <key>-)
从数组中移除指定元素;对非数组删除整个键。值为空(null/~)时删除整个键。
dns:
nameserver-:
- '8.8.8.8'
- '8.8.4.4'
rules-:
- DOMAIN-SUFFIX,old.com,REJECT
cache-algorithm-: # 删除整个 cache-algorithm 键6. 批量条件更新 (key* / <key>*)
按 where 条件匹配集合元素,用 set 子句更新指定字段。
支持的集合类型: Hash 值数组 (如 proxy-groups)、字符串数组 (如 rules)
where 条件格式: 字段名: 值,支持正则 /pattern/
set 子句支持的操作符: 同顶层(默认覆盖、!、+、-)
# === 对 proxy-groups (Hash 数组) ===
# 按 type 匹配,替换整个 proxies 列表
proxy-groups*:
where:
type: select
set:
proxies:
- 'new-proxy1'
- 'new-proxy2'
# 按 name 正则匹配,向 proxies 开头插入
proxy-groups*:
where:
name: '/^HK/'
set:
+proxies:
- 'hk-new-proxy'
# 按 type 匹配,从 proxies 中移除指定节点
proxy-groups*:
where:
type: select
set:
proxies-:
- 'old-proxy1'
# 使用数组包含条件(proxies 须包含指定元素)
proxy-groups*:
where:
type: select
proxies:
- 'old-proxy1'
set:
proxies:
- 'new-proxy1'
# 修改 url-test 组的 interval
*:
where:
type: url-test
set:
interval: 300
# === 对 proxies (节点数组) ===
# 修改 socks5 节点端口
proxies*:
where:
type: socks5
set:
port: 1080
# === 对 rules (字符串数组) ===
# 替换匹配的规则
rules*:
where:
value: 'DOMAIN-SUFFIX,old.com,REJECT'
set:
value: 'DOMAIN-SUFFIX,new.com,DIRECT'
# 正则匹配删除规则(set value 为空/不写)
rules*:
where:
value: '/,REJECT$/'
set:
value:
# === 对 hosts (Hash 集合) ===
# 更新指定 hosts 键
hosts*:
where:
key: '*.mihomo.dev'
set:
'*.mihomo.dev': '::1'
# 删除指定 hosts 键
hosts*:
where:
key: '*.old.dev'
set:
key-:7. 组合操作
同一块内可同时使用多个操作符:
dns:
nameserver-: # 先删除
- '8.8.8.8'
+nameserver: # 再前置插入
- '223.5.5.5'
nameserver+: # 再后置追加
- '1.0.0.1'16.2.4 `DOWNLOAD_FILE` 特殊指令(`[General]` 段)
格式: DOWNLOAD_FILE = url=..., path=..., cron=..., force=..., ua=..., restart=...
用于在覆写模块中下载外部文件。字段说明:
url— 下载地址 (必填)path— 保存路径 (必填)cron— cron 表达式,0 表示不添加定时任务force—true强制重新下载ua— 自定义 User-Agentrestart—true下载后重启核心
⚠️ 路径限制:
path必须位于/etc/openclash/或/tmp/下且不含..,否则跳过该下载任务并记录skip download file outside /etc/openclash or /tmp或skip download file with unsafe path。
File: .github/skills/openclash-user-guide/17-overwrite-module-examples.md
覆写模块示例与 UCI 结构
用途: 覆写模块实战示例、获取/匹配方式与 UCI 覆写条目结构、[General] Key 速查(§17.1–17.5)。
AI 行为指引: 当用户询问「覆写模块怎么写/怎么用」「给个示例」时,AI 应先确认用户需求(追加还是替换?改插件设置还是运行 YAML?),再按本文件 §17.3 示例给出带段头的可运行配置。格式与操作符细节见
16-overwrite-module-format.md§16.2;[General]允许的 Key 见 §16.2.1 与 §17.5.2。
小节索引: §17.1 获取方式 · §17.2 匹配规则 · §17.3 实战示例(§17.3.1–17.3.8)· §17.4 自定义脚本 · §17.5 UCI 结构(§17.5.1 字段详解 / §17.5.2 Key 速查)
17.1 覆写模块的两种获取方式
| 类型 | UCI type 值 |
说明 |
|---|---|---|
| 本地模块 | file |
读取 /etc/openclash/overwrite/<名称> |
| 远程模块 | http |
从 URL 下载到 /etc/openclash/overwrite/<名称>,支持 cron 定时更新 |
远程模块可设置 update_days 和 update_hour 实现定时自动拉取。
插件内置四个订阅型模块(
type=http、update_days=off、config=all、enable=0):default(order=1)、Google_Play(order=2,用于解决 Google 商店下载/更新失败)、Tailscale(order=3)与WiFi_Calling(order=4,让运营商 ePDG 的 IKE/NAT-T 流量走代理,需在模块参数中指定 UDP 代理组),都可在「覆写模块」窗口启用。
17.2 覆写与配置文件的匹配
每个覆写条目可指定目标配置文件(config 字段,ListValue):
all— 对所有配置文件生效/etc/openclash/config/xxx.yaml— 仅对该配置文件生效
17.3 实战示例
17.3.1 强制启用 TUN 模式 + 设置 DNS
[General]
EN_MODE = fake-ip-tun
STACK_TYPE = mips17.3.2 通过 [Overwrite] 段添加自定义代理组
[Overwrite]
# 第 2 参是键路径,第 3 参是插入下标,第 4 参是 Ruby 哈希字面量(注意用 => 而非 JSON 的 :)
ruby_arr_insert_hash "$CONFIG_FILE" "['proxy-groups']" "0" "{'name'=>'手动切换', 'type'=>'select', 'proxies'=>['DIRECT', 'Proxy']}"17.3.3 通过 [YAML] 段覆写完整 DNS 配置(默认合并 `key`)
操作符:默认合并(
key)——dns:哈希递归合并,enable/enhanced-mode/nameserver/fallback/fallback-filter均为键级覆盖或新增,未列出的dns子键保留。
[YAML]
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback:
- tls://8.8.4.4
- tls://1.1.1.1
fallback-filter:
geoip: true
geoip-code: CN17.3.4 通过 [YAML] 段覆写 Sniffer(默认合并 `key`)
操作符:默认合并(
key)——sniffer:哈希递归合并,仅覆盖所列字段(enable/force-dns-mapping/parse-pure-ip/sniff),其余键保留。
[YAML]
sniffer:
enable: true
force-dns-mapping: true
parse-pure-ip: true
sniff:
TLS:
ports: [443, 8443]
HTTP:
ports: [80, 8080-8880]17.3.5 通过 [YAML] 段追加自定义规则(数组后置追加 `key+`)
操作符:数组后置追加(
rules+)——将下列规则追加到现有rules:数组末尾。注意:若改用默认合并(rules:)会整体替换整个规则数组,而非追加。
[YAML]
rules+:
- DOMAIN-SUFFIX,google.com,Proxy
- DOMAIN-KEYWORD,youtube,Proxy
- GEOSITE,netflix,NETFLIX
- GEOIP,CN,DIRECT
- MATCH,Proxy17.3.6 通过 [Overwrite] + ruby 函数动态修改(Shell 函数族,非 [YAML] 操作符)
[Overwrite]
# 把规则文件的条目插到 rules 开头(第 2 参是键路径,第 4 参是列表文件内的取值路径)
ruby_arr_head_add_file "$CONFIG_FILE" "['rules']" "/etc/openclash/custom/openclash_custom_rules.list" "['rules']"
# 删除 proxy-providers 下的指定条目
ruby_delete "$CONFIG_FILE" "['proxy-providers']" "provider1"
# 用外部文件里的 nameserver 列表替换 dns.nameserver
ruby_cover "$CONFIG_FILE" "['dns']['nameserver']" "/etc/openclash/custom/openclash_custom_dns.yaml" "nameserver"
ruby_merge_hash "$CONFIG_FILE" "['tun']" "'stack' => 'mips'"⚠️ 写法限制:每行必须是单个白名单
ruby_*函数调用且参数整体加引号;参数内可含\、;、$( )、引号内的反引号(一律按字面量处理**,不会触发 shell 展开或命令替换,无需转义);代码参数过 AST 白名单(Value读写 + 常用 String/Array/Hash 方法 +lambda/条件/循环/插值等),未列入的调用(system/send/File./ENV/反引号等)会被拒并记录skip invalid Overwrite command(详见16-overwrite-module-format.md§16.2.2)。正则里的\.可直接书写(旧写法[.]仍有效);**字面$用单引号参数避免被当环境变量展开:
[Overwrite]
ruby_map_edit "$CONFIG_FILE" "['proxy-providers']" "provider1" "['filter']" '^abc\.com$x'被拦下的行不会执行,日志里是
skip invalid Overwrite command【Ruby Script => 模块名: 行】。
17.3.7 使用 CONFIG_FILE 切换配置 + 设置 Age 密钥
[General]
CONFIG_FILE = /etc/openclash/config/my_custom.yaml
AGE_SECRET_KEY = AGE-SECRET-KEY-xxxxxxxxx17.3.8 下载外部规则文件
[General]
DOWNLOAD_FILE = url=https://example.com/rules.yaml, path=/etc/openclash/rule_provider/custom_rules.yaml, ua=clash-verge/v2.4.5, cron=0 2 * * *17.4 自定义覆写脚本(旧方式,兼容保留)
文件: /etc/openclash/custom/openclash_custom_overwrite.sh
执行时机: 在 yml_change.sh 和 yml_rules_change.sh 之间执行
特点: 可以使用项目提供的 ruby_* 函数族
值写法限制:同 [Overwrite] 段(见 §17.3.6 与 16-overwrite-module-format.md §16.2.2)——\、;、反引号、$( ) 一律按字面量处理,不能出现 eval/exec/Kernel 等进程/反射 token;ruby_* 调用先由 ruby_record() 记录、脚本结束后由 YAML.overwrite_run_custom() 统一执行,命中 token 时跳过并记录 skip unsafe Overwrite command。
#!/bin/bash
. /usr/share/openclash/ruby.sh
CFG_FILE=$(uci_get_config "config_path")
if [ -f "$CFG_FILE" ]; then
ruby_arr_head_add_file "$CFG_FILE" "['rules']" "/etc/openclash/custom/openclash_custom_rules.list" "['rules']"
fi17.5 UCI 覆写条目结构速查
每个 config_overwrite 条目(对应 /etc/config/openclash 中 config config_overwrite 段)的 UCI 字段:
| UCI Key | 类型 | 默认 | 说明 |
|---|---|---|---|
name |
string | (必填) | 唯一标识,对应 /etc/openclash/overwrite/<name> 覆写文件名 |
enable |
bool | 0 |
1=启用该覆写条目 |
type |
string | file |
file=本地模块;http=远程下载(需配置 url/update_days/update_hour) |
url |
string | (空) | type=http 时的下载地址 |
config |
ListValue | (空) | 目标配置文件列表。all=应用到所有配置;或指定具体路径如 /etc/openclash/config/xx.yaml。为空则永不匹配,覆写不生效 |
param |
string | (空) | 传给覆写文件的额外键值对,格式 KEY1=VALUE1;KEY2=VALUE2 |
order |
int | 0 |
排序权重。值越大越先执行,新条目自动取 max_order+1 |
update_days |
string | (空) | type=http 时 cron 星期 (0-7, *=每天, off=不自动更新) |
update_hour |
string | (空) | type=http 时 cron 小时 (0-23, off=不自动更新) |
17.5.1 字段详解
config (目标配置):
- 覆写条目必须通过此字段匹配当前运行的配置文件才会执行。匹配逻辑(
overwrite_config_match_check()):config列表包含all→ 匹配所有配置config列表包含当前config_pathUCI 值 → 匹配config为空 → 永不匹配,覆写不生效(常见配置错误)- ⚠️
config必须是 UCI 列表(LuCI 界面自动用set_list写入)
- 支持同时匹配多个配置文件。
type + url + update_* (远程覆写):
type=http时,init.d的add_overwrite_cron()注册 cron 任务定时从url下载覆写文件到/etc/openclash/overwrite/<name>- 若覆写文件的
[General]段包含RESTART:true,下载后自动重启核心 update_days/update_hour任一为空或为off→ 不注册 cron(仅手动触发下载)type=file时不需要url/update_*字段
param (额外参数):
- 格式
KEY1=VALUE1;KEY2=VALUE2,分号分隔 - 值以环境变量
$KEY1、$KEY2导出,可在[Overwrite]行的双引号参数内直接引用($KEY1/${KEY1}会展开;单引号参数内原样保留)
order (执行顺序):
- 多条覆写按
sort -nr(数值降序)排列执行 - 新上传的覆写条目自动获得
max_order + 1
17.5.2 `[General]` 段允许的 Key 速查
覆写文件的
[General]段中可设置以下 key(大小写不敏感),写入 UCIopenclash.@overwrite[0]。
来源:init.d/openclash→overwrite_file()→allowed_keys_types列表。
| Key | 类型 | 对应 UCI | 说明 |
|---|---|---|---|
EN_MODE |
string | en_mode |
运行模式 |
PROXY_MODE |
string | proxy_mode |
代理模式 |
DNS_PORT |
int | dns_port |
DNS 端口 |
PROXY_PORT |
int | proxy_port |
流量转发端口 |
TPROXY_PORT |
int | tproxy_port |
TProxy 端口 |
HTTP_PORT |
int | http_port |
HTTP 代理端口 |
SOCKS_PORT |
int | socks_port |
SOCKS5 端口 |
MIXED_PORT |
int | mixed_port |
混合代理端口 |
CN_PORT |
int | cn_port |
API 端口 |
DASHBOARD_PASSWORD |
string | dashboard_password |
Dashboard 密钥 |
TOLERANCE |
int | tolerance |
URL-Test 容差 |
URLTEST_ADDRESS_MOD |
string | urltest_address_mod |
测速地址 |
URLTEST_INTERVAL_MOD |
int | urltest_interval_mod |
测速间隔 |
GITHUB_ADDRESS_MOD |
string | github_address_mod |
GitHub CDN 地址 |
ENABLE_REDIRECT_DNS |
int_bool | enable_redirect_dns |
DNS 劫持模式 |
ENABLE_CUSTOM_DNS |
int_bool | enable_custom_dns |
自定义 DNS |
ENABLE_RESPECT_RULES |
int_bool | enable_respect_rules |
DNS 尊重规则 |
ENABLE_META_SNIFFER |
int_bool | enable_meta_sniffer |
域名嗅探 |
ENABLE_META_SNIFFER_PURE_IP |
int_bool | enable_meta_sniffer_pure_ip |
纯 IP 嗅探 |
ENABLE_META_SNIFFER_CUSTOM |
int_bool | enable_meta_sniffer_custom |
自定义嗅探 |
ENABLE_TCP_CONCURRENT |
int_bool | enable_tcp_concurrent |
TCP 并发 |
ENABLE_UNIFIED_DELAY |
int_bool | enable_unified_delay |
统一延迟 |
ENABLE_UDP_PROXY |
int_bool | enable_udp_proxy |
UDP 代理 |
ENABLE_V6_UDP_PROXY |
int_bool | enable_v6_udp_proxy |
IPv6 UDP 代理 |
DISABLE_UDP_QUIC |
int_bool | disable_udp_quic |
禁用 QUIC |
DISABLE_QUIC_GO_GSO |
int_bool | disable_quic_go_gso |
禁用 quic-go GSO |
FIND_PROCESS_MODE |
string | find_process_mode |
进程匹配模式 |
GEODATA_LOADER |
string | geodata_loader |
GEO 加载方式 |
ENABLE_GEOIP_DAT |
int_bool | enable_geoip_dat |
启用 GeoIP Dat |
GLOBAL_UA |
string | global_ua |
全局 User-Agent |
INTERFACE_NAME |
string | interface_name |
绑定网络接口 |
STACK_TYPE |
string | stack_type |
TUN 堆栈类型 |
DELAY_START |
int | delay_start |
延迟启动(秒) |
ROUTER_SELF_PROXY |
int_bool | router_self_proxy |
本机代理 |
CHINA_IP_ROUTE |
int | china_ip_route |
区域绕行 |
CHINA_IP_ROUTE_DOMAIN_SOURCE |
string | china_ip_route_domain_source |
Fake-IP 中国大陆域名数据源(mrs/geosite) |
CHINA_IP6_ROUTE |
int | china_ip6_route |
IPv6 区域绕行 |
COMMON_PORTS |
string | common_ports |
常用端口 |
INTRANET_ALLOWED |
int_bool | intranet_allowed |
仅内网 |
SMALL_FLASH_MEMORY |
int_bool | small_flash_memory |
小闪存模式 |
STORE_FAKEIP |
int_bool | store_fakeip |
持久化 Fake-IP |
BYPASS_GATEWAY_COMPATIBLE |
int_bool | bypass_gateway_compatible |
旁路由兼容 |
SKIP_PROXY_ADDRESS |
int_bool | skip_proxy_address |
绕过服务器地址 |
IPV6_ENABLE |
int_bool | ipv6_enable |
IPv6 代理 |
IPV6_MODE |
int | ipv6_mode |
IPv6 代理模式 |
IPV6_DNS |
int_bool | ipv6_dns |
IPv6 DNS 解析 |
FAKEIP_RANGE |
string | fakeip_range |
Fake-IP 范围 |
FAKEIP_RANGE6 |
string | fakeip_range6 |
IPv6 Fake-IP 范围 |
CUSTOM_FALLBACK_FILTER |
int_bool | custom_fallback_filter |
Fallback-Filter |
CUSTOM_FAKEIP_FILTER |
int_bool | custom_fakeip_filter |
Fake-IP-Filter |
CUSTOM_FAKEIP_FILTER_MODE |
string | custom_fakeip_filter_mode |
Filter 模式 |
CUSTOM_HOST |
int_bool | custom_host |
自定义 Hosts |
CUSTOM_NAME_POLICY |
int_bool | custom_name_policy |
Nameserver-Policy |
APPEND_WAN_DNS |
int_bool | append_wan_dns |
追加 WAN DNS |
APPEND_DEFAULT_DNS |
int_bool | — | 追加默认 DNS |
AGE_SECRET_KEY |
string | — | Age 加密私钥 |
AGE_PUBLIC_KEY |
string | — | Age 加密公钥 |
CONFIG_FILE |
string | — | 覆写指定配置文件路径(仅接受 /etc/openclash/ 下的普通文件,含 ..、以 . 开头或目录会被跳过) |
SUB_INFO_URL |
string | — | 订阅信息查询 URL |
DOWNLOAD_FILE |
string | — | 下载外部文件(格式见 16-overwrite-module-format.md §16.2.4) |
RESTART |
bool | — | true=覆写后重启核心(仅 type=http cron 更新时) |
LAN_INTERFACE_NAME |
string | lan_interface_name |
LAN 接口名称 |
INTRANET_ALLOWED_WAN_NAME |
string | intranet_allowed_wan_name |
WAN 接口名称 |
CORE_TYPE |
string | core_type |
核心类型 |
OIX_TOKEN |
string | oix_token |
oixCloud Token |
OIX_PARAMS |
string | oix_params |
oixCloud 参数 |
| GEO 订阅类 | |||
GEO_AUTO_UPDATE |
int_bool | geo_auto_update |
自动更新 GeoIP MMDB |
GEO_CUSTOM_URL |
string | geo_custom_url |
MMDB 自定义 URL |
GEO_UPDATE_DAY_TIME |
string | geo_update_day_time |
MMDB 更新时间 |
GEO_UPDATE_WEEK_TIME |
int | geo_update_week_time |
MMDB 更新星期 |
GEOIP_AUTO_UPDATE |
int_bool | geoip_auto_update |
自动更新 GeoIP Dat |
GEOIP_CUSTOM_URL |
string | geoip_custom_url |
Dat 自定义 URL |
GEOIP_UPDATE_DAY_TIME |
int | geoip_update_day_time |
Dat 更新时间 |
GEOIP_UPDATE_WEEK_TIME |
int | geoip_update_week_time |
Dat 更新星期 |
GEOSITE_AUTO_UPDATE |
int_bool | geosite_auto_update |
自动更新 GeoSite |
GEOSITE_CUSTOM_URL |
string | geosite_custom_url |
GeoSite 自定义 URL |
GEOSITE_UPDATE_DAY_TIME |
string | geosite_update_day_time |
GeoSite 更新时间 |
GEOSITE_UPDATE_WEEK_TIME |
int | geosite_update_week_time |
GeoSite 更新星期 |
GEOASN_AUTO_UPDATE |
int_bool | geoasn_auto_update |
自动更新 GeoASN |
GEOASN_CUSTOM_URL |
string | geoasn_custom_url |
ASN 自定义 URL |
GEOASN_UPDATE_DAY_TIME |
string | geoasn_update_day_time |
ASN 更新时间 |
GEOASN_UPDATE_WEEK_TIME |
int | geoasn_update_week_time |
ASN 更新星期 |
| 大陆路由类 | |||
CHNR_AUTO_UPDATE |
int_bool | chnr_auto_update |
大陆路由自动更新 |
CHNR_CUSTOM_URL |
string | chnr_custom_url |
大陆 IPv4 URL |
CHNR6_CUSTOM_URL |
string | chnr6_custom_url |
大陆 IPv6 URL |
CHNR_UPDATE_DAY_TIME |
string | chnr_update_day_time |
路由更新时间 |
CHNR_UPDATE_WEEK_TIME |
string | chnr_update_week_time |
路由更新星期 |
CHINA_IP_ROUTE_PASS |
string | — | 大陆路由绕过列表 |
CHINA_IP6_ROUTE_PASS |
string | — | 大陆 IPv6 路由绕过列表 |
| Smart 类 | |||
AUTO_SMART_SWITCH |
int_bool | auto_smart_switch |
Smart 自动切换 |
SMART_ENABLE_LGBM |
int_bool | smart_enable_lgbm |
启用 LightGBM |
SMART_POLICY_PRIORITY |
string | smart_policy_priority |
策略优先级 |
SMART_PREFER_ASN |
int_bool | smart_prefer_asn |
优先 ASN |
SMART_TOLERANCE |
int | smart_tolerance |
Smart 容差 |
SMART_COLLECT |
int_bool | smart_collect |
收集训练数据 |
SMART_COLLECT_RATE |
string | smart_collect_rate |
数据采样率 |
SMART_COLLECT_SIZE |
int | smart_collect_size |
数据文件大小 |
LGBM_AUTO_UPDATE |
int_bool | lgbm_auto_update |
LGBM 自动更新 |
LGBM_CUSTOM_URL |
string | lgbm_custom_url |
LGBM 自定义 URL |
LGBM_UPDATE_INTERVAL |
int | lgbm_update_interval |
LGBM 更新间隔 |
| 规则类 | |||
ENABLE_CUSTOM_CLASH_RULES |
int_bool | enable_custom_clash_rules |
自定义规则 |
ENABLE_RULE_PROXY |
int_bool | enable_rule_proxy |
仅代理命中规则 |
类型说明:
int_bool=值为0或1;bool=值为true或false;int=纯整数;string=任意字符串。
所有 key 大小写不敏感,写入 UCI 时自动转换为小写。不在上表中的 key 会被check_type()校验拦截并输出skip General key not allowed警告。
按类别分组概览见16-overwrite-module-format.md§16.2.1;本表为完整速查(含对应 UCI)。
File: .github/skills/openclash-user-guide/99-out-of-scope.md
[Binary file]