OpenClash Documentation

A Clash Client For OpenWrt

27,878 stars JavaScript JavaScript 1 file · ~62,120 tokens #clash#luci#mihomo#openclash#openwrt#shadowsocks#snell#v2ray
RAW Doc

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,方便配置文件定制

目录

快速开始

网页安装

  1. 从 Release 页面 下载对应架构的安装包(*.ipk 或 *.apk);
  2. 登录 OpenWrt 的 LuCI 后台,前往 系统 → 软件包 上传并安装;
  3. 刷新或者重新登录页面,在 服务 → OpenClash 中导入订阅或上传配置文件并启动。

命令行安装

安装依赖并下载最新版(iptables 防火墙):

shell
# 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):

shell
# 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 编译:

bash
# 解压下载好的 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
bash
# 同步源码
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 内置编辑器

请作者喝杯咖啡

  • PayPal

  • USDT-BSC

许可证

本项目基于 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 ]

text
TLS:
  ports: [443, 8443]

# 默认嗅探 80
HTTP:
  ports: [80, 8080-8880]
  # 是否使用嗅探结果作为实际访问
  override-destination: false

force-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.

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]

text
# 默认嗅探 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

text
# 当 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: 443

    username: 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: 443

    username: 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: yourpsk

    version: 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: yourpsk

    version: 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/h2mux

    max-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 http

    host: 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 now

    tls: 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/3

    alpn: ["h2","http/1.1"]

  • name: "ss5"
    type: ss
    server: server
    port: 443
    cipher: chacha20-ietf-poly1305
    password: "password"
    plugin: gost-plugin
    plugin-opts:
    mode: websocket

    tls: 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-relay

    Dynamic 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: true

    mux: 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: ss

    This 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: true

    udp-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,400100,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: auto

    udp: 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: 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 格式,或者私钥路径

    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: auto

    udp: 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: 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 格式,或者私钥路径

    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 SNI

    skip-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: true

  • name: "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 empty

  • name: "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 # 如果服务端支持可手动设置为true

  • name: "vless-ws"
    type: vless
    server: server
    port: 443
    uuid: uuid
    udp: true
    tls: true
    network: ws

    client-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.com

    v2ray-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.com

    mode: "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-method: repeat-x # Available: repeat-x, tokenish

    uplink-http-method: POST # Available: POST, PUT, PATCH, DELETE

    session-key: ""

    seq-key: ""

    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: yourpsk

    client-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.com

    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 格式,或者私钥路径

    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.com

    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 格式,或者私钥路径

    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: true

    udp: 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: 443

    ports: 1000,2000-3000,5000 # port 不可省略

    auth-str: yourpassword

    obfs: obfs_str

    alpn:

    - h3

    protocol: udp # 支持 udp/wechat-video/faketcp
    up: "30 Mbps" # 若不写单位,默认为 Mbps
    down: "200 Mbps" # 若不写单位,默认为 Mbps

    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

    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: 443

    ports: 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: yourpassword

    obfs: 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: tailscale

    hostname: 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,默认 false

    accept-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,默认 udp

    dev: 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 中复制 内的内容(auth-user-pass 时可省略 cert / key)

    cert: |
    -----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: tuic

    tuicV4 必须填写 token(不可同时填写 uuid 和 password)

    token: TOKEN

    tuicV5 必须填写 uuid 和 password(不可同时填写 token)

    uuid: 00000000-0000-0000-0000-000000000001
    password: PASSWORD_1

    ip: 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_v4

    obfs-param: domain.tld

    protocol-param: "#"

    udp: true

  • name: "ssh-out"
    type: ssh

    server: 127.0.0.1
    port: 22
    username: root
    password: password
    privateKey: path

mieru

  • name: mieru
    type: mieru
    server: 1.2.3.4
    port: 2999

    port-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_ascii

    custom-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: true

    idle-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: password

    client-fingerprint: chrome

    health-check: true
    udp: true

    sni: "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: dns

  • name: "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 测试结果按照节点顺序选择

load-balance 将按照算法随机选择节点

strategy: consistent-hashing # 可选 round-robin 和 sticky-sessions

