Clash 的运行原理:从虚拟网卡到 DNS 分流

alt text

摘要

Clash 是一个运行在本机或网关上的规则化代理转发引擎。它把应用程序或系统网络栈产生的流量接入本地,再通过 DNS 模块、规则引擎和策略组判断流量应该直连、拒绝,还是通过某个远程代理节点转发出去。

Clash 可以理解为以下几个模块的组合:

1
2
3
4
5
6
流量入口 Inbound
+ DNS 解析与 fake-ip 映射
+ 规则匹配引擎
+ 策略组选择器
+ 多协议出站 Outbound
+ 远程代理服务器或直连出口

它和传统 VPN 的主要区别在于:传统 VPN 通常把整台设备的 IP 流量放进一个加密隧道,而 Clash 更强调按规则分流。同一台设备上,国内网站可以直连,海外网站可以走代理,广告域名可以拒绝,公司内网可以走 WireGuard,游戏 UDP 可以走 Hysteria 或 TUIC。Clash 的价值是把复杂网络流量按域名、IP、端口、进程、地理位置和协议特征进行精细路由。


1. 先区分几个概念:VPN、代理、Clash

日常语境里,很多人会把 Clash、Trojan、Shadowsocks、VLESS 统称为“VPN”。严格来说,这个说法并不准确。

VPN,即 Virtual Private Network,虚拟专用网络,通常在网络层创建加密隧道,把设备接入一个远程网络。典型协议包括 WireGuard、OpenVPN、IPSec、L2TP 等。它们的作用更像是把你的设备接入另一张网络

代理,Proxy,则更像是让另一个服务器代你发起连接。浏览器、应用程序或者 Clash 把目标地址交给代理服务器,代理服务器再连接真实目标。典型代理协议包括 HTTP Proxy、SOCKS5、Shadowsocks、Trojan、VMess、VLESS、Hysteria、TUIC 等。

Clash 不是一个具体的代理协议。它是一个代理客户端内核或规则路由器,支持多种协议作为出站方式。它可以接收本地流量,然后根据规则选择不同的出站。

可以这样理解:

1
2
3
4
5
Trojan / Shadowsocks / VLESS / Hysteria 是“路”。
Clash 是“交通调度系统”。
规则文件是“交通规则”。
代理节点是“远程出口”。
TUN 是“把系统流量接进调度系统的虚拟网卡”。

普通网络访问路径是:

1
2
3
4
5
6
7
8
9
App / 浏览器

系统网络栈

真实网卡 Wi-Fi / Ethernet

路由器 / 运营商

目标网站

开启 Clash 后,路径变成:

1
2
3
4
5
6
7
8
9
10
11
App / 浏览器

本地 Clash 入站端口或 TUN 虚拟网卡

Clash 规则引擎

DIRECT / PROXY / REJECT / 某个具体节点

直连或远程代理服务器

目标网站

2. 网络基础:理解 Clash 之前必须知道的术语

2.1 IP 包

IP 包是网络层的数据单位。一个 IP 包至少包含源 IP、目标 IP、协议类型和负载数据。

例如:

1
2
3
4
源 IP:192.168.1.10
目标 IP:8.8.8.8
协议:TCP
负载:TCP 数据段

在互联网中,路由器主要根据目标 IP 地址决定下一跳。TUN 虚拟网卡处理的就是这一层的数据,所以 TUN 属于三层虚拟网卡。

2.2 TCP

TCP,即 Transmission Control Protocol,传输控制协议。它提供面向连接、可靠、有序的数据传输。

TCP 的特点是:

1
2
3
4
5
需要建立连接
保证数据到达
保证顺序
丢包会重传
有拥塞控制

HTTP/1.1、HTTP/2、传统 HTTPS、大部分代理协议都可以基于 TCP 运行。

一次 TCP 连接大致经历:

1
三次握手 → 数据传输 → 四次挥手或重置连接

TCP 适合网页访问、文件下载、API 请求等需要可靠传输的场景,但在高延迟、高丢包网络中,性能可能明显下降。

2.3 UDP

UDP,即 User Datagram Protocol,用户数据报协议。它是无连接协议,不保证可靠性,也不保证顺序。

UDP 的特点是:

1
2
3
4
5
不需要连接握手
开销低
延迟小
不保证到达
不自动重传

