梯子原理与Clash.Meta配置:2.配置文件逐模块介绍
本文以 CC BY-NC-SA 4.0 协议发布
问:那接下来教教我怎么写 Clash.Meta 配置文件呗,文件中的那些参数各自是什么含义?
答:以 Clash.Meta (mihomo) 为例,说明配置文件的写法
Clash.Meta 的配置文件是 yaml 格式的,比起 json 来说更适合手写,读起来也更加直观。当你从机场的“订阅链接”拉取配置的时候,下载的其实也是这种 yaml 格式的配置文件,只不过是由机场预先代为编写好的。你可以在电脑上的梯子客户端中,右键你的订阅→编辑文件,就可以看到机场分发下来的配置文件内容。
从订阅链接下载订阅的时候,机场默认一般会下发给你一套开箱能用的配置,包括机场节点、DNS、分流规则等等。
不过,“开箱即用”固然方便,但是用多了,经常会遇到默认规则无法满足的情况,搞得人十分难受,比如分流错误、DNS异常等等,此时就必须要修改配置文件。另外当你需要让梯子与其他网络工具相互配合时,难以直接对机场下发的配置进行修改,因为每次更新订阅时,你之前的修改都会被抹去。
自定义梯子配置文件,就是为了解决上面这些问题。
梯子配置文件的主要内容,正好覆盖了前面原理简述“总结”段中的所有重点机制:DNS 请求处理、系统代理/TUN 设置、分流规则、梯子节点与协议配置。
下面将把配置文件拆成几个部分分开进行简述。这里给出的配置都是经过手动设置的,有部分示例需要手动填写,比如机场订阅、规则订阅等,但是大部分基本都可以开箱即用。
所有的配置项都能在 Clash.Meta 官方文档 找到对应的解释以及例子。也可以参考 Clash.Meta 官方示例配置文件。
根据前面原理介绍中的“总结”段,我们可以把梯子的工作流程整理为三个步骤:
流量入站(截获请求)→ 流量分流(根据分流规则进行处理)→ 流量出站(决定从哪个梯子节点发出流量)
为了便于进一步加深理解,我们不妨把这整个流程比作一个“火车站”的工作过程。如果把每一段流量比作一个人的话,
- “入站”指的是如何找到火车站大门(代理入口)、进入火车站(Clash)的过程
- “分流”指的是根据火车站内的指示标志(分流规则),找到自己该去的出站口(策略组)的过程
- “出站”指的是走出出站口上到月台后,该选哪列火车(梯子节点)出发的过程
下面对整个配置的各部分进行形象化的解释。
1. 基础配置部分
这部分是 Clash“火车站”的一些参数配置,一般不用修改,保持默认即可。
log-level: info # 日志等级,一般为 info
mode: rule # 默认的梯子工作模式,一般选 rule(规则模式),会正常使用分流规则
external-controller: 127.0.0.1:9090 # Clash 控制 API 地址
secret: 0ad3dc69-b9ef-4d19-a960-350bc4eb94c3 # Clash 控制 API 密码
find-process-mode: strict # 进程匹配模式
keep-alive-interval: 360 # 减少移动设备唤醒耗电问题的临时措施
2. 机场订阅部分
这部分是从各”火车公司“(机场)拿到”车次列表“(节点列表)的过程,由proxy-providers
控制。配置如下:
# 我们将大部分配置(如 DNS 设置、分流规则等)都自己手写,只把机场给的节点导入进来使用
# 这样,所有机场可以共享自己写的同一套参数配置,更适合自己的需求,而且碰到问题的时候也可以自行快速修复
# 以后要加/删机场,直接到这里来修改
proxy-providers:
# 机场订阅 1
myairport1:
type: http
url: https://xxxxxxxxxx # 订阅链接
path: ./myairport1.yaml # 把配置文件下载到哪里(按机场名字随便起个文件名就行)
interval: 86400 # 自动更新订阅周期(秒)
# 机场订阅 2
airport-good:
...
# 机场订阅 3
free-airport-for-back-up:
...
3. 入站配置部分
这里是第一部分”入站“的相关配置,描述”火车站“(Clash)有哪几个”大门“可供流量进入。目前,有系统代理和 TUN 这两个“大门”,配置如下:
mixed-port: 7890 # 系统代理的工作端口,同时支持 HTTP/Socks5 代理
allow-lan: false # Clash 的系统代理是否允许来自局域网内其他设备的连接,一般用 false
ipv6: false # 是否处理 IPv6 流量
# TUN 的配置
tun:
enable: false # 默认是否启用 TUN 模式
stack: system # TUN 使用的网络堆栈(一般不修改)
dns-hijack: # 本地拦截 DNS 请求的地址
- "any:53" # 截获 DNS 请求后,将使用 Clash 的 DNS 模块代替系统完成 DNS 查询
- "tcp://any:53"
auto-route: true # 自动修改路由表,使所有流量路由进入 tun 网卡
auto-detect-interface: true # 自动选择出口网卡
strict-route: true # 严格路由模式,防止地址泄露问题
4. 策略分组部分
策略分组,也就是第三部分“出站“的相关配置,决定应该从哪个梯子节点发出流量。
Clash 通过策略组的形式实现出站选择。这个功能尽管有些复杂,但是相当强大,除了最基础的节点聚合功能之外,还可以实现自动节点选择、故障自动回落、负载均衡等功能,以及对不同类型的流量设置不同的出口节点。
4.1 怎么形象化地理解策略组?
不同的策略组,可以比作“火车站”的不同“出站口”。每一个“出站口”都有其类别,比如“通用出站口1号”、“只去往香港的出站口2号”、“只去往新加坡的出站口3号”,乃至“下载流量该走的出站口15号”、“番剧流量该走的出站口17号”、“广告该走的出站口114514号”…….
每一个“出站口”(策略组)都会配有好几辆”列车“(梯子节点)。从“出站口”出去坐什么“列车”走,是由你决定的:
- 你可以给“出站口”手动选择一辆“列车”,如果某辆车不好使了,可以手动”换一辆“(手动换节点)
- 你可以指定”出站口“从一堆”列车“中自动选延迟最低的那辆给人坐(自动选择)
- 你可以让一个”出站口“同时停几辆”列车“接人,这样运力就可以翻倍(负载均衡)
- 你可以叫某个“出站口”的人转到别的口去出站
- 对于”去往香港的出站口“,你可以从”车次列表“中把所有开往香港的车筛选出来,然后自动选择延迟最低的让人坐,或者同时停几辆搞负载均衡
- 对于”下载流量的出站口“,你可以专门挑一列运力比较充足的”列车“来运,免得跑一半燃料用完了
- 对于”广告出站口“,你可以在那里放个黑洞,把人全丢进去(
- …….
策略组是一个非常灵活的功能,不同配置的组合有无限可能。具体怎么设计,设计成什么样,全靠你自己的需求来搞。
下面的例子中,没有用到那些高级的功能,只是最简单朴素的几个手动的“出站口”。在熟悉相关配置之后,你可以按自己的需求来进一步扩展“火车站”的功能。
# 策略组列表
proxy-groups:
# 通用“出站口”
- name: ✈ 机场选择
type: select # 手动选择节点
proxies: # * proxies 里面可以填:1. 别的“出站口”的名字 2. 单个节点的名字
- "myairport1" # 转到 myairport1“出站口”
- "airport-good" # 转到 airport-good“出站口”
- "free-airport" # 转到 free-airport“出站口”
- "hysteria2 节点" # 自建节点
- DIRECT # 直连出口,不坐车,直接离开”火车站“
# myairport1“出站口”
- name: myairport1
type: select # 手动选择节点
use: # * use 里面填机场订阅的名字,表示导入这个机场的所有节点
- myairport1 # 导入 myairport1 机场的所有节点
proxies:
- DIRECT # 直连出口
# free-airport“出站口”
- name: free-airport
type: select
use:
- free-airport-for-back-up # 导入 free-airport-for-back-up 机场的所有节点
proxies:
- DIRECT
# ...... 把自己所有的机场一个个填进来
# 随机“出站口”
- name: "🎲 Random"
type: load-balance # 负载均衡
use:
- myairport1 # 使用 myairport1 机场的所有节点
# 广告“出站口”
- name: "🛑 广告拦截"
type: select # 手动选择节点
proxies:
- REJECT # 黑洞。一般固定选择此项
- DIRECT # 如果有些广告被拦截导致网站异常,可以手动暂时切到直连出口
# 分流规则未识别的流量的“出站口”,即漏网之鱼
- name: "🐟 漏网之鱼"
type: select # 手动选择节点
proxies:
- DIRECT # 黑名单模式,分流规则未识别的流量的都直连出站
- ✈ 机场选择 # 白名单模式,分流规则未识别的流量的都走代理出站
5. 分流规则部分
有了“大门”,有了“出站口”,最后只剩下如何对进入 Clash 的流量进行分类,使其去往正确的“出站口”了,这正是分流规则所做的事儿。
分流规则的正确与否,对日常使用体验来说至关重要,错误的分流规则会导致有的国内/国外网站上不去,或者定位错误,还需要专门排查,相当麻烦。
天下域名 IP 千千万,说实话纯靠自己写绝不可能把所有域名的分流都一一安排妥当。所幸,互联网上有很多由志愿者维护的高质量的规则集合,可供我们直接引用,比如 Clash.Meta 内置的 GeoIP IP 地理位置数据库、Github 上的 GeoSite 大型域名分类数据库、各路大神的去广告规则库等等。通过引用这些现有规则,加上按自己需求设定少许特定的规则,一个完善的分流体系就建立起来了。
分流规则配置分为规则集合订阅providers
和分流规则列表rules
两个部分,具体如下:
# 分流规则集合订阅列表
rule-providers:
# 在这里添加自定义的分流规则集合订阅
Rule-AdBlock-Example:
type: http
behavior: classical
format: yaml
url: "https://xxxxxxxx.yaml" # 此分流规则集合的订阅链接
path: ./adblock-example.yaml # 把配置文件下载到哪里(随便起个名字就行)
interval: 600 # 自动更新订阅周期(秒)
#
# 分流规则列表:
# 分流规则是按顺序从上到下一条条匹配的,匹配到符合的规则,就把此流量送往对应的策略组出站
#
# 每条规则的格式为:- <规则类型>,<规则内容>,<分流去哪个策略组>,(额外参数)
# 最常用的规则类型:DOMAIN:域名完全匹配;DOMAIN_SUFFIX:域名后缀匹配;RULE-SET:分流规则集合;
# GEOIP:IP地理位置数据库;GEOSITE:geosite域名分类数据库;IP-CIDR:IP地址段
# 另外还可以用逻辑运算符和括号将几条规则组合起来
#
# GeoSite数据库:这是一个巨大的域名分类数据库,在 GitHub 有数个项目托管此数据库并由志愿者维护。
# Clash.Meta 已经内置了 GeoSite 数据库,在启动时会自动进行下载,因此geosite规则可以直接在分流规则中使用。
# 如果你想知道GeoSite数据库中有哪些条目可供使用,请前往查看:
# https://github.com/v2fly/domain-list-community/tree/master/data
#
rules:
# 局域网流量,走 DIRECT 直连
- GEOIP,private,DIRECT,no-resolve # no-resolve 先全部照抄
- GEOSITE,private,DIRECT,no-resolve
###########################################################################
# 自定义分流规则:当遇到分流问题,或者有特殊需求的时候,手动在这里增删自定义条目
# 强制走 DIRECT 直连的地址
- DOMAIN-SUFFIX,msftconnecttest.com,DIRECT,no-resolve # 微软 Wifi 验证跳转
- DOMAIN-SUFFIX,paypal.com,DIRECT # Paypal
- DOMAIN-SUFFIX,xn--ngstr-lra8j.com,DIRECT # Play 商店下载
- DOMAIN-SUFFIX,dl.delivery.mp.microsoft.com,DIRECT # 微软商店下载和系统更新
- PROCESS-NAME,baidunetdisk.exe,DIRECT # 禁止百度网盘探测代理
- PROCESS-NAME,baidunetdiskhost.exe,DIRECT
# 强制走代理出站的地址
- DOMAIN-SUFFIX,deepl.com,✈ 机场选择 # DeepL
- DOMAIN-SUFFIX,ipaddress.my,✈ 机场选择 # 我的 IP 地址查询
- DOMAIN,connectivitycheck.gstatic.com,✈ 机场选择 # Android 连接检测
- DOMAIN,claude.ai,✈ 机场选择 # Claude AI
- DOMAIN-SUFFIX,claude.ai,✈ 机场选择
- DOMAIN-SUFFIX,logitech.com,✈ 机场选择 # 罗技
###########################################################################
# 广告分流规则
- GEOSITE,category-ads-all,🛑 广告拦截 # GeoSite 中的广告条目
- RULE-SET,Rule-AdBlock-Example,🛑 广告拦截 # 在此处引入规则订阅
# GeoSite 为 CN 的域名全部走直连
- GEOSITE,cn,DIRECT
# 常见的 GeoSite 规则
- GEOSITE,google,✈ 机场选择
- GEOIP,telegram,✈ 机场选择,no-resolve
- GEOSITE,telegram,✈ 机场选择
- GEOSITE,openai,✈ 机场选择
- GEOSITE,onedrive,✈ 机场选择
- GEOSITE,microsoft@cn,DIRECT # 微软中国
- GEOSITE,microsoft,✈ 机场选择 # 微软国际
- GEOSITE,steam@cn,DIRECT # steam 中国
- GEOSITE,steam,✈ 机场选择 # steam 国际
- GEOSITE,category-games@cn,DIRECT # 国内游戏
- GEOSITE,category-games,✈ 机场选择 # 国外游戏
- GEOSITE,biliintl,✈ 机场选择 # bilibili 国际
- GEOSITE,cloudflare,✈ 机场选择
# 常见的 GeoSite 大型分类
- GEOSITE,category-social-media-!cn,✈ 机场选择
- GEOSITE,category-entertainment,✈ 机场选择
- GEOSITE,category-communication,✈ 机场选择
- GEOSITE,category-scholar-!cn,✈ 机场选择
- GEOSITE,category-orgs,✈ 机场选择
- GEOSITE,category-porn,✈ 机场选择
- GEOSITE,category-android-app-download,✈ 机场选择
- GEOSITE,category-forums,✈ 机场选择
- GEOSITE,category-anticensorship,✈ 机场选择
- GEOSITE,category-dev,✈ 机场选择
- GEOSITE,gfw,✈ 机场选择
# 上面的所有规则,都不会引发 DNS 查询,不可能导致 DNS 泄露
# 从下面的规则开始,可能会引发 DNS 查询
- GEOIP,telegram,✈ 机场选择 # telegram IP 走代理
- GEOIP,CN,DIRECT # 中国 IP,走直连
# 兜底
- MATCH,🐟 漏网之鱼 # 未被分流规则识别的剩余流量走“漏网之鱼”
进入 Clash 的流量,经过分流规则匹配后,有的被送往策略组出站,有的走直连出站,有的走黑洞
- 走策略组出站的流量,会根据你在对应策略组中的选择,被转发到对应的梯子节点远端,实现代理访问
- 走直连出站的流量,Clash 会直接在本地发起请求,不走代理
- 走黑洞的流量会被 Clash 直接丢弃
大家都有光明的未来
6. DNS 部分
到这里,Clash 最主要的三步主体工作步骤的配置就全部介绍完了。剩下的 DNS 配置和原理是最复杂的,特地放在最后一部分介绍。相关配置如下:
dns:
enable: true # 是否启用 Clash 的 DNS 模块(建议启用)
use-hosts: true # DNS 解析前是否检查 hosts 小节中的条目(建议启用)
use-system-hosts: true # DNS 解析前是否检查系统 hosts 文件中的条目(建议启用)
ipv6: false # DNS 是否返回 IPv6 结果
# fake-ip 相关配置(原理将在后面说明)
enhanced-mode: fake-ip # DNS 处理模式,可选 redir-host/fake-ip
fake-ip-filter: # fake-ip 白名单列表,其中的地址不走 fake-ip 处理
- "*.lan"
# Windows Connnect Detection
- '*.msftconnecttest.com'
- '*.msftncsi.com'
# QQ Quick Login
- 'localhost.ptlogin2.qq.com'
- 'localhost.sec.qq.com'
# STUN Server
- 'stun.*.*'
- 'stun.*.*.*'
# dns 解析相关设置(原理在后面说明)
default-nameserver: # 默认 DNS, 用于解析 DNS 服务器的域名(先有鸡-先有蛋问题)
- "223.5.5.5"
nameserver: # 主 DNS 服务器
- "system://" # 系统本地默认 DNS
- "223.5.5.5" # 阿里公共 DNS
- "180.76.76.76" # 百度公共 DNS
- "119.29.29.29" # 腾讯公共 DNS
fallback: # 后备 DNS 解析服务器(一般情况下填境外 DNS)
- "tls://1.1.1.1#✈ 机场选择" # CloudFlare DoT DNS,走代理查询
- "tls://8.8.8.8#✈ 机场选择" # Google DoT DNS,走代理查询
fallback-filter: # 哪些情况下采纳 fallback DNS 服务器的结果?
geoip: true # 启用 geoip 判定,检查返回的 IP 地址的地理位置
geoip-code: CN # 除了国内的 IP 之外,其他地方的 IP 结果会强制使用 fallback DNS 的结果
# 用于防止 DNS 污染
ipcidr: # 在这个网段内的 IP 结果也会被考虑为被污染的 IP
- 240.0.0.0/4
hosts:
# 可以在这里自定义一些 hosts 条目,和系统 Hosts 功能相同
# membership-restaurant.com: 1.14.5.14
上面的DNS配置是可以开箱即用的,直接复制进配置文件,就可以开始使用了。
如果有兴趣探究 DNS 部分的真实工作原理,或者想了解前面说的“DNS 泄露”和“no-resolve”到底指的是什么,那请前往第三弹一探究竟~
系列全文目录: