前言

经常看到有朋友苦恼clash的订阅规则问题。由于机场的订阅规则并不能完全满足自己的要求,因此自己通常会修改配置文件加上自己的规则。然而当使用机场订阅配置时,自动更新之后会覆盖掉自己配置的规则,又需要重新更改,非常麻烦。今天又看到有朋友在吐槽:

https://www.v2ex.com/t/838078

clash 我一直有个痛点,机场的一键订阅都是直接下载一个配置文件,然后我自己又会定义一套规则,我想在自己定义的规则里引用机场配置文件的 proxy ,这样就能既保持机场 proxy 配置自动更新,又能符合自己的需求。 但是 clash 好像用不了多个配置文件,也就不能在一个配置文件里引用另一个配置文件的 proxy 了,不知道有没有解决方案。

实际上clash在Premium版本中已经提供了proxy-providers的功能,能够完美的解决这个问题。

原理

嫌麻烦的可以直接看后面的配置文件。

proxy-providers是提取指定URL或者指定文件中的proxies字段中的所有内容,即指提取订阅节点的信息,到当前文件中供我们使用。一下内容翻译自官方文档https://github.com/Dreamacro/clash/wiki/configuration#proxy-providers

proxy-providers为用户提供动态加载代理服务器列表的能力,而不是将它们硬编码到配置文件中。目前有两个来源的proxy-providers加载服务器列表:

http:冲突在启动时从指定的URL加载服务器列表。如果设置了interval选项,则冲突定期从远程拉取服务器列表。
file:冲突在启动时从文件系统的指定位置加载服务器列表。
运行状况检查可用于这两种模式,其工作方式与代理组中的fallback完全相同。服务器列表文件的配置格式也与主配置文件完全相同:

proxy-providers的格式为

proxy-providers:
  jichang1: # provider的名称,后期会用到
    type: http
    path: ./profiles/1626513136686.yml # 保存在本地文件的名字,可以随便取
    url: https://XXXX  # 机场给你的订阅链接
    interval: 36000 # 每36000秒更新一次订阅
    health-check:
      enable: true  # 是否自动进行latency-test
      url: http://www.gstatic.com/generate_204
      interval: 3600
      
  jichang2: # 我们可以同时使用多个订阅链接获取多个proxies
    type: http
    path: ./profiles/1626513136686.yml # 保存在本地文件的名字,可以随便取
    url: https://XXXX  # 机场给你的订阅链接
    interval: 36000 # 每36000秒更新一次订阅
    health-check:
      enable: true  # 是否自动进行latency-test
      url: http://www.gstatic.com/generate_204
      interval: 3600

这样我们就可以在后面使用

proxy-groups:
  - name: Proxies
    type: select
    use:              # 注意,这里是use而不是普通的proxies
      - jichang1      # 这里就是上面proxy-providers中定义的名称
      - jichang2

经过上面两个步骤之后,我们就可以在自己定义的配置文件中使用机场提供的节点了,规则完全由我们自己来制定。每次更新只会获取到节点信息,不会覆盖我们本地写的规则。

类似的,也有rule-providers的功能。从指定url处获取别人提供的规则,而不用自己来制定。

使用方法

  1. 在clash的配置文件夹中创建一个新的文件,并把下面的内容复制进去。
  2. 替换proxy-providers中的url为自己的订阅链接。
  3. 在clash中选择使用这个配置文件。
mixed-port: 7890
#---------------------------------------------------#
## 更新:2020-07-11 10:36:22
## 感谢:https://github.com/Hackl0us/SS-Rule-Snippet
#---------------------------------------------------#


# Linux 和 macOS 的 redir 代理端口
redir-port: 7892

# 允许局域网的连接
allow-lan: true

# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
mode: rule

# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
log-level: info
# Clash 的 RESTful API
external-controller: '0.0.0.0:9090'

# RESTful API 的口令
secret: ''

dns:
  enable: true
  ipv6: true
  listen: '0.0.0.0:53'
  use-hosts: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 202.120.224.6
    - 114.114.114.114
    - 223.5.5.5
    - 'tcp://223.5.5.5'
  fallback:
    - 'tls://223.5.5.5:853'
    - 'https://223.5.5.5/dns-query'
  fallback-filter:
    geoip: true
    ipcidr:
      - 240.0.0.0/4
# proxy provider start here
proxy-providers:
  jichang1:
    type: http
    path: ./profiles/1626513136686.yml
    url: https://XXXX
    interval: 36000
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 3600
  jichang2:
    type: http
    path: ./profiles/1626513102225.yml
    url: https://XXX
    interval: 36000
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 3600

  jichang3: 
    type: http
    path: ./profiles/1642516276761.yml
    url: https://XXXX
    interval: 36000
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 3600