DNS、QUIC、HTTP/3、游戏、语音通话、视频通话、WireGuard、Hysteria、TUIC 都大量使用 UDP。

UDP 不等于“不可靠应用”。QUIC、WireGuard 这类协议会在 UDP 之上自己实现加密、可靠性或会话管理。

2.4 DNS

DNS,即 Domain Name System,域名系统。它负责把域名转换成 IP 地址。

例如:

1
2
www.google.com → 142.250.x.x
www.baidu.com → 110.242.x.x

应用访问网站之前,通常需要先做 DNS 查询。对 Clash 来说,DNS 非常关键,因为很多规则是基于域名的,而不是基于 IP 的。

如果 DNS 没有被 Clash 正确接管,就可能出现两个问题:

1
2
1. DNS 泄漏:域名查询仍然发给本地运营商 DNS。
2. 分流错误:Clash 只看到 IP,看不到原始域名,规则匹配精度下降。

2.5 TLS

TLS,即 Transport Layer Security,传输层安全协议。HTTPS 本质上就是 HTTP over TLS。

TLS 提供:

1
2
3
加密:第三方无法直接读取内容
完整性:数据不能被悄悄篡改
身份认证:通过证书验证服务器身份

Trojan、VLESS + TLS、Hysteria、TUIC、HTTPS 代理等都和 TLS 有密切关系。

注意:普通 Clash 代理并不会解密浏览器和目标网站之间的 HTTPS 内容。它通常只能看到目标域名、目标 IP、端口、连接时间、流量大小和规则命中情况。除非额外启用 MITM 证书和 HTTPS 解密,否则它不能直接读取 HTTPS 页面正文、密码或表单内容。

2.6 HTTP 和 HTTPS

HTTP 是 Web 应用层协议。HTTPS 是 HTTP 加上 TLS 加密。

普通 HTTP 代理可以直接代理 HTTP 请求。对于 HTTPS,HTTP 代理通常使用 CONNECT 方法建立 TCP 隧道:

1
2
3
浏览器 → HTTP 代理:CONNECT example.com:443
HTTP 代理 → example.com:443 建立 TCP 连接
浏览器和 example.com 在这条隧道里完成 TLS 握手

此时 HTTP 代理只是转发字节流,并不理解 TLS 里面的网页内容。

2.7 QUIC 和 HTTP/3

QUIC 是基于 UDP 的现代传输协议,集成了 TLS 加密、流复用、拥塞控制和连接迁移。HTTP/3 就运行在 QUIC 之上。

Hysteria 和 TUIC 都属于基于 QUIC 思路的代理协议。它们使用 UDP 作为底层传输,在弱网、高延迟或高丢包场景中可能比传统 TCP 代理表现更好。

但这也带来限制:如果网络环境屏蔽或限速 UDP,Hysteria、TUIC、WireGuard 这类协议就可能表现很差,甚至无法连接。


3. 虚拟网卡是什么

虚拟网卡是操作系统中由软件创建的网络接口。它看起来像一块真实网卡,但不对应物理硬件。

真实网卡包括:

1
2
3
Wi-Fi 网卡
以太网网卡
蓝牙网络适配器

虚拟网卡包括:

1
2
3
4
5
6
TUN / TAP 网卡
VPN 虚拟适配器
WireGuard 虚拟网卡
Docker 网桥
VMware / VirtualBox 虚拟网卡
Clash TUN 创建的虚拟接口

在系统看来,虚拟网卡也可以有接口名、IP 地址、路由规则、DNS 设置和 MTU。

例如:

1
2
3
4
Wi-Fi      192.168.1.10
TUN 198.18.0.1
Docker0 172.17.0.1
WireGuard 10.8.0.2

虚拟网卡的作用是让软件有机会接管网络流量。系统网络栈把数据包发给虚拟网卡,用户态程序再从虚拟网卡读取这些数据包,决定如何处理。

以 Clash TUN 为例:

1
2
3
4
5
6
7
8
9
10
11
App

系统网络栈

TUN 虚拟网卡

Clash 读取 IP 包

规则判断

直连 / 代理 / 拒绝

没有虚拟网卡时,Clash 通常只能依赖 HTTP/SOCKS 系统代理。有些软件不遵守系统代理设置,就会绕过 Clash。开启 TUN 后,Clash 可以从更底层接管系统流量,因此体验更接近传统 VPN。


4. TUN 和 TAP:两个常见虚拟网卡类型

TUN 和 TAP 都是虚拟网络设备,但工作层级不同。

4.1 TUN

TUN 通常来自 network tunnel,即网络隧道。它是三层虚拟网卡,处理的是 IP 包。

1
2
3
4
TUN = network tunnel
工作层级:Layer 3 / 网络层
处理对象:IP packet / IP 包
典型用途:VPN、Clash TUN、WireGuard、OpenVPN 路由模式

TUN 看到的是:

1
2
IP: 192.168.1.10 → 8.8.8.8
TCP: source port 51234 → destination port 443

Clash TUN 主要关心 IP、端口、TCP/UDP 协议、DNS 映射和规则匹配,所以 TUN 非常适合这类代理分流场景。

4.2 TAP

TAP 通常表示 network tap,即网络分接或接入。它是二层虚拟网卡,处理的是以太网帧。

1
2
3
4
TAP = network tap
工作层级:Layer 2 / 数据链路层
处理对象:Ethernet frame / 以太网帧
典型用途:虚拟机桥接、虚拟局域网、OpenVPN 桥接模式

TAP 看到的是:

1
2
Ethernet: MAC A → MAC B
里面再包着 IP 数据

简单说:

1
2
TUN 模拟三层 IP 设备。
TAP 模拟二层以太网设备。

Clash 更常用 TUN,因为 Clash 主要做 IP 层流量接管和规则分流,不需要模拟完整的二层局域网。


5. Clash 的整体架构

Clash 的运行可以拆成五个核心部分:

1
2
3
4
5
1. Inbound:流量如何进入 Clash
2. DNS:域名如何解析,以及如何保留域名信息
3. Rule:请求如何匹配规则
4. Proxy Group:命中规则后如何选择节点
5. Outbound:流量如何从 Clash 发出去

完整链路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
浏览器 / App

系统代理端口、SOCKS5 端口、TUN 虚拟网卡或透明代理入口

Clash Inbound

DNS 模块 / fake-ip 映射

规则匹配引擎

策略组选择器

具体出站:DIRECT / REJECT / Shadowsocks / Trojan / VLESS / Hysteria / WireGuard 等

目标网站

这也是为什么 Clash 配置文件通常包括以下几块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- https://dns.google/dns-query

proxies:
- name: node-1
type: trojan
server: example.com
port: 443
password: xxx

proxy-groups:
- name: PROXY
type: select
proxies:
- node-1
- DIRECT

rules:
- DOMAIN-SUFFIX,google.com,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY

6. Clash 的入站:流量如何进入 Clash

Inbound 是流量进入 Clash 的入口。常见方式有系统代理、SOCKS5、Mixed Port、TUN 和透明代理。

6.1 HTTP 代理入口

HTTP 代理入口主要服务于支持 HTTP Proxy 的应用。浏览器或系统代理设置会把 HTTP/HTTPS 请求交给 Clash。

对于 HTTP 请求,代理可以看到完整请求目标。对于 HTTPS 请求,通常通过 CONNECT 方法建立隧道。

路径如下:

1
2
3
4
5
6
7
8
9
浏览器

127.0.0.1:7890 HTTP Proxy

Clash

规则判断

远程代理或直连

6.2 SOCKS5 入口

SOCKS5 是更通用的代理接口。它不局限于 HTTP,可以表达“连接某个域名/IP 和端口”。

路径如下:

1
2
3
4
5
6
7
8
9
App

127.0.0.1:7891 SOCKS5

Clash

规则判断

出站

SOCKS5 本身不负责加密。它只是本地应用和代理客户端之间的通用代理协议。如果 SOCKS5 只监听在 127.0.0.1,本地链路不加密通常问题不大;如果暴露到局域网或公网,就需要谨慎处理认证和访问控制。

6.3 Mixed Port

Mixed Port 是 Clash 常用入口,可以同时接受 HTTP 和 SOCKS5 请求。

例如:

1
mixed-port: 7890

这样应用可以把 127.0.0.1:7890 当作 HTTP 代理,也可以当作 SOCKS5 代理使用,具体由协议握手自动识别。

