clash
代理工具
clash备份
clash · GitHub Topics
MetaCubeX mihome, ClashX.meta, metacubexd, Yacd-meta, ClashMetaForAndroid
mihomo-party
clash-verge-rev A Clash Meta GUI for Windows, Linux and MacOS
clash_singbox 更新 mihomo 内核、sing-box 内核、sing-box PuerNya 版内核、Clash dashboard 面板和 AdGuard Home
OpenClash A Clash client for Openwrt
v2rayN A GUI client for Windows
v2rayNG A V2Ray client for Android
hiddify-next A multi-platform proxy client
error:Can’t find MMDB, start download:
Country.mmdb
规则配置
默认配置目录是 $HOME/.config/clash
clash-rules
1 | rules: |
dashboard
yacd
metacubexd
以Linux为例:
git下来后移动到/home/username/.config/clash,重命名为dashboard
1 | external-controller: 0.0.0.0:9090 |
外网访问 http://服务器ip:9090/ui/#/proxies
nginx反向代理
1 | location /mihomo/ { |
开机自启
1 | [Unit] |
1 | sudo vim /etc/systemd/system/clash.service #将上述内容粘贴 |
设置代理
写在~/.bashrc
1 | #Open proxy |
dns配置
示例:
1 | dns: |
1 | dns: |
enable
是否启用 DNS 功能。若设为 false,则使用系统 DNS 进行解析。
cache-algorithm
支持的缓存算法:
lru:Least Recently Used(默认)arc:Adaptive Replacement Cache
prefer-h3
DoH 请求优先使用 HTTP/3 协议。
listen
DNS 服务监听地址,支持 udp 和 tcp 协议。
IPV6
是否解析 IPv6 地址。若设为 false,对 AAAA 查询将返回空响应。
enhanced-mode
可选值:fake-ip / redir-host(默认 redir-host)
指定 mihomo 的 DNS 处理模式。
fake-ip-range
在 fake-ip 模式下使用的 IP 段设置,同时作为 TUN 模式下默认 IPv4 地址的参考范围。
fake-ip-filter
在 fake-ip 模式下,匹配此列表的域名不会下发 fake-ip 映射用于连接。
支持域名通配符及引用域名集合。
fake-ip-filter-mode
可选值:blacklist(默认)/ whitelist
blacklist:匹配的域名不返回 fake-ipwhitelist:仅匹配的域名才返回 fake-ip
use-hosts
是否响应配置文件中定义的 hosts 条目,默认为 true。
use-system-hosts
是否查询系统 /etc/hosts 文件,默认为 true。
respect-rules
DNS 查询是否遵守路由规则。启用时需配置 proxy-server-nameserver。
⚠️ 强烈不建议与 prefer-h3 同时使用。
default-nameserver
用于解析 DNS 服务器自身域名的默认 DNS。
必须为 IP 地址,支持加密 DNS(如 DoH/DoT)。
1 | default-nameserver: |
nameserver-policy
为特定域名指定解析服务器,支持 geosite,优先级高于 nameserver 和 fallback。
键支持通配符,值可为字符串或数组。
1 | nameserver-policy: |
proxy-server-nameserver
专用于解析代理节点域名的 DNS 服务器。
若未设置,则沿用 nameserver-policy、nameserver 或 fallback 的配置。
direct-nameserver
用于 direct 出站策略域名解析的 DNS 服务器。
若未设置,则沿用 nameserver-policy、nameserver 或 fallback 的配置。
direct-nameserver-follow-policy
是否让 direct-nameserver 遵循 nameserver-policy。
仅在 direct-nameserver 非空时生效,默认为 false(不遵循)。
nameserver
默认域名解析服务器列表。
fallback
后备域名解析服务器,通常配置为境外 DNS,确保结果可信。
配置 fallback 后,默认启用 fallback-filter,且 geoip-code 默认为 CN。
fallback-filter
对后备 DNS 结果进行筛选,满足条件时优先或仅使用 fallback 的结果。
geoip
是否启用 GeoIP 判断功能。
geoip-code
国家代码,默认为 CN。
- 非此国家的 IP 结果视为“污染”,将采用
fallback结果 - 此国家的 IP 结果直接采用
geosite
匹配 geosite 集合中的域名被视为已污染,将仅使用 fallback 解析,跳过 nameserver。
ipcidr
填写格式为 IP/掩码。
匹配这些网段的解析结果视为污染,将采用 fallback 的结果。
domain
列出的域名被视为已污染,匹配时直接使用 fallback 解析,跳过 nameserver。
dns流程
场景一:访问国内网站 (例如:www.baidu.com)
应用请求 & Clash 返回“假IP”
- 浏览器向系统请求
www.baidu.com的 IP。 - Clash 的
enhanced-mode: fake-ip立即介入,直接返回fake-ip-range(198.18.0.1/16) 中的一个地址(如198.18.0.10)。 - 关键点:此时 Clash 内部记录:
198.18.0.10 <-> www.baidu.com。
- 浏览器向系统请求
Clash 嗅探与分流准备
- 浏览器向
198.18.0.10发起 TCP/UDP 连接。 - Clash 截获流量,还原出域名
www.baidu.com。 - Clash 根据你配置文件中的
rules(假设包含GEOSITE,CN,DIRECT)判断该域名命中 DIRECT 规则。
- 浏览器向
触发
direct-nameserver查询- 由于命中
DIRECT规则,Clash 启用direct-nameserver列表进行解析。 - Clash 并发向
https://dns.alidns.com/dns-query和https://doh.pub/dns-query发起请求。 - 技术细节:Clash 会先通过
default-nameserver(223.5.5.5) 解析出阿里/腾讯 DoH 服务器的真实 IP,以建立加密连接。
- 由于命中
获取真实 IP 并直连
- 国内 DNS 返回百度真实的国内服务器 IP。
- Clash 拿到真实 IP 后,直接建立本地网络到百度服务器的连接。
场景二:访问国外网站 (例如:www.github.com)
应用请求 & Clash 返回“假IP”
- 过程同上,浏览器获得一个假 IP(如
198.18.0.22)。
- 过程同上,浏览器获得一个假 IP(如
Clash 嗅探与分流准备
- 浏览器向
198.18.0.22发起连接,Clash 还原出域名www.github.com。 - Clash 匹配
rules,由于不属于国内范围,通常命中PROXY规则。
- 浏览器向
触发
nameserver组(带 #PROXY 标签)查询- 由于判定为
PROXY(或未命中直连规则),Clash 启用nameserver列表。 - 配置中
nameserver带有#PROXY后缀,这意味着 这些 DNS 请求本身也会走代理隧道 发送出去。 - Clash 通过代理节点向
dns.cloudflare.com或dns.google发起 DoH 请求。
- 由于判定为
远程解析与建立连接
- 代理节点远端解析出 GitHub 的真实海外 IP。
- 优势:由于 DNS 请求在代理隧道内加密且在远端执行,彻底规避了本地运营商的 DNS 污染和劫持。
- Clash 最终通过代理节点,建立到 GitHub 真实 IP 的加密通道。
场景三:特殊过滤 (例如:connectivity-check)
- 触发
fake-ip-filter- 当浏览器访问
connectivity-check.gstatic.com(属于geosite:connectivity-check)时。 - Clash 发现它在
fake-ip-filter列表中,于是 不返回假 IP,而是直接进行真实 DNS 解析并返回真实 IP 给浏览器。 - 这样可以确保系统网络检查、私有网络地址等不会因为“假 IP”而产生兼容性问题。
- 当浏览器访问
流量嗅探 (Sniffing)
什么是流量嗅探?
在 Clash 中,嗅探(Sniffing)主要是指从应用发出的网络数据包中,反向提取出“目标域名”的过程。
在使用 Fake-IP 模式或透明代理(如 Tun 模式/路由器翻墙)时,操作系统或应用发给 Clash 的往往只是一个 IP 地址(比如 Fake-IP 分配的假 IP,或者应用自己解析出的真实 IP)。Clash 为了进行精准的分流,必须搞清楚这个 IP 背后到底对应的是哪个域名。
嗅探是如何工作的?
步骤一:拦截初始连接
当应用向某个 IP 发起 TCP/UDP 连接时,Clash 会暂时“卡住”并拦截这些初始数据包。步骤二:拆包提取特征 (DPI 深度包检测)
Clash 会读取数据包的开头部分,寻找明文的域名信息:- 对于 HTTPS (TLS) 流量:Clash 会拆解
TLS Client Hello握手包,读取其中的SNI(Server Name Indication) 字段。这里面通常明文写着目标域名(例如www.youtube.com)。 - 对于 HTTP 流量:Clash 会读取 HTTP 请求头中的
Host字段。 - 另外,较新的核心(如 Meta)还能嗅探 BT 协议、QUIC 等流量特征。
- 对于 HTTPS (TLS) 流量:Clash 会拆解
步骤三:域名覆盖与放行
一旦提取到真实域名,Clash 就会用这个域名“覆盖”掉请求中原本的 IP 地址。
例如:Clash 收到指向198.18.0.15的连接,嗅探后发现 SNI 是www.google.com。接下来,Clash 内部的所有路由逻辑,都会基于www.google.com来计算。
为什么 Tun 模式下依然需要嗅探?
既然 Tun 模式能接管所有流量(包括 53 端口的 DNS 查询),为什么还会出现“拦截不到”或者“拿到纯 IP”的情况?主要是因为以下三种“不讲武德”的场景:
1. 浏览器开启了 DoH (DNS over HTTPS) —— 最常见的情况
- 原理:现在的 Chrome、Edge、Firefox 等浏览器,默认都开启了“安全 DNS (Secure DNS)”。它们在查询域名时,不走传统的 53 端口,而是把 DNS 请求打包成普通的 HTTPS 加密网页流量(走 443 端口),发给比如 Cloudflare (1.1.1.1) 或 Google (8.8.8.8)。
- Tun 的视角:Tun 模式看到这个流量,只会认为“哦,浏览器在访问 1.1.1.1 的一个 HTTPS 网页”,它无法识别这其实是一个 DNS 查询,因此 Clash 的 DNS 处理逻辑直接被绕过。
- 嗅探的作用:浏览器通过 DoH 拿到真实 IP 后,向该 IP 发起连接。此时 Clash 的嗅探介入,拆开 TLS 握手包拿到 SNI(比如
www.netflix.com),从而重新激活分流规则。
2. App 内置了硬编码 IP 或自建 DNS
- 原理:某些 App(比如 Telegram、某些流媒体、部分国产大厂 App)为了防劫持或加速,代码里直接写死了服务器 IP 列表,或者使用了自己独立的私有协议去解析 IP。它们根本就不向操作系统发起任何标准的 DNS 请求。
- Tun 的视角:Tun 模式突然就收到了一个直接指向
149.154.x.x(TG的IP) 的连接请求,毫无前因后果。 - 嗅探的作用:同样,通过嗅探流量特征或 TLS 握手,把域名还原出来,确保正确走代理。
3. P2P 下载或直接 IP 访问
- 原理:BT 下载软件,或者你直接在浏览器地址栏输入了一个 IP 地址。
- Tun 的视角:这里压根就没有域名的概念,只有纯 IP 之间的互相连接。
- 嗅探的作用:对于 BT 流量,较新的嗅探核心(Meta/Mihomo)甚至能识别出 BitTorrent 协议特征,强制将其阻断或走直连,防止 BT 流量跑代理消耗机场流量。
嗅探 (Sniffer) 配置示例
1 | sniffer: |
链式代理
示例:
1 | proxies: |
