代理客户端技术分析

mihomo vs sing-box
DNS与TUN模块
深度解析

深入探讨两大主流代理客户端的核心架构与工作机制,聚焦DNS分流、抗污染机制与TUN透明代理的实现原理与最佳实践。

mihomo v1.19.12

传统Clash风格的DNS配置

fallback机制 fake-ip模式 TUN自动路由

sing-box v1.12.2

模块化结构设计

detour功能 sniff嗅探 严格路由

核心对比要点

mihomo优势:
  • • 传统Clash配置风格,学习曲线平缓
  • • fallback机制对抗DNS污染效果显著
  • • 成熟的社区支持与文档资源
sing-box优势:
  • • 模块化配置结构清晰
  • • detour功能提供灵活的代理路径控制
  • • sniff功能增强流量识别能力

mihomo DNS模块深度解析

mihomo的DNS模块通过精细的配置选项和智能的解析策略,实现了高效、安全的域名解析服务

核心配置项详解

基础功能配置

enable

DNS模块总开关,启用内置DNS服务器

listen

指定DNS服务器监听地址和端口

ipv6

控制是否解析IPv6地址(AAAA记录)

增强模式与Fake-IP

enhanced-mode

核心特性:fake-ip或redir-host模式

fake-ip-range

定义用于分配假IP的地址池

fake-ip-filter

精细控制fake-ip模式的行为

DNS服务器与策略

nameserver

默认DNS服务器列表,支持多种协议

fallback

后备DNS服务器列表,用于污染防护

nameserver-policy

基于域名的DNS服务器选择策略

缓存与性能

cache-algorithm

DNS缓存算法:lru或arc

prefer-h3

优先使用HTTP/3协议进行DoH通信

DNS解析流程与策略

解析流程三阶段

1
规则匹配与初步决策

根据路由规则匹配域名,决定直连或代理策略

2
DNS解析策略选择

检查nameserver-policy,使用默认或后备DNS

3
IP获取与最终决策

获取IP地址,再次匹配规则,执行直连或代理

Fake-IP模式优势

在Fake-IP模式下,mihomo不会立即进行真实的DNS解析,而是分配一个"假"IP地址。 当客户端使用这个假IP发起连接时,mihomo会根据内部映射表还原为原始域名, 再根据路由规则决定直连或代理。这种方式彻底避免了DNS污染。 [54]

内部运行时序图与配置关联

Fake-IP模式下DNS查询与连接流程 [113]

sequenceDiagram participant Client as 客户端应用 participant MihomoDNS as mihomo DNS模块 participant Cache as DNS缓存 participant Policy as nameserver-policy participant NS as nameserver participant FB as fallback participant Router as mihomo 路由模块 participant TUN as mihomo TUN模块 participant Proxy as 代理服务器 Note over Client,Proxy: 场景:TUN模式,fake-ip,访问www.example.com (匹配代理规则) Client->>MihomoDNS: 1. DNS查询: www.example.com activate MihomoDNS MihomoDNS->>Cache: 2. 检查缓存 Cache-->>MihomoDNS: 3. 未命中 MihomoDNS->>Policy: 4. 检查nameserver-policy Policy-->>MihomoDNS: 5. 无匹配规则 MihomoDNS->>NS: 6. 并发查询 (nameserver) MihomoDNS->>FB: 6. 并发查询 (fallback) activate NS activate FB NS-->>MihomoDNS: 7. 返回IP: 93.184.216.34 deactivate NS MihomoDNS->>MihomoDNS: 8. 应用fallback-filter检查 Note right of MihomoDNS: 假设IP通过检查 MihomoDNS->>Cache: 9. 存储真实IP到缓存 MihomoDNS->>MihomoDNS: 10. 生成Fake-IP (e.g., 198.18.0.123) MihomoDNS->>MihomoDNS: 11. 建立Fake-IP与域名的映射 MihomoDNS-->>Client: 12. 返回Fake-IP: 198.18.0.123 deactivate MihomoDNS Client->>TUN: 13. TCP SYN to 198.18.0.123:80 activate TUN TUN->>Router: 14. 查询路由规则 (目标IP: 198.18.0.123) Router->>TUN: 15. 返回代理策略 (PROXY) TUN->>TUN: 16. 通过映射表还原域名为 www.example.com TUN->>Proxy: 17. 发送连接请求: www.example.com:80 deactivate TUN Proxy->>Proxy: 18. 解析 www.example.com 并建立连接 Proxy-->>TUN: 19. 连接建立成功 TUN-->>Client: 20. TCP SYN/ACK Client->>TUN: 21. TCP ACK Note over Client,Proxy: 连接建立,数据开始传输
流程与配置关联
  • 缓存检查:使用 cache-algorithm配置的算法
  • 策略路由:基于 nameserver-policy配置
  • 并发查询nameserverfallback组合
  • 污染检测fallback-filter进行IP验证
