8. Provider 与策略组#
Provider 负责“批量得到节点或规则”,策略组负责“从多个节点里选一个或多个出口”。
出站节点来源#
| 来源 | 配置 | 适合场景 |
|---|---|---|
| 静态节点 | proxies | 少量固定节点、手工配置 |
| 代理 provider | proxy-providers | 订阅、文件、内联节点、WARP 动态节点 |
| 内置节点 | DIRECT、REJECT | 直连和拒绝 |
proxy-providers#
HTTP 订阅#
proxy-providers:
airport:
type: http
format: auto
url: https://example.com/sub.yaml
path: ./providers/airport.yaml
interval: 3600
proxy: DIRECT
header:
User-Agent:
- Link1
filter: '香港|日本|新加坡'
exclude-filter: '倍率:10|过期'
exclude-type: direct
size-limit: 10485760
health-check:
enable: true
url: http://www.gstatic.com/generate_204
interval: 300
timeout: 5000
expected-status: 204
本地文件#
proxy-providers:
local:
type: file
path: ./providers/local.yaml
format: mihomo
内联 payload#
proxy-providers:
inline-nodes:
type: inline
payload:
- name: local-socks
type: socks5
server: 127.0.0.1
port: 1080
WARP provider#
proxy-providers:
warp:
type: warp
mode: auto
transports:
- wireguard
- masque
warp provider 会物化 WARP 出口节点;不要在 proxies 里写 type: warp。
为什么 WARP 是 provider:同一份 WARP 状态可能生成 wireguard 和 masque 两种出站节点,而且 auto 模式需要持久化账号、密钥、endpoint 和 transport 状态。把它放在 provider 中,策略组就能像使用订阅节点一样使用这些物化结果,例如 use: [warp]。详细字段和机制见 出站协议配置:WARP provider。
proxy-provider 字段#
| 字段 | 含义 | 实际影响 |
|---|---|---|
type | http、file、inline、warp | 决定 provider 行为 |
format | auto、mihomo、uri、base64、sip008、surge、quanx、sing-box | 决定订阅内容解析方式 |
path | 本地路径 | HTTP 缓存或 file 读取 |
url | 订阅 URL | type=http 使用 |
interval | 刷新间隔,秒 | 控制自动刷新 |
dialer-proxy / proxy | 拉取订阅使用的出口 | 订阅被墙或内网订阅时使用 |
filter | 保留节点名匹配正则 | 筛选节点 |
exclude-filter | 排除节点名匹配正则 | 去掉无效/高倍率/过期节点 |
exclude-type | 排除协议类型 | 例如排除 ssr 或 direct |
header | HTTP 请求头 | 订阅认证或 UA |
size-limit | 响应大小限制 | 防止异常大订阅 |
health-check | Provider 级健康检查 | 给 provider 节点建立探测状态 |
override | 批量覆写节点字段 | 统一设置 UDP、证书校验、前缀等 |
payload | 内联节点列表 | type=inline 使用 |
provider override#
proxy-providers:
airport:
type: http
url: https://example.com/sub.yaml
path: ./providers/airport.yaml
override:
skip-cert-verify: true
udp: true
down: 200 Mbps
up: 50 Mbps
dialer-proxy: DIRECT
interface-name: eth0
routing-mark: 100
ip-version: ipv4-prefer
additional-prefix: '机场 - '
additional-suffix: ' - 自动'
proxy-name:
- pattern: 'United States'
target: 'US'
实际影响:
skip-cert-verify:批量关闭 TLS 证书校验,不建议默认开启。
udp:统一打开/关闭 UDP 能力。
down/up:覆写协议带宽提示。
dialer-proxy:让 provider 中节点通过某个前置代理拨号。
interface-name/routing-mark:绑定网卡或 Linux mark。
additional-prefix/additional-suffix:批量改节点显示名。
proxy-name:按正则替换节点名。
策略组类型#
策略组不是新的出站协议。它只回答两个问题:
- 这一条流量最终选哪个成员? 例如
select、url-test、smart、fallback、load-balance。
- 这一条流量是否要按顺序穿过多个成员? 例如
relay。
策略组成员可以来自三类来源:
proxies:显式写入某些节点或其他策略组名。
use:引用一个或多个proxy-providers,把 provider 产出的节点加入组。
include-all*:按范围自动收集所有静态节点或 provider 节点。
Link1 在加载配置时会先解析成员,再做去重、过滤和循环引用检查。一个组可以引用另一个组,但不能形成 A -> B -> A 这种环。健康检查类策略组会把嵌套组展开到叶子节点做探测,避免只探测到“组”这个壳。
proxy-groups:
- name: PROXY
type: select
proxies:
- AUTO
- DIRECT
- name: AUTO
type: url-test
use:
- airport
url: http://www.gstatic.com/generate_204
interval: 300
timeout: 5000
| 类型 | 行为 | 适合场景 | 核心注意点 |
|---|---|---|---|
select | 用户手动选择一个成员 | 需要可控切换的主出口 | 选择的是成员名,成员可以是节点也可以是组。 |
url-test | 根据探测延迟选择较优成员 | 同地区多个节点自动择优 | 主要相信健康检查结果。 |
smart | 结合健康探测和真实拨号反馈动态排序 | 自动化主出口、路由器长期运行 | 不只看测速,还会学习失败率、抖动和真实连接表现。 |
fallback | 按顺序选择第一个可用成员 | 主备链路 | 成员顺序就是优先级。 |
load-balance | 多成员分摊连接 | 多节点均衡使用 | strategy 决定轮询、哈希或粘性会话。 |
relay | 按顺序组成多跳链路 | 前置代理、跳板链、出口串联 | 成员顺序就是链路顺序,兼容性比普通组更严格。 |
如果你只是想“让 Link1 自动选一个好节点”,优先从
smart或url-test开始;如果你明确要“先走 A,再从 A 连接 B,最后由 B 出口”,才使用relay。
select:手动选择#
select 是最容易理解的策略组:它把多个成员展示给用户,由用户或 App 选择当前成员。它不主动测速,也不会自动切换,适合做顶层入口。
proxy-groups:
- name: PROXY
type: select
proxies:
- SMART
- JP
- US
- DIRECT
实际影响:规则里写 PROXY 时,流量会走 PROXY 当前选中的成员。如果选中的是另一个组,例如 SMART,则继续执行 SMART 的选择逻辑。
url-test:按探测延迟自动选择#
url-test 会定期让每个候选节点访问 url,记录延迟和可用性,然后选延迟最低的一项。
proxy-groups:
- name: JP-AUTO
type: url-test
use: [airport]
filter: '日本`JP`Tokyo'
url: http://www.gstatic.com/generate_204
interval: 300
timeout: 5000
tolerance: 50
字段影响:
url应选择轻量、稳定、能代表你真实访问路径的地址。
interval是探测间隔,单位秒;太短会增加节点和网络负担。
timeout是单次探测超时,单位毫秒。
tolerance是延迟容忍度,单位毫秒;用于避免 1-2ms 抖动导致频繁切换。
lazy: true表示尽量在需要时再探测,适合节点很多的订阅。
smart:健康探测 + 真实拨号反馈#
smart 可以理解成增强版 url-test。它也使用 url、interval、timeout、tolerance 建立基础健康排序,但不会只相信测速;真实业务连接发生后,它还会记录每个候选的成功率、真实拨号耗时和抖动,并用这些反馈微调排序。
proxy-groups:
- name: SMART
type: smart
use: [airport]
filter: '香港`日本`新加坡'
exclude-filter: '过期`倍率:10'
url: http://www.gstatic.com/generate_204
interval: 300
timeout: 5000
tolerance: 80
lazy: true
smart 的工作过程:
- 先看健康状态:健康节点排在未知节点前;明确不可用的节点不会优先尝试。
- 再看真实反馈:真实连接成功会记录延迟;失败会记录失败信号,并可能触发这个节点的健康探测。
- 有限并发尝试:拨号时会按当前排序尝试候选,前一个候选迟迟没有结果时才错峰尝试后续候选,避免一次性打满所有节点。
- 失败门控:如果某个候选近期失败率过高,会被放到更靠后的位置。
- 少量探索:长期运行时会周期性给次优候选一次机会,避免因为旧数据把后来恢复的节点永远压在后面。
- 手动选择可覆盖:如果 App 临时固定了某个成员,
smart会优先使用它;当它被判定不健康或拨号失败时,固定选择会被清掉,回到自动排序。
smart 和 url-test 的区别:
| 对比项 | url-test | smart |
|---|---|---|
| 决策依据 | 主要是探测 URL 的延迟和状态 | 探测结果 + 真实拨号成功率/延迟/抖动 |
| 故障感知 | 等下一轮探测发现 | 业务拨号失败会立即形成反馈,并可触发单节点探测 |
| 适合场景 | 同质节点中选最低延迟 | 长期运行、节点质量波动、路由器无人值守 |
| 可解释性 | 简单、容易预测 | 更智能,但短期排序会随真实连接反馈变化 |
调参建议:
- 家用路由器或桌面主出口:
type: smart+lazy: true+interval: 300通常足够。
- 需要极度稳定的办公出口:把候选先用
filter缩小到可信地区/供应商,再交给smart。
- 某些网站要求固定出口 IP:不要直接把这类规则交给
smart,可以用select固定节点,或用load-balance的粘性策略。
fallback:按顺序主备#
fallback 适合“主节点优先,主节点不行再走备用”的场景。它会按成员顺序查找可用项,不追求最低延迟。
proxy-groups:
- name: BACKUP
type: fallback
proxies:
- hk-primary
- jp-backup
- DIRECT
url: http://www.gstatic.com/generate_204
interval: 300
注意:把 DIRECT 放到最后表示“代理都不可用时直连兜底”。这对普通浏览可能有用,但对需要隐私或固定出口的流量可能不合适。
load-balance:分摊连接#
load-balance 会在多个候选之间分摊连接,支持三种 strategy:
strategy | 行为 | 适合场景 |
|---|---|---|
round-robin | 按顺序轮询候选 | 希望平均使用多个节点。 |
consistent-hashing | 根据目标域名/IP 做哈希,同一目标倾向同一出口 | 减少同一网站频繁换出口。 |
sticky-sessions | 根据进程名 + 目标维持一段时间粘性 | 登录态敏感应用、同一客户端会话需要稳定出口。 |
proxy-groups:
- name: BALANCE
type: load-balance
use: [airport]
filter: '香港`HK'
strategy: consistent-hashing
relay:按顺序串成多跳链路#
relay 不是“自动选择一个节点”,而是“把多个出站按顺序串起来”。例如:先通过本地前置代理连接到中转节点,再由中转节点连接最终出口。
proxies:
- name: front-node
type: socks5
server: 127.0.0.1
port: 1080
- name: exit-node
type: ss
server: exit.example.com
port: 8388
cipher: aes-128-gcm
password: secret
proxy-groups:
- name: RELAY
type: relay
proxies:
- front-node
- exit-node
这条链路可以读成:
客户端流量 -> Link1 -> front-node -> exit-node -> 目标网站
relay 的关键规则:
proxies的顺序就是链路顺序,不能随便交换。
- 第一个可作为根传输的成员负责最底层拨号;后续成员作为传输层叠加。
- 如果成员本身是
select、smart、url-test、fallback、load-balance这类逻辑组,relay会取它当前选中的叶子节点参与链路。
- 如果成员是另一个
relay,会被展开成它的子链路;循环引用会被拒绝。
relay本身不主动健康检查。它依赖成员自身的健康状态和拨号结果;如果链路中任一跳失败,整条连接失败。
- TCP 是最常见场景。UDP 只有在整条链路每一层都能提供 UDP 能力、且
disable-udp未开启时才可用;否则 UDP 会失败。
- 链路越长,延迟、故障点和排障难度越高。除非明确需要多跳,不要把普通自动选择写成
relay。
常见写法:
| 目标 | 推荐配置 | 说明 |
|---|---|---|
| 先通过本地代理再连远端节点 | relay: [local-socks, remote-node] | 本机已有代理或企业内网跳板。 |
| 先选一个中转,再固定出口 | relay: [SMART-FRONT, exit-node] | SMART-FRONT 先自动选中转,出口保持固定。 |
| 两段都自动 | relay: [SMART-FRONT, SMART-EXIT] | 可以工作,但排障复杂;建议先分别验证两个组。 |
策略组字段#
| 字段 | 含义 | 实际影响 |
|---|---|---|
name | 组名 | 可被规则或其他组引用,必须唯一。 |
type | 组类型 | 决定选择逻辑或链式逻辑。 |
proxies | 静态成员列表 | 可引用节点或其他组;顺序对 fallback、relay、round-robin 有实际影响。 |
use | 引用 provider | 把 provider 产出的节点加入组。 |
url | 健康检查 URL | url-test/fallback/smart/load-balance 使用。 |
interval | 探测间隔,秒 | 默认 300 秒;越短越敏感,也越耗资源。 |
timeout | 探测超时,毫秒 | 默认 5000 毫秒;网络慢时设太短会误判。 |
lazy | 懒探测 | 只在需要时探测,适合大订阅。 |
max-failed-times | 兼容字段 | 不建议依赖;实际可用性主要由健康探测和质量反馈决定。 |
disable-udp | 禁用组 UDP | 即使成员支持 UDP,组也会对外隐藏或拒绝 UDP 能力。 |
interface-name | 兼容字段 | 普通组不建议依赖;出口网卡优先写在具体出站节点或全局。relay 链路会尊重根节点上的 socket 选项。 |
routing-mark | 兼容字段 | 普通组不建议依赖;Linux mark 优先写在具体出站节点或全局。 |
include-all | 包含所有静态和 provider 节点 | 快速建组。 |
include-all-proxies | 包含所有静态节点 | 不含 provider。 |
include-all-providers | 包含所有 provider 节点 | 不含静态节点。 |
filter | 成员名称过滤 | 多个模式可用反引号分隔;先保留匹配项。 |
exclude-filter | 成员名称排除 | 在收集成员后排除匹配项。 |
exclude-type | 协议类型排除 | 例如排除 direct、ssr。 |
expected-status | 探测期望状态码 | 与 url 配合判断探测是否成功。 |
health-check | 嵌套健康检查配置 | 可覆盖 url/interval/timeout/lazy/expected-status。 |
hidden | App 隐藏提示 | 影响 App 展示,不改变转发逻辑。 |
icon | App 图标 | 影响 App 展示,不改变转发逻辑。 |
tolerance | 延迟容忍度,毫秒 | url-test/smart 使用,减少微小延迟抖动导致的切换。 |
strategy | load-balance 策略 | round-robin、consistent-hashing、sticky-sessions。 |
成员来源和过滤#
proxy-groups:
- name: JP
type: url-test
include-all: true
filter: '日本`JP`Tokyo'
exclude-filter: '过期`倍率:10'
exclude-type: ssr
实际影响:
include-all先收集所有节点。
filter保留命中的节点。
exclude-filter再排除命中的节点。
exclude-type排除指定协议类型。
健康检查#
健康检查配置可以写在组顶层,也可以写在 health-check 下:
proxy-groups:
- name: AUTO
type: url-test
use: [airport]
health-check:
url: http://www.gstatic.com/generate_204
interval: 300
timeout: 5000
lazy: false
expected-status: 204
支持主动健康检查的组:url-test、smart、fallback、load-balance。
不主动健康检查的组:select、relay。
默认值:
| 项 | 默认 | | -- | ---- | | URL | http://www.gstatic.com/generate_204 | | interval | 300 秒 | | timeout | 5000 毫秒 |
典型策略组模板#
手动主出口 + 自动测速#
proxy-groups:
- name: PROXY
type: select
proxies:
- AUTO
- DIRECT
- name: AUTO
type: url-test
use: [airport]
interval: 300
主备 fallback#
proxy-groups:
- name: BACKUP
type: fallback
proxies:
- node-primary
- node-backup
- DIRECT
多跳 relay#
proxy-groups:
- name: RELAY
type: relay
proxies:
- front-node
- exit-node
注意:relay 增加延迟和故障点,只有明确需要链式代理时再使用。