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

摘要
Clash 是一个运行在本机或网关上的规则化代理转发引擎。它把应用程序或系统网络栈产生的流量接入本地,再通过 DNS 模块、规则引擎和策略组判断流量应该直连、拒绝,还是通过某个远程代理节点转发出去。
Clash 可以理解为以下几个模块的组合:
1 | 流量入口 Inbound |
它和传统 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 | Trojan / Shadowsocks / VLESS / Hysteria 是“路”。 |
普通网络访问路径是:
1 | App / 浏览器 |
开启 Clash 后,路径变成:
1 | App / 浏览器 |
2. 网络基础:理解 Clash 之前必须知道的术语
2.1 IP 包
IP 包是网络层的数据单位。一个 IP 包至少包含源 IP、目标 IP、协议类型和负载数据。
例如:
1 | 源 IP:192.168.1.10 |
在互联网中,路由器主要根据目标 IP 地址决定下一跳。TUN 虚拟网卡处理的就是这一层的数据,所以 TUN 属于三层虚拟网卡。
2.2 TCP
TCP,即 Transmission Control Protocol,传输控制协议。它提供面向连接、可靠、有序的数据传输。
TCP 的特点是:
1 | 需要建立连接 |
HTTP/1.1、HTTP/2、传统 HTTPS、大部分代理协议都可以基于 TCP 运行。
一次 TCP 连接大致经历:
1 | 三次握手 → 数据传输 → 四次挥手或重置连接 |
TCP 适合网页访问、文件下载、API 请求等需要可靠传输的场景,但在高延迟、高丢包网络中,性能可能明显下降。
2.3 UDP
UDP,即 User Datagram Protocol,用户数据报协议。它是无连接协议,不保证可靠性,也不保证顺序。
UDP 的特点是:
1 | 不需要连接握手 |
DNS、QUIC、HTTP/3、游戏、语音通话、视频通话、WireGuard、Hysteria、TUIC 都大量使用 UDP。
UDP 不等于“不可靠应用”。QUIC、WireGuard 这类协议会在 UDP 之上自己实现加密、可靠性或会话管理。
2.4 DNS
DNS,即 Domain Name System,域名系统。它负责把域名转换成 IP 地址。
例如:
1 | www.google.com → 142.250.x.x |
应用访问网站之前,通常需要先做 DNS 查询。对 Clash 来说,DNS 非常关键,因为很多规则是基于域名的,而不是基于 IP 的。
如果 DNS 没有被 Clash 正确接管,就可能出现两个问题:
1 | 1. DNS 泄漏:域名查询仍然发给本地运营商 DNS。 |
2.5 TLS
TLS,即 Transport Layer Security,传输层安全协议。HTTPS 本质上就是 HTTP over TLS。
TLS 提供:
1 | 加密:第三方无法直接读取内容 |
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 | 浏览器 → HTTP 代理:CONNECT example.com:443 |
此时 HTTP 代理只是转发字节流,并不理解 TLS 里面的网页内容。
2.7 QUIC 和 HTTP/3
QUIC 是基于 UDP 的现代传输协议,集成了 TLS 加密、流复用、拥塞控制和连接迁移。HTTP/3 就运行在 QUIC 之上。
Hysteria 和 TUIC 都属于基于 QUIC 思路的代理协议。它们使用 UDP 作为底层传输,在弱网、高延迟或高丢包场景中可能比传统 TCP 代理表现更好。
但这也带来限制:如果网络环境屏蔽或限速 UDP,Hysteria、TUIC、WireGuard 这类协议就可能表现很差,甚至无法连接。
3. 虚拟网卡是什么
虚拟网卡是操作系统中由软件创建的网络接口。它看起来像一块真实网卡,但不对应物理硬件。
真实网卡包括:
1 | Wi-Fi 网卡 |
虚拟网卡包括:
1 | TUN / TAP 网卡 |
在系统看来,虚拟网卡也可以有接口名、IP 地址、路由规则、DNS 设置和 MTU。
例如:
1 | Wi-Fi 192.168.1.10 |
虚拟网卡的作用是让软件有机会接管网络流量。系统网络栈把数据包发给虚拟网卡,用户态程序再从虚拟网卡读取这些数据包,决定如何处理。
以 Clash TUN 为例:
1 | App |
没有虚拟网卡时,Clash 通常只能依赖 HTTP/SOCKS 系统代理。有些软件不遵守系统代理设置,就会绕过 Clash。开启 TUN 后,Clash 可以从更底层接管系统流量,因此体验更接近传统 VPN。
4. TUN 和 TAP:两个常见虚拟网卡类型
TUN 和 TAP 都是虚拟网络设备,但工作层级不同。
4.1 TUN
TUN 通常来自 network tunnel,即网络隧道。它是三层虚拟网卡,处理的是 IP 包。
1 | TUN = network tunnel |
TUN 看到的是:
1 | IP: 192.168.1.10 → 8.8.8.8 |
Clash TUN 主要关心 IP、端口、TCP/UDP 协议、DNS 映射和规则匹配,所以 TUN 非常适合这类代理分流场景。
4.2 TAP
TAP 通常表示 network tap,即网络分接或接入。它是二层虚拟网卡,处理的是以太网帧。
1 | TAP = network tap |
TAP 看到的是:
1 | Ethernet: MAC A → MAC B |
简单说:
1 | TUN 模拟三层 IP 设备。 |
Clash 更常用 TUN,因为 Clash 主要做 IP 层流量接管和规则分流,不需要模拟完整的二层局域网。
5. Clash 的整体架构
Clash 的运行可以拆成五个核心部分:
1 | 1. Inbound:流量如何进入 Clash |
完整链路如下:
1 | 浏览器 / App |
这也是为什么 Clash 配置文件通常包括以下几块:
1 | mixed-port: 7890 |
6. Clash 的入站:流量如何进入 Clash
Inbound 是流量进入 Clash 的入口。常见方式有系统代理、SOCKS5、Mixed Port、TUN 和透明代理。
6.1 HTTP 代理入口
HTTP 代理入口主要服务于支持 HTTP Proxy 的应用。浏览器或系统代理设置会把 HTTP/HTTPS 请求交给 Clash。
对于 HTTP 请求,代理可以看到完整请求目标。对于 HTTPS 请求,通常通过 CONNECT 方法建立隧道。
路径如下:
1 | 浏览器 |
6.2 SOCKS5 入口
SOCKS5 是更通用的代理接口。它不局限于 HTTP,可以表达“连接某个域名/IP 和端口”。
路径如下:
1 | App |
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 | App |
TUN 的优势是覆盖面更广。不遵守系统代理的软件、命令行工具、部分游戏和 UDP 流量,都有机会被接管。
但 TUN 也更复杂,涉及:
1 | 虚拟网卡权限 |
6.5 透明代理
透明代理常见于 Linux、OpenWrt、旁路由和软路由环境。它通过 iptables、nftables、tproxy 或路由规则把局域网设备的流量重定向到 Clash。
路径如下:
1 | 局域网设备 |
透明代理的特点是终端设备不需要主动设置代理,路由器层面统一接管。但配置复杂度更高,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 | 网页数据:浏览器 → Clash → 代理服务器 → Google |
这样运营商虽然看不到 HTTPS 内容,但仍然能看到你查询了哪些域名。
7.2 fake-ip 模式
fake-ip 是 Clash 中非常重要的 DNS 增强模式。
普通 DNS:
1 | 应用问:google.com 的 IP 是多少? |
fake-ip 模式:
1 | 应用问:google.com 的 IP 是多少? |
fake-ip 的价值在于:它让 Clash 在 IP 层流量中保留域名语义。
如果 Clash 只看到真实 IP,它可能只能用 IP 规则判断。如果 Clash 能通过 fake-ip 映射恢复域名,就可以继续使用:
1 | DOMAIN |
这些规则通常比纯 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 | fake-ip: |
7.4 fake-ip-filter
部分软件不能接受 fake-ip。比如某些局域网服务、系统连通性检测、游戏、银行应用或特殊客户端,可能会把 fake-ip 缓存下来,导致连接异常。
这时需要配置 fake-ip-filter,让这些域名走真实解析:
1 | fake-ip-filter: |
8. Clash 的规则引擎
规则引擎是 Clash 的大脑。它决定每一条连接最终走哪里。
常见规则类型包括:
1 | DOMAIN:精确匹配某个域名 |
示例:
1 | rules: |
含义是:
1 | baidu.com 及其子域名直连 |
规则通常从上到下匹配,第一条命中后停止。
例如访问 www.google.com:
1 | 是否匹配 baidu.com?否 |
访问 www.baidu.com:
1 | 是否匹配 baidu.com?是 |
如果前面都没命中,就落入:
1 | - MATCH,PROXY |
这就是默认策略。
9. 策略组:Clash 如何选择节点
规则的结果不一定是具体节点,也可以是策略组。策略组负责从多个节点或动作中选择一个。
9.1 select
select 是手动选择。
1 | proxy-groups: |
用户可以在面板里手动选择当前使用哪个节点。
9.2 url-test
url-test 会定期访问一个测试 URL,选择延迟较低的节点。
1 | proxy-groups: |
注意:url-test 测的是到测试地址的延迟,不代表所有网站都快。节点访问某个测试 URL 很快,不等于访问 YouTube、GitHub、OpenAI 或游戏服务器都快。
9.3 fallback
fallback 按顺序测试节点,选择第一个可用节点。
1 | node-1 可用 → 用 node-1 |
适合主备切换。
9.4 load-balance
load-balance 把不同连接分配到多个节点。
它不是把一个 TCP 连接拆成多条链路叠加带宽。对单个连接而言,通常仍然只走一个节点。它更适合多连接场景。
10. Clash 的出站:流量最终如何出去
Outbound 是流量从 Clash 发出的方式。常见出站有:
1 | DIRECT |
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 | 通过系统代理、SOCKS5、TUN 或透明代理接管流量 |
一句话概括:
1 | Clash = 流量接入 + DNS 控制 + 规则分流 + 策略选择 + 多协议出站。 |



