z1645444

这篇博文是针对 CFW 写的。

最近尝试从 v2 转向使用 Clash。基于一个简单的需求:用 Spotify 听专的时候用代理,用 AM 听专的时候直连,我参考了以下完成了我的规则:

  1. CFW 官网的说明;
  2. github 上别人提供的规则;
  3. 订阅提供的简陋规则。

首先要确认订阅提供的规则是否是使用 YAML 完成,因为在完成规则的过程中,我在某个 issue 下发现可能会因为订阅提供的规则不是用 YAML 完成,而我是用 YAML 写的,最后可能导致配置无效,以及可能导致 CLash 核心无法正常运作。倘若这个最坏的情况已经发生,其实处理起来并不麻烦:

  1. 在 CFW 中找到 Settings - Parsers,将原先你新增的所有行都删除或注释,仅剩下第一行 parsers:(不剩下也不影响);
  2. 删除 ~/.config/clash/ 目录下的 config.yaml、Country.mmdb 两个文件;
  3. 重新打开 Clash。

~/.config/clash/ 目录存放的是 Clash 的配置文件。启用 Clash 主要的两个文件是 config.yamlprofiles/xxxx.yaml

  • config.yaml:主要存在字段为 mixed-portallow-lanlog-level,它们与 CFW 主页配置相对应;
  • profiles/xxxx.yaml:命名由 Clash 控制,命名方法是使用时间戳,文件里写的是订阅推送的地址和部分规则。主要存在字段为 proxiesproxy-groupsrules
    • proxies 数组是订阅推送的服务器信息;
    • proxy-groups 数组重新按组整理了 proxies 中的服务器,并显示在 GFW 应用的 Proxies 页面中,数组成员的 name 待会儿配置的过程中会用到;
    • rules 数组存放的就是规则集,通常订阅的推送中存放的比较简陋,所以才需要下面的 rule-providers
    • rule-providers 数组中的成员可以通过网络下载 YAML 文件,存放在指定的路径下并读取,然后添加在 rules 数组的前面(append-rules)、后面(prepend-rules)。

配置的主要完成工作是在 Settings - Profiles - Parsers 这儿完成。首次点击 Parsers 弹出来的 CFW 自带的编辑器中,仅仅只有一行:

parsers: # array

配置工作也就从这里开始。

YAML 的语法非常简单,不必阅读 YAML 的语法教程或者对其他资料序列化语言有过编写经历,看一眼别人写的成品其实就能马上理解如何更改和书写。经过简单的一番配置后,大致如下:

parsers:
  - url: 订阅链接
    yaml:
      prepend-rules:
        - DOMAIN-SUFFIX,cn.bing.com,DIRECT
        - DOMAIN-SUFFIX,mirrors.ustc.edu.cn,DIRECT
        - DOMAIN-SUFFIX,mirrors.tuna.tsinghua.edu.cn,DIRECT
        - PROCESS-NAME,iTunes,DIRECT
        - MATCH,proxy-groups->name

      mix-rule-providers: 
        reject:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
          path: ./ruleset/reject.yaml
          interval: 86400

上面的 YAML 语句块就是规则。

  • - url 指定订阅链接,根据订阅链接进行匹配,每次更新订阅都会针对这个匹配上的订阅,在原有的规则上再附加你自定义的规则;

  • yaml 附加规则使用语言

  • prepend-rules 在订阅推送的规则数组之前,加入你自定义的规则;若是想添加在推送的规则数组之后,那么可以使用 append-rules;这类字段的每个成员都由两个逗号进行了切分。例如 - DOMAIN-SUFFIX,mirrors.ustc.edu.cn,DIRECTDOMAIN-SUFFIX 是规则类型,mirrors.ustc.edu.cn 是受约束的目标,DIRECT 是连接策略。根据这单个规则,就可以写下无数规则。

    • 规则类型如下:
    字段 含义
    DOMAIN-SUFFIX 域名后缀匹配
    DOMAIN 域名匹配
    DOMAIN-KEYWORD 域名关键字匹配
    IP-CIDR IP 段匹配
    SRC-IP-CIDR 源 IP 段匹配
    GEOIP GEOIP 数据库(国家代码)匹配
    DST-PORT 目标端口匹配
    SRC-PORT 源端口匹配
    PROCESS-NAME 源进程名匹配
    RULE-SET Rule Provider 规则匹配
    MATCH 全匹配
    • 连接策略如下:
    字段 含义
    DIRECT 不走订阅直接连接
    REJECT 拒绝连接
    PROXIE(proxy-group 中的 name) 走订阅
  • mix-rule-providers 提供自定义规则的来源网址和文件,和 rule-providers 是同样的概念,加上 mix- 前缀后,可以与订阅提供的 rule-providers 合并,而不是覆盖