# proxy provider end
proxies:
    # socks5
  - name: windowsServer
    type: socks5
    server: 10.127.78.177
    port: 7890
    # username: username
    # password: password
    # tls: true
    # skip-cert-verify: true
    # udp: true

  - {name: 🇮🇪 中国-爱尔兰 IPLC C04, server: ir04.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  - {name: 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C02, server: hkhe02.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  - {name: 🇮🇪 中国-爱尔兰 IPLC C03, server: ir03.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  - {name: 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C09, server: hkhe09.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  - {name: 🇨🇳 中国-香港 IEPL Equinix HK8 C 02 1Gbps HBO TVB, server: sg12.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB, udp: true}
  - {name: 🇨🇳 中国-爱尔兰 IPLC C05, server: ir05.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB, udp: true}
  - {name: 🇨🇳 中国-香港 IPLC Equinix HK2 C 06 1Gbps HBO TVB, server: sg06.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB, udp: true}

proxy-groups:
  - name: Proxies
    type: select
    proxies:
      - 故障转移
      - 自动选择
      - 机场节点
      - 手动节点
      
  - name: 手动节点
    type: select
    proxies:
      - 🇮🇪 中国-爱尔兰 IPLC C04
      - 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C02
      - 🇮🇪 中国-爱尔兰 IPLC C03
      - 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C09   
      - 🇨🇳 中国-香港 IEPL Equinix HK8 C 02 1Gbps HBO TVB
      - 🇨🇳 中国-爱尔兰 IPLC C05
      - 🇨🇳 中国-香港 IPLC Equinix HK2 C 06 1Gbps HBO TVB
      
  - name: 机场节点
    type: select
    proxies:
     - 机场1
     - 第二个机场
     - 另一个机场
     
     
  
  - name: 机场1
    type: select
    use:
     - jichang1
  
  - name: 第二个机场
    type: select
    use:
     - jichang2


  - name: 另一个机场
    type: select
    use:
     - jichang3

  - name: 故障转移
    type: fallback
    url: 'http://www.gstatic.com/generate_204'
    interval: 7200
    proxies:
     - 机场1
     - 第二个机场
     - 另一个机场


  - name: 自动选择
    type: url-test
    url: 'http://www.gstatic.com/generate_204'
    interval: 300
    use:
      - jichang1
      - jichang2
      - jichang3 
 


rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400

  icloud:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt"
    path: ./ruleset/icloud.yaml
    interval: 86400

  apple:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt"
    path: ./ruleset/apple.yaml
    interval: 86400

  google:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt"
    path: ./ruleset/google.yaml
    interval: 86400

  proxy:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
    path: ./ruleset/proxy.yaml
    interval: 86400

  direct:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400

  private:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt"
    path: ./ruleset/private.yaml
    interval: 86400

  gfw:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
    path: ./ruleset/gfw.yaml
    interval: 86400

  greatfire:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt"
    path: ./ruleset/greatfire.yaml
    interval: 86400

  tld-not-cn:
    type: http
    behavior: domain
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt"
    path: ./ruleset/tld-not-cn.yaml
    interval: 86400

  telegramcidr:
    type: http
    behavior: ipcidr
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt"
    path: ./ruleset/telegramcidr.yaml
    interval: 86400

  cncidr:
    type: http
    behavior: ipcidr
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
    path: ./ruleset/cncidr.yaml
    interval: 86400

  lancidr:
    type: http
    behavior: ipcidr
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt"
    path: ./ruleset/lancidr.yaml
    interval: 86400

  applications:
    type: http
    behavior: classical
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt"
    path: ./ruleset/applications.yaml
    interval: 86400


rules:
 # 这些是自定义规则,想要的可以继续加。
 - DOMAIN-SUFFIX,cnki.net,DIRECT
 - DOMAIN-SUFFIX,ieee.org,DIRECT
 - DOMAIN-SUFFIX,acm.org,DIRECT
 - DOMAIN-SUFFIX,imgtu.com,DIRECT
 - DOMAIN-SUFFIX,dpdk.org,DIRECT
 - DOMAIN-SUFFIX,freenom.com,DIRECT
 - DOMAIN-SUFFIX,sciencedirect.com,DIRECT
 - DOMAIN-SUFFIX,springer.com,DIRECT
 - RULE-SET,applications,DIRECT
 - DOMAIN,clash.razord.top,DIRECT
 - DOMAIN,yacd.haishan.me,DIRECT
 # 下面的规则是通过上面的rule-provider来确定的
 - RULE-SET,private,DIRECT
 - RULE-SET,reject,REJECT
 - RULE-SET,icloud,DIRECT
 - RULE-SET,apple,DIRECT
 - RULE-SET,google,DIRECT
 - RULE-SET,proxy,Proxies
 - RULE-SET,direct,DIRECT
 - RULE-SET,lancidr,DIRECT
 - RULE-SET,cncidr,DIRECT
 - RULE-SET,telegramcidr,Proxies
 - GEOIP,,DIRECT
 - GEOIP,CN,DIRECT
 - MATCH,Proxies
 

附:clash相关概念学习

faik-ip: 来源:https://www.v2ex.com/t/841080

fake-ip 就是,发起连接时,你的 DNS 请求会被 clash 截获然后给你返回个假的 ip ,clash 会在内部记录这个 ip 和请求域名的对应关系。然后应用向这个假的 ip 发送请求的时候,请求会被 clash 截获,clash 通过反查表得到请求域名,然后(如果判定要走代理)把域名封装到某种其他协议然后往代理服务器发送,由代理服务器解析 DNS 。可以一定程度上避免 DNS 污染的影响。