select 用户自行选择节点

  • name: Proxy
    type: select

    disable-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名称)

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 " 从 age-secret-key 导出 age-public-key
# # 您可以通过 "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.0

    routing-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.0

    routing-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.0

    routing-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.0

    rule: 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.0

    rule: 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.0

    routing-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-gcm

    simple-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.0

    routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)

    psk: your-password
    version: 4 # 仅支持 4/5
    udp: true # UDP over TCP tunnel,默认 true

    obfs-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.0

    routing-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 时生效

  • name: tuic-in-1
    type: tuic
    port: 10815 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
    listen: 0.0.0.0

    routing-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.0

    routing-mark: 0 # 为监听socket设置routing-mark(仅支持linux)

    rule: sub-rule-name1 # 默认使用 rules,如果未找到 sub-rule 则直接使用 rules

    proxy: proxy # 如果不为空则直接将该入站流量交由指定 proxy 处理 (当 proxy 不为空时,这里的 proxy 名称必须合法,否则会出错)

    network: [tcp, udp]
    target: target.com

  • name: vless-in-1
    type: vless
    port: 10817 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
    listen: 0.0.0.0

    routing-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-method: repeat-x # Available: repeat-x, tokenish

    uplink-http-method: POST # Available: POST, PUT, PATCH, DELETE

    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-key: ""

    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 前置的情况)

  • name: anytls-in-1
    type: anytls
    port: 10818 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
    listen: 0.0.0.0

    routing-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.0

    routing-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.0

    routing-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_ascii

    custom-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.0

    routing-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 前置的情况)

  • name: hysteria2-in-1
    type: hysteria2
    port: 10820 # 支持使用ports格式,例如200,302 or 200,204,401-429,501-503
    listen: 0.0.0.0

    routing-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_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-----

    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.0

    routing-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.0

    routing-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-----

注意,listeners中的tun仅提供给高级用户使用,普通用户应使用顶层配置中的tun

  • name: tun-in-1
    type: tun

    rule: 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: false

  • type: input
    id: openclash_version
    attributes:
    label: OpenClash Version
    OpenClash 版本号

    placeholder: "v0.0.0-beta"
    validations:
    required: true

  • type: dropdown
    id: bug_os
    attributes:
    label: Bug on Environment
    发现问题所在的系统环境 / System Environment

    multiple: true
    options:
    - Official OpenWrt
    - Lean
    - Immortalwrt
    - Istoreos
    - Docker
    - Other

    validations:
    required: true

  • type: input
    id: openwrt_version
    attributes:
    label: OpenWrt Version
    Openwrt 固件版本

    placeholder: "OpenWrt 0.0.0 r0-0"
    validations:
    required: true

  • type: 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: true

  • type: textarea
    id: describe_bug
    attributes:
    label: Describe the Bug
    对 Bug 本身清晰而简洁的描述 / Describe the Bug

    validations:
    required: true

  • type: textarea
    id: reproduce_bug
    attributes:
    label: To Reproduce
    复现此 Bug 的步骤 / How to reproduce?

    validations:
    required: true

  • type: textarea
    id: openclash_log
    attributes:
    label: OpenClash Log
    在下方附上 OpenClash 调试日志 / OpenClash Debug Log
    调试日志在插件设置-调试日志中生成,并非只有运行日志,如调试日志过长,可作为附件在最下方上传
    隐私提示: 上传此日志前请注意检查、屏蔽公网IP、节点、密码等相关敏感信息

    placeholder: "我已知晓缺失日志可能会导致开发者无法了解我的情况并降低本issue的处理优先级"
    render: log
    validations:
    required: true

  • type: textarea
    id: openclash_config
    attributes:
    label: OpenClash Config
    在下方附上与 Bug 相关的系统配置、防火墙规则或环境变量 / System config
    非 Clash Yaml 文件
    非必填项

    render: shell
    validations:
    required: false

  • type: textarea
    id: excepted_behavior
    attributes:
    label: Expected Behavior
    对预期修复后情况的清晰明了的描述 / Expected behavior

    validations:
    required: true

  • type: 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: false

  • type: textarea
    attributes:
    label: Describe the Feature
    清晰明了地描述您的想法. 例如你想实现什么 Feature 特性或功能? 如何实现该功能? 目前 OpenClash 的行为是什么?

    validations:
    required: true

  • type: 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)但不重定向:

bash
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 虚拟网卡:

bash
# 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:

bash
# 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)下标记:

bash
nft add rule inet fw4 openclash_mangle_v6 ip6 nexthdr icmpv6 \
  icmpv6 type echo-request mark set "$PROXY_FWMARK" counter accept

