4. 配置文件模型#


Link1 使用 YAML 配置。你可以把配置文件看成一份“网络行为说明书”:哪些端口接收流量,DNS 怎么解析,哪些出口可用,规则如何选择出口。

App 配置与内核配置#

Link1 App 会管理配置档案、运行状态和页面展示;内核配置只描述网络行为。普通用户主要需要理解内核配置中的这些部分:

配置部分负责什么是否必须
基础运行端口、模式、日志级别、局域网访问至少需要一个入口
DNS/hosts域名解析、Fake-IP、静态域名映射TUN/透明代理强烈建议配置
入站接管mixed-port、TUN、透明代理、协议 listener至少需要一种入口
出站与策略节点、订阅、策略组需要一个可被规则引用的出口
规则决定连接走哪里推荐至少有 MATCH 兜底
高级能力HTTP Engine、设备发现、NTP、实验开关按需开启

App 相关的内部状态不建议用户手写进主配置。用户文档只介绍会影响网络行为的字段。

顶层结构#

常见完整结构如下:

# 1. 基础运行
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

# 2. DNS 与 hosts
dns: {}
hosts: {}
hosts-providers: {}

# 3. 入站接管
tun: {}
app-proxy: {}
sniffer: {}
listeners: []

# 4. 出站与策略
proxies: []
proxy-providers: {}
proxy-groups: []

# 5. 规则
rule-providers: {}
rule-sets: {}
sub-rules: {}
rules: []

# 6. 高级能力
http-engine: {}
device-discovery: {}
profile: {}
tls: {}
experimental: {}
ntp: {}
iptables: {}

你不需要一次写完所有块。最小配置只需要入口、出站和规则。

YAML 基础#

YAML 用缩进表达层级:

proxies:
  - name: node-a
    type: socks5
    server: 127.0.0.1
    port: 1080

注意:

名称与引用#

Link1 里很多对象通过名称引用:

proxies:
  - name: node-a
    type: socks5
    server: 127.0.0.1
    port: 1080

proxy-groups:
  - name: PROXY
    type: select
    proxies:
      - node-a
      - DIRECT

rules:
  - MATCH,PROXY

实际影响:

命名建议:

类型推荐风格例子
手写节点简短但可识别线路hk-1jp-hy2
订阅 provider体现来源airportoffice-vpn
手动策略组大写业务名PROXYAIMEDIA
自动策略组体现算法AUTOFALLBACK
规则集小写类别privatechinareject

内置动作#

Link1 内置:

名称含义
DIRECT直连目标
REJECT拒绝连接

你也可以显式创建 type: directtype: reject 节点,但普通配置通常直接使用内置动作即可。

路径解析#

很多字段可以写文件路径:

建议:

proxy-providers:
  airport:
    type: http
    url: https://example.com/sub.yaml
    path: ./providers/airport.yaml

实际影响:

默认值与显式值#

有些字段有默认值,例如:

字段默认值影响
moderule按规则路由
log-levelinfo输出 info 级别日志
allow-lanfalse默认不开放局域网
bind-address*配合端口监听地址
ipv6true总体允许 IPv6,但 DNS 仍有自己的 dns.ipv6
find-process-modestrict进程规则按严格模式获取进程信息
profile.store-selectedtrue持久化策略组选择
profile.store-fake-iptrue持久化 Fake-IP 映射

默认值让配置更短,但不代表你不需要理解它们。例如 allow-lan=false 很安全,但局域网设备会连不上。

配置编译与错误定位#

Link1 内核启动前会把 YAML 编译成运行时结构。编译阶段会检查:

错误示例:

compile config "config.yaml": proxy-groups[0].proxies[1]="node-x" is undefined

读法:

排错技巧:

  1. 先看路径:proxies[3]rules[12]dns.nameserver[1] 指向错误位置。
  1. 再看对象名:很多错误来自拼写不一致。
  1. 最后看组合限制:例如 TUN 和平台透明入口不能同时启用,某协议不支持某个传输层。

配置分层建议#

Link1 的主配置是一个 YAML 文件。用户手册里的示例都按单文件展示,是为了让复制、导入和排障更简单。

如果你熟悉其他工具里的 !include,需要注意:Link1 不依赖 YAML !include 来拆主配置。App 导入配置档案时会以一份主 YAML 为中心管理配置;相对路径则用于引用外部资源,例如 provider 文件、规则文件、证书、HTTP Engine 脚本、Mock body。这样迁移时只要保证这些文件和主配置的相对位置不变即可。

推荐目录组织方式:

link1/
  config.yaml
  providers/
    airport.yaml
  rules/
    private.yaml
    reject.yaml
  certs/
    ca.pem
    client.key
  http-engine/
    scripts/
      rewrite.js
    bodies/
      mock.json

这样做的好处:

拆分时的经验:

内容建议放哪里原因
主入口配置config.yamlApp 导入、校验、应用都以它为入口。
订阅缓存/本地 providerproviders/避免和手写节点混在一起。
规则集rules/规则经常更新,单独维护更清楚。
证书/私钥certs/便于设置权限,也便于排查路径错误。
HTTP Engine 脚本http-engine/scripts/脚本通常比 YAML 长,单独文件更容易调试。
Mock bodyhttp-engine/bodies/保持 YAML 简洁,避免长文本转义。

如果要把配置发给别人排查,只发主 YAML 往往不够;凡是被 file:path:、provider 或规则集引用的文件,都要一起提供,敏感凭据需先脱敏。

常见配置块关系#

proxies            静态出站节点
proxy-providers    动态或订阅出站节点
proxy-groups       把节点/Provider 节点组合成出口
rules              把连接导向节点或策略组
rule-providers     大量规则来源
rule-sets          编译后的规则集或内联规则集
sub-rules          子规则流程
dns                解析域名与 Fake-IP
hosts              静态域名映射
hosts-providers    外部 hosts 文件
sniffer            从流量中嗅探域名
mixed-port/port/socks-port/redir-port/tproxy-port/tun/app-proxy/listeners
                   决定流量如何进入 Link1

一份配置怎样逐步长大#

阶段 1:确认入口可用#

mixed-port: 7890
rules:
  - MATCH,DIRECT

目标:确认内核启动、客户端能连接。

阶段 2:加入一个出站节点#

proxies:
  - name: node-a
    type: socks5
    server: 127.0.0.1
    port: 1080
proxy-groups:
  - name: PROXY
    type: select
    proxies: [node-a, DIRECT]
rules:
  - MATCH,PROXY

目标:确认代理节点能用。

阶段 3:加入 DNS 和域名规则#

dns:
  enable: true
  nameserver:
    - https://dns.google/dns-query
rules:
  - DOMAIN-SUFFIX,example.com,PROXY
  - MATCH,DIRECT

目标:确认域名规则命中。

阶段 4:再加入 TUN、订阅、规则集或 HTTP Engine#

每次只加一类高级能力,并在 App 中观察连接、规则和日志变化。

不推荐的写法#

一上来就开启所有高级能力#

不要在第一次配置时同时开启 TUN、Sniffer、HTTP Engine、多个 provider、复杂规则。先用 mixed-port + MATCH,DIRECT 或一个上游节点验证基础链路,再逐步加功能。

把所有流量都交给 Sniffer 补救#

Sniffer 是补充手段,不是 DNS 配置的替代品。TUN/透明代理场景应优先让 DNS 进入 Link1。

复制其他内核配置后不验证#

Link1 兼容常见字段,但不是所有历史字段都支持。迁移配置后先运行 App 校验,或直接运行:

spark -f config.yaml -t