什么是 TUN 模式?

TUN 模式通过在系统里创建一个虚拟网卡,在更底层"拦截"所有流量并进行分析和路由。它能让应用在"不知情"的情况下,流量就被代理了,从而实现真正的全局代理

对比维度 Socks5/HTTP 代理 TUN 模式
工作方式 应用主动配置 虚拟网卡,系统级接管
代理范围 仅 HTTP/HTTPS 所有 IP 层流量(TCP/UDP/ICMP)
核心优势 配置简单 游戏加速、DNS 劫持、全局代理

TUN 模式之所以能接管所有流量,主要依赖三个核心技术:

  1. 虚拟网卡 (utun):创建虚拟网络接口,所有出站的 IP 数据包被复制发送给虚拟网卡,Clash 内核据此捕获流量
  2. DNS 劫持 (DNS Hijacking):拦截发往 53 端口的 DNS 查询,由代理软件接管,确保域名解析也通过代理,解决 DNS 泄露问题
  3. 路由表操作 (auto-route):自动修改系统路由表,让所有流量进入虚拟网卡"通道"

前置准备

确保宿主机已开启 IP 转发:

1# 检查是否为 1
2sysctl net.ipv4.ip_forward
3
4# 如果为 0,执行以下命令开启
5sudo sysctl -w net.ipv4.ip_forward=1
6
7# 加载 TUN 内核模块(通常默认已加载)
8sudo modprobe tun

部署步骤

1. 创建目录

1mkdir -p ~/clash-tun && cd ~/clash-tun

2. 编写 docker-compose.yml

 1services:
 2  mihomo:
 3    image: metacubex/mihomo:latest
 4    container_name: mihomo-tun
 5    restart: always
 6    # 必须使用 host 网络模式,才能接管宿主机网络
 7    network_mode: "host"
 8    # 赋予特权,让容器能操作宿主机网络设备
 9    privileged: true
10    volumes:
11      - ./config.yaml:/root/.config/mihomo/config.yaml:ro
12    environment:
13      - TZ=Asia/Shanghai
14    cap_add:
15      - NET_ADMIN
16      - SYS_MODULE

关键配置说明:

配置项 作用
network_mode: "host" 与宿主机共享网络命名空间,使容器内操作直接影响宿主机
privileged: true 确保 iptables、ip route 等底层命令能成功执行
cap_add: [NET_ADMIN, SYS_MODULE] 显式允许网络管理和加载内核模块

3. 配置 config.yaml

 1mixed-port: 7890
 2allow-lan: true
 3bind-address: '*'
 4mode: rule
 5log-level: info
 6
 7# DNS 配置
 8dns:
 9  enable: true
10  listen: 0.0.0.0:1053
11  enhanced-mode: fake-ip
12  fake-ip-range: 198.18.0.1/16
13  nameserver:
14    - 223.5.5.5
15    - 119.29.29.29
16  fallback:
17    - https://dns.google/dns-query
18    - https://cloudflare-dns.com/dns-query
19
20# TUN 模式核心配置
21tun:
22  enable: true
23  stack: mixed
24  dns-hijack:
25    - any:53
26  auto-route: true
27  auto-redir: true
28  auto-detect-interface: true
29
30# 代理节点
31proxies:
32  # 填入你的代理节点信息
33  # - name: "example"
34  #   type: ss
35  #   server: example.com
36  #   port: 443
37  #   cipher: chacha20-ietf-poly1305
38  #   password: "password"
39
40# 代理组策略
41proxy-groups:
42  - name: "PROXY"
43    type: select
44    proxies:
45      - "DIRECT"
46
47# 分流规则
48rules:
49  # ⚠️ 重要:保证本地网络和 SSH 的连通性
50  - IP-CIDR,127.0.0.0/8,DIRECT
51  - IP-CIDR,192.168.0.0/16,DIRECT
52  - IP-CIDR,10.0.0.0/8,DIRECT
53  - IP-CIDR,172.16.0.0/12,DIRECT
54  # 放行所有其他流量走代理
55  - GEOIP,CN,DIRECT
56  - MATCH,PROXY

关键参数解释:

参数 说明
dns.enhanced-mode: fake-ip 返回虚拟 IP 避免 DNS 污染,提高稳定性
tun.stack: mixed 混合协议栈,兼容性好,也可尝试 systemgvisor
SSH 安全规则 必须在 rules 中将局域网段设为 DIRECT,否则 SSH 会断连

4. 启动容器

1docker-compose up -d

测试与验证

测试项目 命令 预期结果
检查 IP curl ip.sb 返回代理节点的公网 IP
测试 ICMP ping google.com 能 ping 通(普通 HTTP 代理做不到)
检查虚拟网卡 ip a 出现新的 utun 类网络接口
检查路由表 ip route show table all | grep utun 看到 TUN 相关路由条目

常见问题

SSH 断连了怎么办?

不要慌!通过云服务商的 VNC / 串行控制台 等带外管理方式登录,执行:

1docker stop mihomo-tun

网络即可恢复正常。

TUN 模式与其他 VPN 冲突?

TUN 模式需要高权限运行,可能与 OpenVPN、WireGuard 等冲突。遇到网络异常时,先排查是否与其他网络工具冲突。

Docker 容器无法使用此代理?

bridge 网络模式的容器无法直接使用 host 模式的 TUN 代理,需要加入 host 网络模式:

1services:
2  my-app:
3    network_mode: "host"

总结

TUN 模式是 Docker 部署 Clash 代理的终极方案——真正的系统级流量接管,无需任何应用额外配置。虽然部署门槛稍高(需要 host 网络 + 特权),但换来的是全局透明代理体验,适合需要代理所有流量(包括 UDP、ICMP)的场景。