IPv6 非 TUN 模式下 ICMPv6 不被标记也不被代理。IPv6 Fake-IP 地址范围的 ping 在非 TUN 的 IPv6 模式下被 REJECT(返回 icmpv6 admin-prohibited),条件为 $ipv6_mode -ne 2 -a $ipv6_mode -ne 3。TUN/Mix 模式下的 IPv6 Fake-IP ping 同样由内核的 skipPingForwardingByAddr() 处理(伪造回复)。

一句话说明:普通模式下 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 内核按以下优先级处理:

  1. 目标是 Fake-IP 地址(resolver.IsFakeIP(addr)) → 返回 nil, nil,内核用伪造的 echo-reply 回复。上层看到 "ping 成功" 但实际未经过网络,延迟显示为虚假的 ~0ms
  2. 目标是 TUN 接口自身 IP(inet4_address / inet6_address 范围内) → 同上,伪造回复
  3. disable-icmp-forwarding: true → 所有 ICMP 均伪造回复
  4. 以上均不满足(真实 IP 且未禁用转发) → 通过 ping.ConnectDestination() 以 DIRECT 模式发出真实 ICMP 包,等待真实 reply。延迟为本地网络到目标的实际 RTT
  5. 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):

bash
# 入站规则: 跳过代理
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 模块:

bash
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):

bash
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):

bash
iptables -t mangle -N openclash
iptables -t mangle -A openclash -p udp -m set --match-set localnetwork dst -j RETURN
iptables -t mangle -A openclash -p udp -j TPROXY --on-port 7895 --tproxy-mark 0x162
iptables -t mangle -A PREROUTING -p udp -j openclash

6.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 != local masquerade),默认 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 时执行):

bash
# 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()):

bash
# 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)
fi

chnroute_pass 的 dnsmasq 集成:

  • 创建 china_ip_route_pass ipset/nftset
  • 将 chnroute_pass 域名加入 set: ipset=/domain.com/china_ip_route_pass 或 nftset=/domain.com/4#inet#fw4#china_ip_route_pass
  • 效果: DNS 解析这些域名时加入 set 便于在匹配时绕过(而非被 chnroute 影响)

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 → 常规设置 → 「重绑定保护」开关、「域名白名单」字段。

bash
# 域名白名单(保留防护)
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 → 修改 UCI en_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 字段,同时更新 UCI proxy_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),对应 Mihomo external-controller
  • dashboard_password — API 密钥,对应 Mihomo secret
  • dashboard_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)
  • 用户认证: authentication TypedSection 中的 username/password,对应 Mihomo authentication 配置
  • 提供 复制代理地址、复制认证信息、生成 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 实现总览

插件设置页的选项通过以下路径生效:

text
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 → 修改 UCI operation_mode

8.2.11 运行模式实现详解

启动流程中的关键变量传递 (来自 init.d start_service()):

  1. get_config() 读取 UCI en_mode,解析出 en_mode_tun(TUN 标记)、en_mode_fakeip(Fake-IP 标记)、en_mode_mix(混合标记)
  2. 将这些传递给 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)

  1. 默认 mips(插件默认,见 §8.2.14):两种形态吞吐最高、短连接最快。
  2. gso 保持开启(插件默认):全栈全形态正收益,是唯一有量级影响的数据面参数。
  3. 看重每字节 CPU 选 system(吞吐约为 mips 的一半);mixed ≈ system;gvisor 不建议使用(除纯大流量上传外均不可靠)。
  4. 必须整机接管时才用 TUN:REDIRECT / TPROXY 的内核短路比 TUN 数据面便宜 1–2 个数量级(见 §8.2.13)。
  5. 高并发会明显降速: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)

  1. 优先 REDIRECT/TPROXY:批量吞吐与直连同级(内核 splice 零拷贝中继),每 256 MB core CPU 约 0.1 s、只有 TUN 数据面的约 1/30–1/100;短连接约为直连的 50%,高于 TUN。
  2. TPROXY-TCP 的意义在于透明代理链路更干净,属功能取舍而非性能优化:REDIRECT 在 PREROUTING 把目标 DNAT 成本地地址,代理只能靠 getsockopt(SO_ORIGINAL_DST) 从 conntrack 反查客户端原本要去的目标(查不到就静默断连);TPROXY 不改写报文,目标直接来自报文本身(github.com/metacubex/mihomo/listener/tproxy/tproxy.go 读 conn.LocalAddr())。源 IP 两种方式都会保留。
  3. 旁路由纯转发(不经代理)不是瓶颈:转发 + NAT 可达线路速率,CPU 开销可忽略(FLOWOFFLOAD 把已建立连接交给 flowtable,开关无差异,且不影响被代理流量——命中 mark/TPROXY 的报文本就不走 offload)。旁路由的 masquerade 可关(主路由能回程即可)但收益≈零。
  4. 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 转发两种形态)

  1. 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 属设备层,与所选栈无关。
  2. 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 无改善。
  3. 栈选择见 §8.2.12(数据见 §8.4.2):默认 mips + gso(两种形态吞吐最高、短连接最快);看重每字节 CPU 选 system;gvisor 仅在纯大流量上传时有优势;四种栈代理路由器自身流量经插件默认的标记 + 策略路由即可(无需 auto-redirect)。
  4. 延迟:满载时小请求延迟 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)。
  5. 内核 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)。
  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 吞吐同样有正收益。
  7. 持续满载无衰减:连续满载 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 生效):

