1. 配置入口:先备份,再确认实际生效文件

在客户端的配置列表中选中当前配置,找到编辑或打开文件入口,先保存一份副本,再修改 YAML。不同客户端的菜单名称不完全相同;关键是确认编辑的是当前启用的配置,还是订阅原文、本地覆写或客户端生成的运行时文件。修改后需要重新加载配置,并到日志中确认加载成功。

config.yaml 是常见文件名,不是唯一允许的名称。内核可以读取指定路径的 YAML,图形客户端也可能为不同订阅分别保存文件。订阅更新通常会重新下载源文件,因此长期保留的端口、DNS 和自定义规则,应优先通过客户端提供的覆写或合并功能设置;合并方式以该客户端的实际实现为准。

YAML 的三个基础检查

  • 缩进用空格:建议每级两个空格,不混入 Tab。顶层的 dns、proxies、rules 对齐,子项缩进。
  • 列表项带短横线:rules 下每一条规则都是一个列表项;proxy-groups 下每个策略组也是一个列表项。
  • 特殊字符串加引号:密码、含冒号或井号的文本建议加引号。不要重复定义两个同名顶层键,也不要用全角冒号代替英文冒号。

阅读顺序可以从入口到出口:端口决定应用如何把连接交给内核,DNS 负责解析与域名信息,节点和策略组提供出口,规则决定每条连接使用哪个出口。下面的分段按这个顺序展开,但 YAML 中顶层字段的先后位置本身不决定执行顺序。

2. 通用设置:mixed-port、mode 与日志级别

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false

这组设置把 HTTP 与 SOCKS 代理入口放到 7890,使用规则模式,并将普通运行信息写入日志。端口号是本文示例值,不是所有客户端的固定默认值。若客户端在设置页覆盖了端口,应以运行时监听结果为准。

字段作用与检查重点
mixed-port在同一个入口接受 HTTP 与 SOCKS 代理请求;应用应填写实际监听的地址和端口。
port / socks-port分别提供 HTTP 与 SOCKS 入口。使用混合端口时,不必为同样需求再开一组独立端口。
allow-lan控制是否允许局域网设备访问代理入口;本机使用可先保持 false。
moderule 按规则分流,global 使用全局策略,direct 走直连。
log-level排查时可临时改为 debug,完成后恢复 info,避免长期积累大量细节日志。
ipv6影响内核的 IPv6 使用;DNS 模块还有独立的 IPv6 设置,不能只看这一处。

端口监听不等于系统代理已开启

写入 mixed-port: 7890 后,内核只是提供了入口。macOS 应用要通过系统代理进入,还需要客户端开启系统代理,或在「系统设置」→「网络」→当前网络服务→「详细信息」→「代理」中检查配置。不同 macOS 版本的界面可能略有变化。只测试本机时,代理地址通常填 127.0.0.1,端口填 7890。

系统代理也不覆盖所有程序。某些命令行工具、游戏和自带网络栈的应用需要单独配置,或者通过 TUN 接管。先用支持显式 HTTP 代理的工具确认入口可用,再判断是否需要扩大接管范围。

3. dns:监听地址、上游解析与 Fake-IP

dns:
  enable: true
  listen: 127.0.0.1:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  default-nameserver:
    - 223.5.5.5
  nameserver:
    - https://dns.alidns.com/dns-query
  fake-ip-filter:
    - "*.lan"
    - "localhost"

enable 启用内核 DNS,listen 指定本地监听地址。这里的 1053 是示例高位端口,避免直接使用通常需要更高权限的 53。仅写入监听地址,不会自动让整个系统都向它发起查询;系统 DNS 设置、TUN 的 DNS 劫持和应用自身的加密 DNS,都可能影响实际路径。

default-nameserver 与 nameserver 分别做什么

  • default-nameserver 主要承担上游 DNS 服务器域名的引导解析。例如先解析示例中的 dns.alidns.com,再建立 DoH 请求。
  • nameserver 是普通域名查询使用的上游列表。示例采用 DoH;能否连通仍取决于当前网络与相关路由配置。
  • nameserver-policy 可为特定域名指定上游,适合内网域名、公司 DNS 等有明确边界的场景。

如果节点的 server 本身是域名,还应关注 mihomo 的 proxy-server-nameserver。它用于节点域名解析,可帮助把节点解析路径与普通网站解析区分开。不要把普通查询、上游引导解析和节点解析简单理解成同一个步骤。

Fake-IP 不是远端服务器地址