6.4 TUN 模式

TUN 模式创建虚拟网卡,把系统网络层流量导入 Clash。

路径如下:

1
2
3
4
5
6
7
8
9
10
11
App

系统网络栈

TUN 虚拟网卡

Clash

规则判断

DIRECT / PROXY / REJECT

TUN 的优势是覆盖面更广。不遵守系统代理的软件、命令行工具、部分游戏和 UDP 流量,都有机会被接管。

但 TUN 也更复杂,涉及:

1
2
3
4
5
6
7
虚拟网卡权限
系统路由表
DNS 劫持
fake-ip 映射
MTU 设置
防火墙规则
UDP 支持

6.5 透明代理

透明代理常见于 Linux、OpenWrt、旁路由和软路由环境。它通过 iptables、nftables、tproxy 或路由规则把局域网设备的流量重定向到 Clash。

路径如下:

1
2
3
4
5
6
7
8
9
10
11
局域网设备

路由器

iptables / nftables / tproxy

Clash

规则判断

出站

透明代理的特点是终端设备不需要主动设置代理,路由器层面统一接管。但配置复杂度更高,DNS 和 UDP 处理尤其容易出问题。


7. Clash 的 DNS 模块

DNS 是 Clash 分流准确性的关键。

假设应用访问:

1
https://www.google.com

它首先需要知道 www.google.com 的 IP。如果 DNS 查询绕过 Clash,那么 Clash 可能只看到一个 IP 地址,而不知道这个 IP 原来对应 www.google.com。这样基于域名的规则就无法准确匹配。

7.1 DNS 泄漏

DNS 泄漏指的是:网页流量走了代理,但域名查询仍然发给本地运营商或其他未预期的 DNS 服务器。

例如:

1
2
网页数据:浏览器 → Clash → 代理服务器 → Google
DNS 查询:系统 → 运营商 DNS → 查询 google.com

这样运营商虽然看不到 HTTPS 内容,但仍然能看到你查询了哪些域名。

7.2 fake-ip 模式

fake-ip 是 Clash 中非常重要的 DNS 增强模式。

普通 DNS:

1
2
3
应用问:google.com 的 IP 是多少?
DNS 回答:142.250.x.x
应用连接:142.250.x.x

fake-ip 模式:

1
2
3
4
应用问:google.com 的 IP 是多少?
Clash 回答:198.18.0.23 这样的假 IP
应用连接:198.18.0.23
Clash 查映射表:198.18.0.23 → google.com

fake-ip 的价值在于:它让 Clash 在 IP 层流量中保留域名语义。

如果 Clash 只看到真实 IP,它可能只能用 IP 规则判断。如果 Clash 能通过 fake-ip 映射恢复域名,就可以继续使用:

1
2
3
4
DOMAIN
DOMAIN-SUFFIX
DOMAIN-KEYWORD
GEOSITE

这些规则通常比纯 IP 规则更准确。

可以把 fake-ip 理解成:

1
用一个假的 IP 地址作为“域名标签”,让后续连接仍然能追溯回原始域名。

7.3 redir-host 模式

redir-host 模式返回真实 IP,而不是假 IP。

1
google.com → 142.250.x.x

它更接近传统 DNS 行为,兼容性通常较好。但在 TUN 或透明代理场景中,如果域名信息丢失,分流精度可能不如 fake-ip。

简单比较:

1
2
3
4
5
6
7
fake-ip:
优点:域名规则匹配准确,适合 TUN 和透明代理。
缺点:部分软件不兼容假 IP,需要 fake-ip-filter。

redir-host:
优点:返回真实 IP,兼容性较好。
缺点:复杂分流场景下可能丢失域名语义。

7.4 fake-ip-filter

部分软件不能接受 fake-ip。比如某些局域网服务、系统连通性检测、游戏、银行应用或特殊客户端,可能会把 fake-ip 缓存下来,导致连接异常。

这时需要配置 fake-ip-filter,让这些域名走真实解析:

1
2
3
4
5
fake-ip-filter:
- "*.lan"
- "*.local"
- "localhost.ptlogin2.qq.com"
- "+.msftconnecttest.com"

8. Clash 的规则引擎

规则引擎是 Clash 的大脑。它决定每一条连接最终走哪里。