yaml
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() 通过 UCI firewall.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 后,加入已存在的 localnetwork nft 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_pass nft 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%(gvisor 0.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+ 轮、gvisor 4 连接循环 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)、system 40 连接 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)

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_branch API 即时保存到 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 界面断连。

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 获取 token
  • oix_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()` 源码)

规则生成流程:

text
config_foreach firewall_lan_ac_traffic "lan_ac_traffic"
  → 读取每个启用的 section 的 UCI 字段
  → 构建 nftables/iptables 匹配条件
  → 按运行模式 + 协议 + 地址族插入对应链的 position 0

fw4 (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 实现总览

text
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 将值写入 YAML interface-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 将值写入 YAML log-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,后续被合并到 YAML dns.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 格式示例:

yaml
geoip: 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 格式示例:

yaml
dns:
  nameserver:
    - 223.5.5.5
    - tls://8.8.4.4
  fallback:
    - tls://1.1.1.1

DNS 服务器地址后缀语法(#):

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 写入 YAML tcp-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 包中的 SNI
    • force-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 格式示例:

yaml
sniffer:
  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 应:

  1. 首先查阅下方「智能设置标签页」中对应 UCI 选项的说明,给出 LuCI 操作路径(覆写设置 → Smart 设置)
  2. 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
  3. Smart 节点选择逻辑简述(github.com/vernesong/mihomo/adapter/outboundgroup/smart.go → selectProxies()):
    ① 获取目标 IP/域名的 ASN 信息 → ② 优先检查用户手动选择的节点 → ③ 查持久化缓存
    (boltDB 存储的历史最优结果)→ ④ 查预取缓存(周期性后台预计算)→ ⑤ 实时调用
    store.GetBestProxyForTarget() 综合历史延迟、抖动、丢包率及 LightGBM 模型预测权重
    计算最优节点 → ⑥ filterProxies() 按权重排序过滤。后台定时任务持续维护排名
    (updateNodeRanking)、预取(runPrefetch)、稳定性检查(checkNodesStable)、
    被封节点恢复检测(checkBlockedNodes)、主机状态检查(checkHostStatus)。
  4. 关于"如何训练 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 — 延迟测试 URL
  • test_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: 段(规则集声明:type http/file、behavior domain/ipcidr、format yaml/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 格式示例(完整字段以规则集文档为准):

yaml
rule-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 状态查询

bash
# 运行状态总览(核心状态、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 操作

bash
# --- 服务控制 ---
# 启动
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_update

sha256sum 校验: 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

text
#### 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>"。

bash
# --- 读取运行时配置 ---
# 查看完整运行时 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 应:

  1. 【铁律·操作优先】凡涉及「覆写模块怎么用 / 怎么创建 / 怎么编辑 / 怎么生效」,必须先按操作路径讲解,再谈格式细节。固定顺序:覆写模块按钮 → 窗口弹出 → 创建 → 编辑语法格式 → 原理(详见 §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 内部逻辑。

  2. 【铁律】输出必须包含段头——覆写文件必须包含至少一个段头([General]、[Overwrite]、[YAML] 之一),否则整个文件被跳过、覆写不生效(详见 §16.2 节「强制要求」及 overwrite_file() 函数按段头解析的逻辑)。
    AI 输出任何覆写配置示例时,必须在代码块内以段头作为第一行,绝对禁止输出不含段头的裸 YAML/Shell/INI 内容。
    即使用户只问「某个字段怎么写」,代码块也必须形如:

    ini
    [YAML]
    <具体配置>

    而非仅 <具体配置>。若用户反馈覆写不生效,优先排查:①段头是否存在;② config 字段是否匹配当前配置文件。

  3. 示例输出规范:优先使用 [YAML] 段格式给出示例(语法清晰、不易出错);仅当需要动态逻辑(条件判断、循环处理)时才推荐 [Overwrite] 段。
    给出示例前应先明确用户需求(追加还是替换?键路径是什么?目标是数组还是哈希?匹配条件?),然后结合 [§16.2.3 节操作符](! 强制覆盖 / + 数组追加 / - 数组删除 / * 批量条件更新等)给出精准的、可直接使用的配置片段。禁止给出不含段头的泛泛描述。

  4. 信息获取路径:本章节未覆盖的细节按以下优先级查阅——

    • 覆写文件格式/操作符/示例 → 本章节(§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()(解析执行)
  5. 覆写执行模型(理解即可,回答时按需引用):覆写分两阶段执行——
    [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);只写文件名(不带目录)不会被内核匹配,模块将永不生效。
    • 订阅链接(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/<名称>,并注册到 UCI openclash.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 之前执行):

  1. 遍历 UCI 中所有 config_overwrite 条目(按 order 排序)
  2. 检查覆写是否匹配当前配置文件(config 字段只支持 all 或完整配置文件路径;为空或只写文件名都不会匹配,该模块直接跳过)
  3. 读取 /etc/openclash/overwrite/<名称> 文件内容
  4. 解析 [General] 段 → 将键值对写入 UCI openclash.@overwrite[0](如 EN_MODE、DNS_PORT 等),供后续 yml_change.sh 读取
  5. 处理 DOWNLOAD_FILE 指令 → 下载外部文件
  6. 生成覆写清单 /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 风格的分段格式,支持三个段:

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 值递归合并,键不存在则添加,标量直接覆盖。

yaml
dns:
  enable: true           # 修改现有键
  cache-algorithm: lru   # 添加新键
mixed-port: 10802        # 直接覆盖标量
tun:
  enable: true           # 合并 Hash(仅改指定字段,其余保留)
  stack: mips

2. 强制覆盖 (key! / <key>!)

强制替换整个值,不做递归合并。

yaml
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>+)

将新元素追加到数组末尾。

yaml
dns:
  nameserver+:
    - '1.1.1.1'
    - '8.8.8.8'
rules+:
  - DOMAIN-SUFFIX,example.com,REJECT
<nameserver>+:
  - '8.8.8.8'

4. 数组前置插入 (+key / +<key>)

将新元素插入到数组开头(优先匹配)。

yaml
dns:
  +nameserver:
    - '223.5.5.5'
+rules:
  - DOMAIN-SUFFIX,priority.com,DIRECT
+<nameserver>:
  - '119.29.29.29'

5. 数组删除/键删除 (key- / <key>-)

从数组中移除指定元素;对非数组删除整个键。值为空(null/~)时删除整个键。

yaml
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 子句支持的操作符: 同顶层(默认覆盖、!、+、-)

yaml
# === 对 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. 组合操作

同一块内可同时使用多个操作符:

yaml
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-Agent
  • restart — 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

ini
[General]
EN_MODE = fake-ip-tun
STACK_TYPE = mips

17.3.2 通过 [Overwrite] 段添加自定义代理组

ini
[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 子键保留。

ini
[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: CN

17.3.4 通过 [YAML] 段覆写 Sniffer(默认合并 `key`)

操作符:默认合并(key)——sniffer: 哈希递归合并,仅覆盖所列字段(enable/force-dns-mapping/parse-pure-ip/sniff),其余键保留。

ini
[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:)会整体替换整个规则数组,而非追加。

ini
[YAML]
rules+:
  - DOMAIN-SUFFIX,google.com,Proxy
  - DOMAIN-KEYWORD,youtube,Proxy
  - GEOSITE,netflix,NETFLIX
  - GEOIP,CN,DIRECT
  - MATCH,Proxy

17.3.6 通过 [Overwrite] + ruby 函数动态修改(Shell 函数族,非 [YAML] 操作符)

ini
[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)。正则里的 \. 可直接书写(旧写法 [.] 仍有效);**字面 $ 用单引号参数避免被当环境变量展开:

ini
[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 密钥

ini
[General]
CONFIG_FILE = /etc/openclash/config/my_custom.yaml
AGE_SECRET_KEY = AGE-SECRET-KEY-xxxxxxxxx

17.3.8 下载外部规则文件

ini
[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。

bash
#!/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']"
fi

17.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_path UCI 值 → 匹配
    • 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(大小写不敏感),写入 UCI openclash.@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]