关键配置项影响
  • enhanced-mode:决定是否使用Fake-IP机制
  • fake-ip-range:定义假IP地址池范围
  • direct-nameserver:直连时的DNS解析服务器
  • rules:决定最终连接策略的路由规则

mihomo TUN模块深度解析

TUN模块通过创建虚拟网络接口,实现对系统流量的透明代理和智能路由

核心配置项详解

典型TUN配置示例

tun:
  enable: true
  stack: mixed
  dns-hijack:
    - 8.8.8.8:53
    - 114.114.114.114:53
  auto-route: true
  auto-detect-interface: true

基础设置

enable

TUN模式总开关

stack

网络协议栈:system/gvisor/mixed [155]

dns-hijack

DNS劫持目标地址列表

路由配置

auto-route

自动配置路由规则

auto-detect-interface

自动检测网络接口

strict-route

启用严格路由模式

高级功能

mtu

设置TUN接口MTU值

inet4_address

IPv4地址分配

inet6_address

IPv6地址分配

TUN模式下的流量处理

流量处理流程

1
流量捕获

通过修改系统路由表,将所有出站流量重定向到TUN虚拟接口

2
流量分析与路由

根据预设规则(rules)匹配和分类流量,决定直连或代理策略

3
流量转发

根据路由决策,将流量发送到代理服务器或直接连接目标

4
返回流量处理

接收响应数据并通过TUN接口返回给原始应用程序

DNS劫持机制

通过配置 dns-hijack,mihomo可以截获应用程序发出的DNS查询请求, 并将其交由自己的DNS模块处理。这使得mihomo能够根据域名的不同, 智能地选择使用直连DNS服务器还是代理DNS服务器进行解析, 从而实现基于域名的精细化分流。

内部运行时序图与配置关联

TUN模式下网络请求处理流程

sequenceDiagram participant App as 应用程序 participant Kernel as 操作系统内核 participant TUN as TUN 接口 participant Mihomo as Mihomo 内核 participant Rules as 路由规则 participant Proxy as 代理服务器 participant Target as 目标服务器 App->>Kernel: 1. 发起网络请求 (e.g., TCP SYN) Kernel->>TUN: 2. 根据路由表将流量重定向到 TUN 接口 TUN->>Mihomo: 3. 将数据包传递给 mihomo 内核 Mihomo->>Rules: 4. 根据规则 (rules) 匹配流量 alt 匹配到代理规则 Rules-->>Mihomo: 5. 返回代理策略 (e.g., PROXY) Mihomo->>Proxy: 6. 将数据包封装并发送到代理服务器 Proxy->>Target: 7. 代理服务器转发请求到目标服务器 Target-->>Proxy: 8. 目标服务器返回响应 Proxy-->>Mihomo: 9. 代理服务器将响应返回给 mihomo else 匹配到直连规则 Rules-->>Mihomo: 5. 返回直连策略 (DIRECT) Mihomo->>Kernel: 6. 将数据包直接发送到目标服务器 Target-->>Kernel: 7. 目标服务器返回响应 Kernel-->>Mihomo: 8. 内核将响应返回给 mihomo end Mihomo->>TUN: 10. 将响应数据包写入 TUN 接口 TUN->>Kernel: 11. 内核从 TUN 接口读取数据 Kernel-->>App: 12. 将响应数据返回给应用程序
配置与流程对应关系
auto-route 步骤2:自动配置路由表
stack 步骤3:选择网络协议栈
rules 步骤4:路由规则匹配
dns-hijack DNS请求劫持处理
关键配置影响
stack: mixed

结合system和gvisor协议栈优势,TCP用system,UDP用gvisor

auto-route: true

自动配置路由,无需手动设置系统代理

strict-route: true

防止DNS泄露,增强安全性

sing-box DNS模块深度解析

sing-box采用模块化结构设计,通过servers、rules和final等字段实现灵活的DNS配置

核心配置项详解

典型DNS配置结构

{
  "dns": {
    "servers": [
      {
        "tag": "google",
        "address": "https://8.8.8.8/dns-query",
        "detour": "proxy"
      },
      {
        "tag": "local",
        "address": "223.5.5.5",
        "detour": "direct"
      }
    ],
    "rules": [
      {
        "geosite": "cn",
        "server": "local"
      }
    ],
    "final": "google",
    "strategy": "prefer_ipv4"
  }
}

[127]

服务器配置 (servers)

tag

服务器唯一标识符

address

