zhongfly / blog

https://blogsue.vercel.app/#/
9 stars 2 forks source link

Clash使用说明 #8

Open zhongfly opened 3 years ago

zhongfly commented 3 years ago

本文试图用尽量简单的语言,向有理解能力的读者介绍clash的使用,但并不能保证每位读者都可以完全理解。 我十分希望读者有基础的英语阅读水平,用于阅读所涉及工具的文档。 我给出的一些定义或者解释并不完全正确,但力图在不犯错误的前提下简单介绍。

前言

我希望正在阅读的您,知道机场/节点/代理协议这些基础的概念。本文的介绍有一定的局限,因为我只在windows及android平台上使用过clash类软件。

有时我会使用引用格式(就像现在这样),来提供一些背景知识或者额外的提示

Clash是什么

Clash从狭义上来讲是仅指Clash内核的,它是一个支持多种代理协议的代理客户端,它可以在多个平台直接运行以提供本地代理服务;从广义上讲,所有使用Clash内核的代理软件统称为Clash,在后文中需要强调区别时我会使用 Clash类软件来称呼,由于Clash内核是命令行工具(CLI),直接使用的话并不方便,所以诞生了各种图形界面软件(GUI),它们大大简化了Clash的使用。

细心的人可能注意到了,我对Clash的定位是代理客户端,人们(用户)在自己的设备上运行这些软件来使用代理,而不是运行在服务器上为用户提供各种代理协议的服务端(机场主使用的)。打个比方,厨师(提供服务的人)用锅铲炒菜给客人吃,锅铲是“服务端软件”,它用于给食客提供服务(菜品),食客(客户)用筷子和碗吃饭菜,筷子和碗是“客户端软件”,是使用服务的工具。例如shadowsocks就是一种代理协议,同时还提供了相应的专用客户端如shadowsocks-windowsshadowsocks-android,而用于提供shadowsocks代理服务的服务端有shadowsocks-libev

但我依然希望大家严格区分Clash内核与它的图形界面软件,图形界面软件只是帮助大家使用Clash内核而已,为Clash内核套上了方便操作的“控制面板”,是Clash内核在干活、帮你把流量发给节点。假如你希望Clash支持某种代理协议,那你应该等待Clash内核支持这种代理协议。

图形界面软件只是好看的“外皮”,是帮你给Clash内核下命令的秘书/监工,Clash内核才是默默干活的打工人

目前,常用的图形界面有Clash for Windows(支持windows/macOS)、Clash For Android(Android)等

Clash的最大特点就是用一个文件来保存所有配置,包括所有节点、策略组、分流规则等,这使得任何一个Clash类软件都可以在导入相同的配置文件后,就导入了所有的设置(节点、策略组、分流规则等)并且获得几乎相同的代理体验。

另一个主要特点就是分流,如同一名娴熟的分拣机器人将进入Clash的流量按规则分到不同的流量出口(例如直连/代理节点A/代理节点B等),你可以增加合适的规则使国内网站全部不走代理,同时让 Netflix的流量 自动使用支持NF解锁的代理节点A,让 disney+ 使用支持disney+解锁的代理节点B,并且其余普通境外网站自动走另一个代理节点C。

之前的代理客户端如shadowsocks-android,在同一个时间只能使用一个节点,例如你选中了节点A,你不再次手动更改的话它就会一直使用A节点,对流量的分流处理只有2种:1)不走你使用的节点,即直连;2)走你使用的节点,即代理。简而言之是个二元判断题:是/否。新一代的代理客户端分流更加详细,是个选项众多的选择题,可以详细控制哪个网站具体走哪一个节点或者走直连,同时使用多个节点也是可能的。

Clash的版本

Clash是开源项目,依据公开的项目源码,编译得到的是开源版内核。 但作者有部分增强功能的代码并不愿意公开,开源版内核+增强功能=premium内核,一般称之为闭源版内核或者P核,下载地址固定为https://github.com/Dreamacro/clash/releases/tag/premium 不变。 premium内核中增加的功能有TUN(虚拟网卡,实现系统全局代理)、Script(使用python3语言,通过编程的方式自定义分流)、Script Shortcut(在rule模式里使用Script类型的分流规则)、Rule Providers(引用外部的规则)、Tracing。 对应大部分用户,开源内核已经可以满足需求。

