Docker 部署 Clash TUN 透明代理:全局流量接管指南
什么是 TUN 模式?
TUN 模式通过在系统里创建一个虚拟网卡,在更底层"拦截"所有流量并进行分析和路由。它能让应用在"不知情"的情况下,流量就被代理了,从而实现真正的全局代理。
| 对比维度 | Socks5/HTTP 代理 | TUN 模式 |
|---|---|---|
| 工作方式 | 应用主动配置 | 虚拟网卡,系统级接管 |
| 代理范围 | 仅 HTTP/HTTPS | 所有 IP 层流量(TCP/UDP/ICMP) |
| 核心优势 | 配置简单 | 游戏加速、DNS 劫持、全局代理 |
TUN 模式之所以能接管所有流量,主要依赖三个核心技术:
- 虚拟网卡 (utun):创建虚拟网络接口,所有出站的 IP 数据包被复制发送给虚拟网卡,Clash 内核据此捕获流量
- DNS 劫持 (DNS Hijacking):拦截发往 53 端口的 DNS 查询,由代理软件接管,确保域名解析也通过代理,解决 DNS 泄露问题
- 路由表操作 (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 |
混合协议栈,兼容性好,也可尝试 system 或 gvisor |
| 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)的场景。