DNS服务器地址,支持多种协议

detour

访问该DNS服务器的出站标签 (sing-box特色)

规则配置 (rules)

geosite

根据域名集合匹配

server

指定使用的DNS服务器标签

logical

支持and/or逻辑组合规则

全局配置

final

默认DNS服务器标签

strategy

解析策略:prefer_ipv4/ipv6_only等

disable_cache

禁用DNS缓存

FakeIP配置

fakeip

FakeIP功能启用

independent_cache

独立缓存配置

client_subnet

支持ECS扩展

DNS解析流程与策略

基于规则的解析流程

接收查询

应用程序发起DNS解析请求

缓存检查

查询本地DNS缓存

规则匹配

按顺序匹配rules规则

查询执行

使用指定或默认服务器

detour功能优势

sing-box的 detour功能是其一大特色,通过为每个DNS服务器指定出站代理, 用户可以精确控制访问每个DNS服务器的流量路径。例如,让查询Google DNS的流量走代理, 而查询阿里DNS的流量直连。这种设计提供了比mihomo更细粒度的控制能力。

内部运行时序图与配置关联

DNS解析流程时序图

sequenceDiagram participant App as 应用程序 participant SingBox as sing-box 内核 participant Cache as DNS 缓存 participant Rules as DNS 规则 participant Server as DNS 服务器 App->>SingBox: 1. 发起域名解析请求 (e.g., www.example.com) SingBox->>Cache: 2. 查询本地 DNS 缓存 alt 缓存命中 Cache-->>SingBox: 3. 返回缓存的 IP 地址 SingBox-->>App: 4. 返回 IP 地址 else 缓存未命中 SingBox->>Rules: 5. 检查是否匹配 DNS 规则 (rules) alt 匹配成功 Rules-->>SingBox: 6. 返回指定的 DNS 服务器标签 (server) SingBox->>Server: 7. 向指定的 DNS 服务器发送查询请求 else 匹配失败 SingBox->>Server: 7. 向默认的 DNS 服务器 (final) 发送查询请求 end Server-->>SingBox: 8. 返回解析结果 SingBox->>Cache: 9. 将解析结果存入缓存 SingBox-->>App: 10. 返回最终的 IP 地址 end
配置与流程对应关系
  • servers:定义可用的DNS服务器列表
  • rules:基于规则的DNS服务器选择
  • final:默认DNS服务器标签
  • detour:指定DNS查询的代理路径
sing-box特有功能
  • 独立缓存:为每个DNS服务器维护独立缓存
  • ECS支持:通过client_subnet支持EDNS
  • 逻辑规则:支持and/or组合规则
  • 协议优化:原生支持HTTP/3等新协议

sing-box TUN模块深度解析

sing-box的TUN模块通过丰富的配置选项和高级功能,实现全局透明代理与智能流量控制

核心配置项详解

典型TUN配置示例

{
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "address": [
        "172.18.0.1/30",
        "fdfe:dcba:9876::1/126"
      ],
      "mtu": 9000,
      "auto_route": true,
      "strict_route": true,
      "endpoint_independent_nat": false,
      "stack": "mixed"
    }
  ]
}

[55]

基础设置

type

必须设置为"tun"

tag

入站连接唯一标签

interface_name

虚拟网卡名称

路由配置

auto_route

自动配置路由规则

strict_route

启用严格路由模式 [168]

sniff

流量嗅探功能 (sing-box特色)

网络配置

address

TUN接口IP地址分配

mtu

设置最大传输单元

stack

网络协议栈选择 [158]

高级功能

endpoint_independent_nat

控制NAT行为

inet4_address

IPv4地址配置

inet6_address

IPv6地址配置

TUN模式下的流量处理

流量处理流程

1
流量捕获

通过 auto_route配置自动设置路由规则,将系统流量导向TUN接口

2
流量分析与路由

启用 sniff功能时,深度分析数据包识别应用层协议,根据route规则进行路由决策

3
流量转发

根据路由决策,通过相应的出站连接(直连或代理)发送流量

4
返回流量处理

接收响应数据并通过TUN接口返回给原始应用程序

sniff功能优势

sing-box的 sniff功能可以识别流量的应用层协议(如TLS的SNI字段), 使得基于域名的路由规则(geosite)在没有DNS劫持或FakeIP的情况下也能生效。 这在某些连接卡顿情况下特别有用,为流量分流提供了另一种强大的手段。 [168]

内部运行时序图与配置关联

TUN模式下网络请求处理流程

sequenceDiagram participant App as 应用程序 participant OS as 操作系统 participant TUN as TUN 接口 (sing-box) participant Router as sing-box 路由模块 participant Outbound as 出站代理 (sing-box) participant Remote as 远程服务器 App->>OS: 1. 发起网络请求 (e.g., TCP SYN) Note over App, OS: 应用程序无需感知代理 OS->>TUN: 2. 根据路由表转发数据包到 TUN 接口 Note over OS, TUN: auto_route: true 确保流量被捕获 TUN->>Router: 3. 将数据包传递给 sing-box 路由模块 Router->>Router: 4. 分析数据包 (sniff: true) alt 流量匹配代理规则 Router->>Outbound: 5a. 将流量路由到指定的出站代理 Outbound->>Remote: 6a. 通过代理协议发送数据包 Remote-->>Outbound: 7a. 返回响应数据 Outbound-->>Router: 8a. 将响应数据返回给路由模块 else 流量匹配直连规则 Router->>Remote: 5b. 直接发送数据包到目标服务器 Remote-->>Router: 6b. 返回响应数据 end Router-->>TUN: 9. 将响应数据包注入 TUN 接口 TUN-->>OS: 10. 操作系统将数据包传递给应用程序 OS-->>App: 11. 应用程序接收响应数据
配置与流程对应关系
auto_route 步骤2:自动路由配置
sniff 步骤4:流量嗅探分析
strict_route DNS流量强制处理
stack 协议栈选择影响性能
sing-box特色功能
endpoint_independent_nat

改善P2P应用兼容性

sniff: true

支持基于协议识别的路由

strict_route: true

防止DNS泄露,增强安全性

stack: mixed

平衡性能与兼容性

mihomo vs sing-box 对比分析

深入比较两大代理客户端在DNS和TUN模块的设计理念、功能特性及适用场景

DNS模块对比分析

特性 mihomo v1.19.12 sing-box v1.12.2
配置风格 扁平化YAML,继承Clash传统 结构化JSON,模块化设计
核心分流机制 nameserver-policy (键值对) rules (数组,匹配server标签)
抗污染机制 fallback + fallback-filter 通过 rulesdetour实现
DNS查询代理 通过 respect-rules间接实现 detour字段直接支持
缓存算法 lru, arc 独立缓存 (independent_cache)
ECS支持 不支持 client_subnet支持
逻辑规则 不支持 支持 and/ or

mihomo DNS优势

  • 传统Clash风格:学习曲线平缓,配置直观
  • fallback机制:成熟的DNS污染防护方案
  • 社区支持:丰富的文档资源和社区经验
  • 兼容性:与现有Clash配置高度兼容

sing-box DNS优势

  • 模块化设计:配置结构清晰,易于管理
  • detour功能:灵活的DNS查询代理控制
  • 高级特性:支持ECS、逻辑规则等
  • 性能优化:原生支持HTTP/3等新协议

TUN模块对比分析

特性 mihomo v1.19.12 sing-box v1.12.2
配置位置 tun字段 inbounds (type: "tun")
自动路由 auto-route auto_route
严格路由 strict-route strict_route
协议栈 system, gvisor, mixed system, gvisor, mixed
DNS劫持 dns-hijack 通过 route.rules实现
流量嗅探 不支持 sniff支持
端点无关NAT 不支持 endpoint_independent_nat支持

mihomo TUN优势

  • 成熟稳定:经过长期实践验证的TUN实现
  • 配置简单:dns-hijack列表形式简单直观
  • 自动优化:auto-detect-interface简化配置
  • 兼容性好:在各类设备上表现稳定

sing-box TUN优势

  • sniff功能:基于协议识别的智能路由
  • 灵活配置:通过route.rules实现复杂劫持逻辑
  • P2P优化:endpoint_independent_nat支持
  • 统一架构:与sing-box其他模块深度集成

DNS与TUN模块协同工作机制

mihomo协同机制

1
DNS劫持

通过dns-hijack拦截DNS请求

2
Fake-IP模式

DNS返回假IP,TUN还原域名

3
直连重解析

使用direct-nameserver获取真实IP

sing-box协同机制

1
DNS劫持

通过route.rules实现灵活劫持

2
FakeIP模式

标准DNS返回假IP,TUN处理流程

3
sniff功能

无需DNS劫持也能识别域名

协同机制对比总结

协同功能 mihomo v1.19.12 sing-box v1.12.2
DNS劫持 dns-hijack列表,配置简单 route.rules劫持,更灵活
FakeIP协同 标准流程:DNS返回假IP → TUN拦截 → 路由决策 标准流程:DNS返回假IP → TUN拦截 → 路由决策
直连重解析 direct-nameserver 通过 route.rulesoutbounds实现
域名识别 依赖DNS劫持或FakeIP 支持 sniff,无需DNS劫持或FakeIP