Clash的分流逻辑

Clash有3种常用分流模式,1)direct,即所有进入Clash的流量都是走直连;2)global,全局,即所有进入Clash的流量都是走某个特定出口,例如直连、xx代理节点;3)rule,规则模式,即我们常用的基于规则进行分流。 还有一种使用门槛较高的Script模式(premium内核才有的功能),请自行研究学习

我强调了Clash的分流只是处理进入Clash的流量,一个软件的流量如果压根不进入Clash的话,当然无法被Clash分流。因此Clash中的“全局”模式只是指Clash所有的流量都全走一个出口,Clash里的全局而已

使用clash时的流量走向图: 流量走向图

Clash的规则

规则模式是基于规则进行分流,一个规则包括条件满足条件的流量该去哪。 规则有优先级区别,上一行的规则优先于底下所有行的规则

我们可以把clash看成是一个分拣邮件的机器人,它按照我们告诉它的规则,来把流量送到不同的地方去

它阅读规则时,从上往下按顺序检查流量到底满足哪条规则,”第1条规则匹配吗?不匹配;第2条规则匹配吗?不匹配……第x条规则匹配吗?匹配!“,于是按照第x条规则,把流量送到指定的出口

条件有很多种类型,比如域名、ip地址、端口、流量来源的程序名等,我们就以最简单的规则为例简单介绍

DOMAIN-SUFFIX,google.com,proxy-group-A

用英文逗号分隔成3部分,第一个部分是规则的类型:DOMAIN-SUFFIX,即匹配域名后缀的规则,具体条件是google.com,结合类型,即域名后缀是google.com的网站流量就会命中此规则,第三部分就是流量命中规则的去向,此处是proxy-group-A即代理组A。这条规则的意思就是“域名后缀是google.com的网站流量会走代理组A中的节点”,至于具体是代理组A中的哪个节点,就由代理组A自己来决定。

总结:规则将流量分配到指定的代理组或直连/拒绝连接,代理组会根据不同的策略来选择流量具体走某个节点。

代理组是许多个具有相同特征的节点们的集合,例如你可以把日本地区的节点都放在同一个代理组里,然后命名为日本节点组。

下面介绍常用的规则类型

域名类型的规则

  1. DOMAIN 域名和规则中的域名完全相同时,就匹配该规则。 例:DOMAIN,ad.com,REJECT 流量的域名是ad.com时匹配该规则,如果域名是addddd.comaaaaad.comwww.ad.comad.com.cn都是不匹配的 可以看出,这个规则的覆盖范围太小,适合精确匹配某些特殊的域名。如果只使用这种规则,面对多种情况,需要用多个精确的域名来匹配,很容易导致规则过长,影响可读性。

  2. DOMAIN-SUFFIX 域名后半部分(后缀)和规则中的域名完全相同时,就匹配该规则。 例:DOMAIN-SUFFIX,ad.com,REJECT 流量的域名是ad.comwww.ad.com666.ad.com时都匹配该规则,如果域名是addddd.comaaaaad.comad.com.cn都是不匹配的

  3. DOMAIN-KEYWORD 只要域名包含规则中的字符(或者称为关键词)时,就匹配该规则。 例:DOMAIN-KEYWORD,ad,REJECT 流量的域名是ad.comadddddd.comaaaad.comwww.ad.comad.com.cn都是匹配的,因为它们都包含关键词ad;假如域名是a666d.com,则不匹配 可以看出,这个规则的覆盖范围太广,有可能误杀无关域名,建议谨慎使用

GEOIP规则

根据ip所属的国家/地区来分流 例:GEOIP,CN,DIRECT 把ip属于国家/地区代号为CN(即中国)的流量,使用直连

MATCH

最特殊的规则,它是必须有的规则,必须在规则的最末尾,意思是,如果上面的所有规则都不匹配,那就按这条规则分流 例:MATCH,DIRECT 如果所有规则都不匹配,那么这个流量就直连

阅读文档,了解更多类型的规则官方wiki 第三方wiki详细解释

Clash的代理组

待完成

Clash配置中的一些重要设置

待完成