fake-ip 模式向应用返回映射地址,内核保存地址与域名的对应关系,再在连接进入时进行匹配和转发。示例使用的 198.18.0.1/16 是映射地址池,不应拿它判断真实网站所在地区,也不应把它当成代理节点地址。

fake-ip-filter 中的域名按默认过滤语义不返回 Fake-IP,而是取得真实解析结果。内网发现或某些依赖真实地址的应用可以按需添加例外,但 DNS 上游仍须能够解析这些域名。把内网域名加入过滤列表,并不自动获得公司内网 DNS 的解析能力。

4. proxies 与 proxy-providers:节点定义和节点来源

proxies 是节点列表,每个节点是一条包含协议与连接参数的映射。常见字段包括 name、type、server、port,以及协议要求的认证与传输参数。节点名称会被策略组引用,建议保持唯一;服务器端口与本地 mixed-port 属于不同位置,不需要相同。

字段阅读重点
name本地识别名称;策略组通过这个名称找到节点。
type协议类型,如 ss、trojan、vmess;具体支持情况取决于内核。
server / port远端服务器地址与服务端口,由服务提供方给出。
认证与传输字段密码、UUID、TLS、SNI 和传输层设置必须与服务端匹配,不能只改协议名称。
proxy-providers从独立来源加载节点集合,再通过策略组的 use 引用。

完整订阅往往同时包含节点、策略组和规则;节点提供器则主要提供节点集合。把任意 Base64 节点订阅 URL 填进 HTTP 类型的 proxy-providers,不代表内核会自动转换格式,仍需满足提供器支持的内容格式。

本地暂时没有节点时,proxies: [] 表示空列表,可以用于检查配置结构。它不会生成任何远端出口。已有订阅节点时,应保留真实协议参数,不要为套用示例而清空节点列表。

5. proxy-groups:策略组连接节点与规则

proxies: []

proxy-groups:
  - name: 手动出口
    type: select
    proxies:
      - DIRECT

这是一段可用于结构检查的直连策略组:手动出口 是组名,select 表示由用户选择成员,当前唯一成员为内置策略 DIRECT。因此它目前只会直连;要使用远端节点,应把当前配置中确实存在的节点名称加入该组,或通过 use 引用节点提供器。

常用组类型的区别

  • select:手动选择一个成员,适合固定业务出口和排查问题。
  • url-test:通过指定测试 URL 比较可用成员的延迟,并结合容差等设置选择出口。
  • fallback:按配置顺序选择可用成员,侧重故障切换,而不是持续追求最低延迟。
  • load-balance:按所选策略分配连接,不等于把一个下载连接的带宽叠加成多个节点之和。

测试型策略组中的 url、interval 与节点健康检查有关。测试成功仅证明该测试目标可达,不能证明所有业务网站都能访问。自动选优结果异常时,先查看测试 URL 是否适合当前网络,再看节点本身。

组之间也可以互相引用,但不能形成循环。规则里写了 手动出口,配置中就必须有完全相同的组名;多一个空格或用了不同标点,都可能导致目标找不到。

6. rule-providers:把规则数据与分流动作分开

rule-providers:
  office-domains:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/office-domains.yaml

这段配置定义了一个名为 office-domains 的本地规则提供器。type: file 表示从文件读取,示例不涉及自动下载。相对路径通常基于内核工作目录,而不是文本编辑器当前所在目录;图形客户端还可能限制可读路径,应把文件放到它允许的配置数据目录中。

对应文件内容可以写成:

payload:
  - "+.example.org"
  - "intranet.example.net"

这里使用保留的示例域名演示结构,不对应实际办公服务。behavior: domain 表示文件内是域名匹配项;+.example.org 可覆盖根域及其子域。若使用 classical,内容则是带规则类型的条目,例如 DOMAIN-SUFFIX,example.org,不能直接照搬上面的纯域名写法。

  • domain:域名类数据,适合维护域名列表。
  • ipcidr:IP 网段数据,适合维护地址段列表。
  • classical:使用规则类型表达的列表,能够描述更多匹配条件。

HTTP 类型还需要 url,并可用 interval 指定更新间隔,单位为秒,例如 86400 表示一天。format 必须与真实文件格式一致;改成 text 后,文件就不再使用 YAML 的 payload 包装。

7. rules:从上往下匹配,MATCH 放在最后

rules:
  - DOMAIN-SUFFIX,example.org,手动出口
  - RULE-SET,office-domains,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - GEOIP,CN,DIRECT
  - MATCH,手动出口

这段规则需要与前面的策略组、规则提供器配合使用,且本地规则文件必须存在。第一条匹配 example.org 及其子域;第二条引用 office-domains;第三条匹配指定私网网段;第四条尝试匹配中国地区 IP;最后一条接住其余连接。GEOIP 判断需要可用的地理数据库,不能只靠写入一行规则完成。

第一条命中规则决定结果

rules 按自上而下顺序检查,一旦命中就使用对应目标。上例中的 example.org 虽然也在办公规则集中,但会先命中第一条,进入 手动出口。这也是自定义例外通常要放在宽泛规则之前的原因;把精确例外放到 MATCH 后面不会生效。

no-resolve 用于避免为了匹配 IP 类规则而主动触发域名解析。若当前连接只有域名且没有可用目标 IP,该规则可能无法命中;若连接本来就是发往某个 IP,则仍可进行网段判断。它不是“禁止整个连接使用 DNS”的全局开关。

策略名称与内置动作

  • DIRECT:直接建立连接,仍受本机网络、路由和目标服务状态影响。
  • REJECT:拒绝匹配连接,适合明确需要阻断的目标。
  • 策略组名称:交给该组当前选择的节点或下一层组处理。
  • MATCH:无需额外条件的兜底规则,应放在规则列表末尾。

排查分流时,先保持 mode: rule,再查看连接记录中的目标域名、命中规则和最终出口。如果切到了全局模式,不能用连接结果验证这份规则列表的排序。

8. TUN 与控制接口:按接管需求启用

tun:
  enable: false
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53

示例先把 TUN 关闭,便于逐项验证代理入口和规则。需要接管不遵循系统代理的应用时,再结合客户端的服务安装、系统授权和内核支持启用。auto-route 用于自动配置路由,auto-detect-interface 帮助选择出口网卡;启用 TUN 后应检查网络路由,而不只是观察开关状态。

dns-hijack 的 any:53 用于接管相应的普通 DNS 流量,不代表能直接接管所有 DoH 或 DoT 请求。公司 VPN、其他虚拟网卡及防火墙可能与 TUN 路由产生交互,出现问题时应先关掉一个接管层做对照,而不是同时修改 DNS、路由和所有规则。

external-controller 则是控制 API 的监听入口,与网页代理端口不同。例如本机管理地址可以是 127.0.0.1:9090;如确需启用,应配合 secret 设置强口令,并限制访问范围。某些客户端会自行管理这些字段,不宜直接覆盖它依赖的地址与认证配置。

9. 修改后的验证:语法、监听、出口依次检查

  1. 先做语法检查。如果已安装独立 mihomo 命令,可在配置副本所在目录执行下面的检查命令;图形客户端用户也可以使用其配置检查或重新加载功能查看错误。
  2. 再检查监听。确认 7890 没被另一个客户端占用,并确认当前进程读取的是修改后的文件。
  3. 测试显式代理。通过固定代理地址发起请求,排除系统代理开关和应用自身设置的干扰。
  4. 最后核对规则。在连接记录中查看规则与出口,必要时断开旧连接后重试;已有长连接可能继续沿用先前建立的路径。
mihomo -t -f ./config.yaml

# macOS:查看 TCP 7890 的监听进程
lsof -nP -iTCP:7890 -sTCP:LISTEN

# 显式使用本机 HTTP 代理测试请求
curl -I --proxy http://127.0.0.1:7890 https://example.com

配置检查成功说明文件能够被当前内核解析,不等于节点在线、规则集下载成功或目标网站可达。curl 返回 HTTP 响应说明这次请求得到了响应,实际走了直连还是代理,仍要结合连接记录确认。本文的空节点示例只提供直连成员,不能用它测试远端代理能力。

按错误信息定位字段

  • YAML 解析失败:检查提示行附近的缩进、引号、冒号和列表短横线。
  • 找不到代理或策略组:核对规则目标、组成员与节点名称,确认节点提供器已加载。
  • 规则集读取失败:检查路径、文件权限、behavior 和 format 是否对应实际内容。
  • 端口绑定失败:检查端口占用及监听地址,避免两个客户端同时使用相同入口。
  • 更新订阅后修改丢失:把需要长期保留的内容移到客户端支持的本地覆写层,再查看合并后的运行时配置。

最终应保留一份可正常加载的基线配置,每次只调整一类设置。先端口,再 DNS,再节点与策略组,最后处理规则和 TUN,能够把故障范围限制在刚改过的部分。需要对照完整配置入口时,可以继续查看本站的进阶配置说明。