🧠 一、先建立“分层模型”

分成 3 层系统


🟦 第1层:DNS 解析层(只负责“把域名变成IP”)

  • dns.rules[]
  • dns.servers[].detour
  • dns.servers[].domain_resolver
  • dns.final

🟩 第2层:连接决策层(决定“流量走哪条路”)

  • route.rules[]
  • route.final

🟥 第3层:拨号执行层(真正“连出去”)

  • outbounds[].detour
  • outbounds[].domain_resolver
  • route.default_domain_resolver

👉 一句话理解:

DNS层:查地址
Route层:选路径
Outbound层:怎么走

🔥 二、最核心一条链路(把所有东西串起来)

我们用一个完整例子👇


🎯 场景

访问:

youtube.com

🧩 STEP 1️⃣:DNS 查询(进入 dns.rules)

请求:youtube.com

👉 匹配
dns.rules  server = remote_dns

🧩 STEP 2️⃣:处理 DNS server 自身

remote_dns = cloudflare-dns.com

👉 用
dns.servers[].domain_resolver

优先级:

dns.servers[].domain_resolver
    >
route.default_domain_resolver

👉 得到:

cloudflare-dns.com → IP

🧩 STEP 3️⃣:DNS 查询如何发出去?

👉 用:

dns.servers[].detour

例如:

"detour": "proxy"

👉 含义:

DNS请求走代理

🧩 STEP 4️⃣:得到解析结果

可能是:

真实IP
FakeIP(198.18.x.x)

👉 如果没有命中任何规则
dns.final

👉 作用:

DNS兜底服务器

🧩 STEP 5️⃣:开始连接(进入 route.rules)

客户端发起连接:

IP(或 fakeip)

👉 route.rules 决定
outbound = proxy

👉 如果没命中:

route.final

👉 作用:

流量兜底出口

🧩 STEP 6️⃣:连接 outbound(节点)

server: node.example.com

👉 节点是域名 → 需要解析

用:

outbounds[].domain_resolver
    >
route.default_domain_resolver

👉 得到:

node.example.com → IP

🧩 STEP 7️⃣:真正连接怎么走?

👉 用:

outbounds[].detour

👉 含义:

这个节点的连接是否再套一层(比如链式代理)

🧠 三、逐个组件“精准定义”


🟦 DNS 解析层

🔹 1️⃣ dns.rules[]

👉 作用:

决定“查询某个域名用哪个 DNS server”

🔹 2️⃣ dns.servers[].domain_resolver

👉 作用:

解析 DNS服务器自身的域名

🔹 3️⃣ dns.servers[].detour

👉 作用:

DNS查询这一步走哪条 outbound

🔹 4️⃣ dns.final

👉 作用:

DNS规则未命中时的兜底 server

🟩 Route 层


🔹 5️⃣ route.rules[]

👉 作用:

决定“这个连接用哪个 outbound”

🔹 6️⃣ route.final

👉 作用:

所有流量的兜底出口

🟥 Outbound 层


🔹 7️⃣ outbounds[].domain_resolver

👉 作用:

解析节点(server)的域名

🔹 8️⃣ route.default_domain_resolver

👉 作用(官方关键点):

所有未指定 domain_resolver 的 outbound 默认使用它

👉 ⚠️ 注意:

它同时会影响:

  • outbound
  • dns.server(如果没写 domain_resolver)

🔹 9️⃣ outbounds[].detour

👉 作用:

决定“这个 outbound 本身走哪条线路”

👉 用于:

  • 链式代理
  • 代理套代理

⚠️ 四、最容易混淆的 3 个点(重点)


❗ 1️⃣ 两种 detour 完全不同


dns.servers[].detour

控制 DNS 查询

outbounds[].detour

控制节点连接

👉 ❌ 完全不是一回事


❗ 2️⃣ 两种 domain_resolver 也不同


dns.servers[].domain_resolver

解析 DNS服务器

outbounds[].domain_resolver

解析代理节点


❗ 3️⃣ default_domain_resolver 是“跨层兜底”

👉 它会被用在:

DNS server(没写 domain_resolver)
Outbound(没写 domain_resolver)

🚨 五、一个非常关键的“真实坑”


❗ 如果你没配置

route.default_domain_resolver

👉 结果:

节点域名解析 → 走系统DNS

后果

  • ❌ DNS 泄漏
  • ❌ 污染
  • ❌ 节点偶尔连不上

✅ 六、推荐配置策略(高阶)


✔ DNS 层

国外 DNS → detour 代理
国内 DNS → detour 直连

✔ domain_resolver

统一用 direct_dns(稳定)
或 remote_dns(更安全)

✔ route

必须有 final(避免断流)

🧠 七、终极关系一句话总结


dns.rules 决定“问谁”
dns.detour 决定“DNS怎么走”
dns.domain_resolver 决定“DNS服务器IP怎么来”

route.rules 决定“走哪个出口”
route.final 是兜底

outbound.domain_resolver 决定“节点IP怎么来”
outbound.detour 决定“节点连接怎么走”
default_domain_resolver 是所有解析的兜底
dns.final 是DNS的兜底
route.final 是流量的兜底