日常访问和未来可能要访问的网站实在太多,如果所有规则都手工整理会比较麻烦,所以可以通过 rule-providers 使用其他人写好的规则作为基础,在上面继续添加。我是以这个仓库作为基础的,大部分人应该也是以这个仓库的规则作为基础。

当我配置完后大致如下:

parsers:
  - url: XXX.com
    yaml:
      prepend-rules:
        - PROCESS-NAME,iTunes,DIRECT
        - PROCESS-NAME,spotify,Nice Cloud
        - PROCESS-NAME,ESurfingClient,DIRECT
        - DOMAIN-SUFFIX,cn.bing.com,DIRECT
        - DOMAIN-SUFFIX,mirrors.ustc.edu.cn,DIRECT
        - DOMAIN-SUFFIX,mirrors.tuna.tsinghua.edu.cn,DIRECT
        - RULE-SET,applications,DIRECT
        - DOMAIN,clash.razord.top,DIRECT
        - DOMAIN,yacd.haishan.me,DIRECT
        - RULE-SET,private,DIRECT
        - RULE-SET,reject,REJECT
        - RULE-SET,icloud,DIRECT
        - RULE-SET,apple,DIRECT
        - RULE-SET,google,DIRECT
        - RULE-SET,proxy,Nice Cloud
        - RULE-SET,direct,DIRECT
        - RULE-SET,lancidr,DIRECT
        - RULE-SET,cncidr,DIRECT
        - RULE-SET,telegramcidr,Nice Cloud
        - GEOIP,LAN,DIRECT
        - GEOIP,CN,DIRECT
        - MATCH,Nice Cloud

      mix-rule-providers: 
        reject:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
          path: ./ruleset/reject.yaml
          interval: 86400

        icloud:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/icloud.txt"
          path: ./ruleset/icloud.yaml
          interval: 86400

        apple:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/apple.txt"
          path: ./ruleset/apple.yaml
          interval: 86400

        google:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/google.txt"
          path: ./ruleset/google.yaml
          interval: 86400

        proxy:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
          path: ./ruleset/proxy.yaml
          interval: 86400

        direct:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
          path: ./ruleset/direct.yaml
          interval: 86400

        private:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/private.txt"
          path: ./ruleset/private.yaml
          interval: 86400

        gfw:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/gfw.txt"
          path: ./ruleset/gfw.yaml
          interval: 86400

        greatfire:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/greatfire.txt"
          path: ./ruleset/greatfire.yaml
          interval: 86400

        tld-not-cn:
          type: http
          behavior: domain
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/tld-not-cn.txt"
          path: ./ruleset/tld-not-cn.yaml
          interval: 86400

        telegramcidr:
          type: http
          behavior: ipcidr
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/telegramcidr.txt"
          path: ./ruleset/telegramcidr.yaml
          interval: 86400

        cncidr:
          type: http
          behavior: ipcidr
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/cncidr.txt"
          path: ./ruleset/cncidr.yaml
          interval: 86400

        lancidr:
          type: http
          behavior: ipcidr
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/lancidr.txt"
          path: ./ruleset/lancidr.yaml
          interval: 86400

        applications:
          type: http
          behavior: classical
          url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/applications.txt"
          path: ./ruleset/applications.yaml
          interval: 86400

由于访问 raw.githubusercontent.com 可能会受到严重的网络波动影响,导致没法访问,不能正常获取,所以可以手动访问所有的 url,然后将内容存入对应的 xxx.yaml 文件中,放到对应的 ./ruleset/ 目录下,也就是 ~/.config/clash/ruleset/ 下。ruleset/ 这个文件夹第一次装 Clash 是没有的,需要自己创建。

至此,打开 Clash,点击 Profiles 里的订阅的更新以后,规则就添加到订阅里了。

分类:

中篇

技术点:

相关文章:

  • 2022-12-23
  • 2021-05-10
  • 2022-12-23
  • 2021-05-07
  • 2021-10-11
  • 2022-01-31
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-22
  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2022-01-08
  • 2021-10-10
  • 2022-12-23
相关资源
相似解决方案