CLASH配置文件·基础篇
Clash是一个基于规则的跨平台网络代理工具,支持诸如Shadowsocks/V2Ray/Trojan等协议,功能强大,界面美观。
与传统的网络代理工具不同,Clash需要依赖配置文件(其他软件也得用,所以这话相当于废话)但是Clash不像一般的代理工具,无法在图形化前端上直接配置,不够直观,也就劝退了一堆小白。
好在,对于机场及付费服务用户来说,只要导入机场提供的订阅Url就完事了;对于自建用户,网络上也有很多“订阅转换”工具,能够满足基本要求。
然而,如果需要更好的个性化设置,那么只能对Clash的配置文件进行处理才能更好的让Clash“为我所用”。
(Q:Clash For Windows没有中文么?A:要不第三方汉化版,要不Google翻译去,总有一款适合你)
Clash的配置文件基于Yaml格式,也正应此,配置文件可读性很高。
Yaml有如下优点:
大小写敏感
缩进只能使用空格(不能用tab)
以缩进指示层级关系
支持注释(因此比json可读性就高了不是一星半点)
闲话少叙,下面进入正题。
(Ps:本文使用模板文件来自此处)
Clash配置文件分成多段,
首先是客户端设置:
port: 7890
socks-port: 7891
allow-lan: false
mode: Rule
log-level: info
external-controller: 127.0.0.1:9090
experimental:
ignore-resolve-fail: true
这是一些基础选项,
- port与socks-port无须多论,就是本地的http及socks5代理端口
- allow-lan:允许局域网共享,设置成true时发挥作用
- bind-address:当allow-lan设置true时发挥作用,设置”*”时绑定所有ip(包括v4及v6)当然也可以单个v4或者v6。
- mode:相当于Shadowrocket(或者桌面版ss/ssr/v2rayn)的模式
- 可选rule(按规则放行)/Global(全局走Clash)/Direct(全不走Clash)
- log-level:日志选项
- 可选silent(完全不输出日志)/warning(仅warning等级日志)/error(仅error等级日志)/info(正常输出)/debug(调试模式/嘈杂模式,输出最详细)
- external-controller:用不着不管(不是很懂)
- experimental:实验性功能
- ignore-resolve-fail:忽略DNS解析失败(默认开)
Hosts设置:
hosts:
'mtalk.google.com': 108.177.125.188
这里支持通配符,但是请注意静态(即完整域名)优先级是高于使用通配符的域名的。
(即定义了*.example.com又定义了foo.example.com会优先考虑foo.example.com)
(神马?不会用Hosts?Pls Google it.)
然后是DNS设置:
dns:
enable: true
ipv6: false
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-filter:
- '*.lan'
- localhost.ptlogin2.qq.com
- tplogin.cn
- routerlogin.net
nameserver:
- tls://dns.adguard.com:853
- https://1.1.1.1/dns-query
fallback:
- tcp://1.1.1.1
- tcp://8.8.4.4
- tcp://8.8.8.8
- tcp://9.9.9.9
fallback-filter:
geoip: true
ipcidr:
- 240.0.0.0/4
enhanced-mode设置为fake-ip或者redir-host模式
(以下内容来自某段网络资料)
如果是不使用 Fake-IP 的 redir 情况下,由于操作系统、浏览器或者应用程序中的任何一个缓存了 DNS 解析结果,因此 TCP 连接可以直接根据缓存的解析结果的 IP 建立,代理客户端并没有预先收到对应的 DNS question。在这种情况下,代理客户端有可能直接将这个连接视为和 IP 连接而不是和域名连接,根据域名规则的分流可能就会因此失效,不过根据 IP 分流的规则没有失效。
如果为了避免域名分流规则失效,你可以设法阻止操作系统或者浏览器缓存 DNS 解析结果,这样每次建立 TCP 连接之前都会发送 DNS question 使代理客户端探测到域名。但是这意味着每次 TCP 连接建立都需要代理客户端进行一次 DNS 解析请求(当然代理客户端可以对 DNS 解析进行缓存避免出现延时激增)。
Fake-IP 模式下,浏览器、应用程序都是对 Fake IP 发起连接,如果没有代理客户端对连接进行重新封转,那么这部分流量就不能被发往真实的目的 IP,因此所有流量都必须经过代理客户端,而根据端口、设备的分流就需要由代理客户端自己实现。(PS:坏处也是有的,如果Clash崩了你的网就全断了)
下面的fake-ip-filter:虚假ip过滤器(过滤本地地址)
这玩意的用处:比如不处理qq的快速登录(原理:QQ/TIM本地客户端打开服务器与网页交互)(腾讯远端可没这个服务器)或者Tplink路由器的Tplogin.cn,网件路由器的routerlogin.net等。
nameserver:设置DNS(支持DNS-over-TLS以及DNS-over-HTTPS)
fallback:当选择全部不可用时,故障恢复。
然后是Proxies一节(虽然鬼都不会手填)
proxies:
- name: "ss"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
# udp: true
在这里我们手动定义了一个Shadowsocks服务器。
- name:不用说都明白
- type:ss表示是个Shadowsocks服务器。
以下都很好懂
- udp:是否允许udp连接。
当然V2Ray 和Trojan也可以
- name: "v2ray"
type: vmess
server: server
port: 443
uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
alterId: 64
cipher: auto
#udp: true
tls: true
#skip-cert-verify: true
network: ws
ws-path: /path
ws-headers:
Host: v2ray.com
# Trojan
- name: "trojan"
type: trojan
server: server
port: 443
password: password
# udp: true
# sni: example.com # aka server name
alpn:
- h2
- http/1.1
# skip-cert-verify: true
(友情提示:请勿打开skip-cert-verify(跳过证书验证)否则会带来严重安全性问题:比如来自GFW的MITM(中间人攻击))
(不过一般都不会手填,要不然,,)
接下来是代理组策略:
可以在此定义切换节点,它与下一节的Rule(策略)都很重要。
假设你已经在上一节(proxies)定义过了
HK2
HK1
US1
TW1
KR1
这五个节点
Clash共四种代理方式:分别是自主选择,延迟最低,故障转移,负载均衡
自主选择:
proxy-groups:
- name: "自选"
type: select
proxies:
- "HK1"
- "HK2"
- "US1"
- "TW1"
- "KR1"
name不用多讲
type为select表示自选,
proxies以下内容为存在于此组内的节点列表。
关于自选很简单,比如我们选择了HK1这个节点,那么所有分流到这组的都需要走HK1这个节点。
延迟最低:
- name: "LowDelay"
type: url-test
proxies:
- "HK1"
- "HK2"
- "TW1"
url: 'http://www.gstatic.com/generate_204'
interval: 300
type:模式选择
在这里使用了url-test模式
(以下内容摘自某Clash文档)
很多刚接触这类分流软件的用户往往会犯一个常识性错误,那就是当他们得知自动选择是自动选择一个最快的节点,就很可能认为这个策略组选择的是速度最快的节点,然而显然不是如此。自动选择选出的节点是批量测延迟过后延迟最低的那个节点,而非许多人认为的速度最快的节点。clash没有内置一个策略组类型以供获取速度最快的节点。
根据我的理解,自动选择将选出组内一个能连的上且延迟最低的节点,这个节点不一定速度快,也不一定稳定,但是毫无疑问是这次批量测延迟中延迟最低的节点。
(比如iplc本来是给你打游戏用的,去下Google Drive还拉满速度岂不是多少有点那啥)
补充:这种低延迟的节点特别适合给Telegram或者Whatsapp用(尤其是语音通话的时候);或者是游戏用(低延迟硬性要求)
比如在Telegram/Clubhouse开语音电话的时候延迟太高这语音电话就会非常不稳定(乃至听了半天一句话听不到,无疑是非常致命的)
其他选项说明:
interval:间隔时间,单位秒(s)
tolerance:批量检测完后切换节点所需的延迟差
故障转移:
这个模式与自动选择逻辑相近:都用测延迟选择节点,区别在与选择模式;
- name: "Fallback"
type: fallback
proxies:
- "HK1"
- "TW1"
- "HK2"
url: 'http://www.gstatic.com/generate_204'
interval: 300
type:模式选择;这里选择了failback模式
interval:同上
说明:
第一次(当你夜里用不稳定的移动光纤家宽上网)
HK1 HK2 TW1
No Response 1000 1500
(延迟,单位毫秒(ms))
此时选择HK2节点
过了三百秒第二次检测:
TW1 HK1 HK2
450 375 1500
此时依旧选择HK2节点联网
又过了三百秒:
TW1 HK1 HK2
300 290 No Response
此时才会使用HK1节点
此模式虽有用但不一定完全可用
(延迟高到10^3ms可用吗?)
负载均衡:
与前面的工作方式也很类似,同样测延迟,但是并非只是单独一个节点,而是不同网站使用不同节点。
load-balance:
- name: "负载均衡"
type: load-balance
proxies:
- "1"
- "2"
- "3"
- "4"
url: 'http://www.gstatic.com/generate_204'
interval: 300
type为load-balance表示此(负载均衡模式)
url及interval见上。
这也就是为何称作“负载均衡”:不同流量不同代理,(理论)可以减轻服务器负载。
stragery:关键参数;
选项有叁:
不填
consistent-hashing
round-robin
第二项大致是对于同一个ip/网址下的请求都使用同一个节点。
(比如Google只用Hk1)
C项则是轮换;(爬虫事务有效——一直用一个节点会被拉清单的)
(友情提示:如果你的机场禁止批量测速/测延迟,那么以上三种策略请勿使用,否则会因为违反TOS被机场拉清单)
链式代理:
简单讲就是套娃;
比如你在校内找到了无线网,但是无线网需要认证啊,
这时候你发现不认证的时候校内有一台机器可以直连,这时候你“挪为私用”,在上面配置好Nodejs与npm,装好了SS-nodejs(ps:电信网直连npm不算慢)
可是你的机场只用v2ray啊,他不支持前置代理,这就很内啥,,
这时候Clash的链式代理就可以出场了。
- name: "OUTSIDE"
type: relay
proxies:
- "出口"
- "自选"
“出口”当然是你的自己搭建的ss
“自选”就是你选定的连接外网的节点组。
(ps:安全性很抱歉我们不能确保,就像你搭的SS如果被学校抓了,很难说不会出一个处分。这个问题不是一个clash客户端该讨论的,而是相对于这个协议来讨论的)
接下来是Rule部分:
这一部分可以说是Clash的关键:
Clash 是一款用Go 语言编写的、基于规则的隧道(Tunnel )程序,它支持多种加密通信协议和跨平台
Rule:
- DOMAIN-SUFFIX,google.cn,DIRECT
此句定义了一个规则:
DOMAIN-SUFFIX:按域名前缀匹配,此处即”*.google.cn”
DIRECT:直连
- DOMAIN-KEYWORD,twitter,自选
DOMAIN-KEYWORD:以关键词匹配,本例中匹配“twitter”(即凡是遇到twitter都走“自选”)
- USER-AGENT,niconico*,自选
USER-AGENT:用useragent字符串进行匹配;(在本例中凡是遇到有niconico就走“自选”)
- DOMAIN,www.flash.cn,REJECT
DOMAIN:对www.flash.cn精准匹配
REJECT:拒绝连接
- IP-CIDR,91.108.4.0/22,LowDelay,no-resolve
IP-CIDR:此句为CIDR语法
,可以使用此计算器来确定范围。
no-resolve:告诉Clash不要去尝试解析来匹配这条规则,只处理「直接IP 访问」的请求。
- MATCH,Final
该句只能放在末尾,指定漏网之鱼该走哪个代理。
通过结合以上内容可以很方便的拉出来一份代理清单。
Such As Telegram:
- DOMAIN-SUFFIX,t.me,PROXY
- DOMAIN-SUFFIX,tlanyan.me,PROXY
- DOMAIN-SUFFIX,tdesktop.com,PROXY
- DOMAIN-SUFFIX,telegra.ph,PROXY
- DOMAIN-SUFFIX,telegram.me,PROXY
- DOMAIN-SUFFIX,telegram.org,PROXY
- DOMAIN-SUFFIX,telesco.pe,PROXY
- IP-CIDR,91.108.4.0/22,PROXY,no-resolve
- IP-CIDR,91.108.8.0/22,PROXY,no-resolve
- IP-CIDR,91.108.12.0/22,PROXY,no-resolve
- IP-CIDR,91.108.16.0/22,PROXY,no-resolve
- IP-CIDR,91.108.56.0/22,PROXY,no-resolve
- IP-CIDR,149.154.160.0/20,PROXY,no-resolve
- IP-CIDR,2001:b28:f23d::/48,PROXY,no-resolve
- IP-CIDR,2001:b28:f23f::/48,PROXY,no-resolve
- IP-CIDR,2001:67c:4e8::/48,PROXY,no-resolve
规则解释
- DOMAIN-SUFFIX:域名后缀匹配
- DOMAIN:域名匹配
- DOMAIN-KEYWORD:域名关键字匹配
- IP-CIDR:IP段匹配
- SRC-IP-CIDR:源IP段匹配
- GEOIP:GEOIP数据库(国家代码)匹配
- DST-PORT:目标端口匹配
- SRC-PORT:源端口匹配
- MATCH:全匹配(一般放在最后)
额外支持特定的字段:
- cfw-latency-timeout:延迟测试超时时间(毫秒),默认3000
- cfw-latency-url:延迟测试URL,默认http://www.gstatic.com/generate_204
- cfw-bypass:系统代理绕过域名或地址,参考 绕过系统代理
- cfw-conn-break-strategy: 切换节点后或切换配置文件后打断连接
- cfw-profiles-path: 自定义 profiles 目录路径 (beta)
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。