关于 clash

一只蓝色小猫咪, 本质是集成各种不同主流协议的合集.
知名开源项目, 也有很多不同版本的.
项目地址: https://github.com/Dreamacro/clash
我用的貌似是闭源版的 Clash Premium

配置

既然会讲这个, 肯定不是开箱即用的那种配置. 直接讲讲我碰到的坑吧!
下面这些都是直接写在最外层的, 不存在嵌套到某个节点里面
首先是常规的端口和模式配置, 端口应该不会冲突, 然后打开局域网连接. 这样就可以愉快的让其他设备走同一台机器出去不用再开一次了.

port: 7890
socks-port: 7891
allow-lan: true

然后是面板端口和密钥了, 我这个端口的写法相当于 0.0.0.0:9090, 由于一些奇奇怪怪的原因, 我打开了密钥设置后才连上也就没管能不能关掉了.
这个端口是拿来给前端网页交互做后端接口的, 比如可以用这个 PWA 网站来进行管理 https://clash.razord.top/

默认本机 127 连接是不需要密钥的, 如果没需求空着完全没问题
external-controller: :9090
secret: 'kazusa.cc'

接下来是重要的 host
我用这里的域名配置来做内网 DNS 解析, 也可以拿来进行简单的网页劫持
因为自签证书太麻烦了, 我灵机一动嫖服务器的证书来用就行了, 然后就成这个样子了
其中精准域名匹配优先级要比通配符更高
坑点: 我是拿 Lan 口的 IP 来用的, 也就是说如果没插电脑这个 IP 都不存在(似乎是 DHCPD 程序抽风造成的); 这里的域名在后面的匹配规则里要一直走直连, 否则直接走代理出去了.

hosts:
  'server.kazusa.cc': 10.0.0.1
  'win.kazusa.cc': 10.0.0.1
  'linux.kazusa.cc': 10.0.0.1
  'router.kazusa.cc': 10.0.0.1

一些没什么可搞的配置后就到了规则匹配了

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

  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

然后是补充, 可以看到前面的匹配模式有几种, 中间是匹配规则最后是对应的策略.
其中默认策略只有 DIRECT 和 REJECT 两种, 其他的全部为自定义.
特别的, 最后一条作为兜底没有中间部分表示全部匹配.

rules:
  - DOMAIN-KEYWORD,baidu,REJECT
  - DOMAIN,github.com,PROXY
  - DOMAIN-SUFFIX,kazusa.cc,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

最后

使用体验有点糟糕, 而且挂着时间长了会出问题. 目前是设置定时任务来重启解决的, 但我也不能把握他的抽风频率.
而且按理来说我的域名应该会走 GEOIP 直连才对, 结果莫名其妙的在 clash 本机上无法访问但是下游机器又正常..... 于是又特别写了一条直连规则, 这样匹配优先级更高可以覆盖前面不知道哪里匹配到的策略.