常见规则类型包括:

1
2
3
4
5
6
7
8
9
DOMAIN:精确匹配某个域名
DOMAIN-SUFFIX:匹配域名后缀
DOMAIN-KEYWORD:匹配域名关键词
GEOIP:根据目标 IP 所属地区匹配
IP-CIDR:匹配 IP 地址段
SRC-IP-CIDR:匹配源 IP 地址段
DST-PORT:匹配目标端口
PROCESS-NAME:匹配进程名
MATCH:兜底规则

示例:

1
2
3
4
5
6
rules:
- DOMAIN-SUFFIX,baidu.com,DIRECT
- DOMAIN-SUFFIX,google.com,PROXY
- DOMAIN-KEYWORD,ads,REJECT
- GEOIP,CN,DIRECT
- MATCH,PROXY

含义是:

1
2
3
4
5
baidu.com 及其子域名直连
google.com 及其子域名走 PROXY 策略组
域名中包含 ads 的请求拒绝
中国大陆 IP 直连
其他所有请求默认走 PROXY

规则通常从上到下匹配,第一条命中后停止。

例如访问 www.google.com

1
2
3
是否匹配 baidu.com?否
是否匹配 google.com?是
结果:PROXY

访问 www.baidu.com

1
2
是否匹配 baidu.com?是
结果:DIRECT

如果前面都没命中,就落入:

1
- MATCH,PROXY

这就是默认策略。


9. 策略组:Clash 如何选择节点

规则的结果不一定是具体节点,也可以是策略组。策略组负责从多个节点或动作中选择一个。

9.1 select

select 是手动选择。

1
2
3
4
5
6
7
8
proxy-groups:
- name: PROXY
type: select
proxies:
- node-1
- node-2
- node-3
- DIRECT

用户可以在面板里手动选择当前使用哪个节点。

9.2 url-test

url-test 会定期访问一个测试 URL,选择延迟较低的节点。

1
2
3
4
5
6
7
8
9
proxy-groups:
- name: AUTO
type: url-test
proxies:
- node-1
- node-2
- node-3
url: http://www.gstatic.com/generate_204
interval: 300

注意:url-test 测的是到测试地址的延迟,不代表所有网站都快。节点访问某个测试 URL 很快,不等于访问 YouTube、GitHub、OpenAI 或游戏服务器都快。

9.3 fallback

fallback 按顺序测试节点,选择第一个可用节点。

1
2
node-1 可用 → 用 node-1
node-1 不可用,node-2 可用 → 用 node-2

适合主备切换。

9.4 load-balance

load-balance 把不同连接分配到多个节点。

它不是把一个 TCP 连接拆成多条链路叠加带宽。对单个连接而言,通常仍然只走一个节点。它更适合多连接场景。


10. Clash 的出站:流量最终如何出去

Outbound 是流量从 Clash 发出的方式。常见出站有:

1
2
3
4
5
6
7
8
9
10
11
DIRECT
REJECT
SOCKS5
HTTP
Shadowsocks
Trojan
VMess
VLESS
Hysteria
TUIC
WireGuard

10.1 DIRECT

DIRECT 表示直连。

1
本机 → 目标网站

适合国内网站、局域网、公司内网、本地服务等。

10.2 REJECT

REJECT 表示拒绝连接。

1
本机 → Clash → 拒绝

常用于广告、追踪域名、恶意域名或不想访问的服务。

10.3 PROXY

PROXY 通常不是一个具体协议,而是一个策略组名称。它可以指向 Trojan、Shadowsocks、VLESS、Hysteria 等具体节点。

1
本机 → Clash → 远程代理服务器 → 目标网站

目标网站看到的是代理服务器 IP,而不是本机公网 IP。

11. 总结

Clash 是一个规则化、多协议的本地代理转发引擎

它的关键能力包括:

1
2
3
4
5
6
通过系统代理、SOCKS5、TUN 或透明代理接管流量
通过 DNS 和 fake-ip 保留域名语义
通过规则引擎决定直连、代理或拒绝
通过策略组在多个节点之间选择
通过不同协议连接远程代理服务器
在代理和直连之间做精细分流

一句话概括:

1
Clash = 流量接入 + DNS 控制 + 规则分流 + 策略选择 + 多协议出站。