Contents

梯子原理与Clash.Meta配置:2.配置文件逐模块介绍

本文以 CC BY-NC-SA 4.0 协议发布

问:那接下来教教我怎么写 Clash.Meta 配置文件呗,文件中的那些参数各自是什么含义?

答:以 Clash.Meta (mihomo) 为例,说明配置文件的写法

虚空终端 (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”到底指的是什么,那请前往第三弹一探究竟~


系列全文目录: