最近更新: 二〇二四年十二月三日

Wiki

内核区别

这部分看看就好,知道了也没什么用

原版内核分开源和闭源两个版本,开源能用,但闭源支持 Rule-set Tun 两大功能,目前已经停止维护一年多了。

Meta 内核改名了,并且也是唯一一个仍然在维护的版本。

由于太长时间没有维护了目前只推荐使用 Meta,除非遇到什么奇怪的问题。
Meta 版本对于 FreeBSD 支持并不好也不在 ports 源内, 并且可见的未来作者也不会修复 BSD 系的问题, 因为没人用.
配置文件方面原本 Meta 可以看作是原版的超集, 但是经过版本迭代最新版的已经不能够直接使用原版配置了.

By the way, I use Arch Linux.

适用对象

  • 爱折腾的人
  • 不满足订阅自带配置的人
  • 有进阶需求的人

如果你只是想简单了解一下的话, 那这个原版 clash.wiki 可能更适合你!
另外再说一句, 网上的相关文章很多都是过时的, 如果上次编辑还是 2022 年那么其实已经不适用现在的新版本了.

对于 iptable 和路由表的修改其实可以两行配置自动完成, 没有特殊需求直接打开就好了.
这些修改操作在其他博客中常见, 但是新版本里是不需要这样做的. 这里指的新版本是取消了 redir-host 的较新版本.

在经历过前后数次更换网络方案, 最终回归了 All in clash. 最多的时候是用了总共四个软件来处理, 其他软件只负责 DNS 部分.
其他软件的缺点其实很明显, 有的是懒于维护默认配置居然会不可用, 有的是不够智能或者功能鸡肋.

没有特殊说明后续所有操作都是在 Arch Linux 环境下进行的。

配置

这里只是一份现成可用的配置, 并不包含全部功能. 如果需要更多功能应该去看 Meta Wiki.

说明

配置文件采用 YAML 语法, 有两种常见写法: Block-style & Flow-style. 一般来说订阅部分采用流式, 而其他部分的配置是块式方便阅读.
这一点在 Meta 文档中有着更详细的介绍, 有兴趣可以去看看.

# 来自 Meta 的示例
tun: { enable: true, stack: system, auto-route: true, auto-detect-interface: true }
tun:
  enable: true
  stack: system
  auto-route: true
  auto-detect-interface: true

核心配置

下面会再对部分配置详细说明, 同时可以结合 Clash.Meta Docs 来看.

# mixed-port: 1080 # HTTP(S) & SOCKS mix proxy port
port: 7890 # HTTP and HTTPS
socks-port: 7891 # SOCKS5
# redir-port: 7892 # Redirect TCP and TProxy UDP (For Linux & MacOS only)
# tproxy-port: 7893 # TProxy TCP and TProxy UDP
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: 10.0.0.1:9999
secret: kazusa.cc
external-ui: dashboard # 访问 http://{{external-controller}}/ui 管理
profile: { store-selected: true, store-fake-ip: false, tracing: false }
interface-name: bond0
tun:
  enable: true
  stack: system
  auto-route: true # 自动添加路由表
  auto-redir: true # 自动配置 nftable 重定向
  # auto-detect-interface: true # 自动识别出口网卡
  dns-hijack: # 劫持, 请求这些 DNS 会返回 clash 的解析结果
    - 8.8.8.8:53
    - 223.5.5.5:53
hosts:
  router.kazusa.cc: 10.0.0.1
  dl.kazusa.cc: 10.0.0.1
  gallery.kazusa.cc: 10.0.0.1
  touma.kazusa.cc: 10.0.0.1
dns: # https://dns.google/
  enable: true
  ipv6: true
  listen: 0.0.0.0:53
  use-hosts: true
  enhanced-mode: fake-ip
  fake-ip-range: 199.6.0.1/16 # TUN CIDR lake
  fake-ip-filter: # 白名单, 返回真实 IP
    - +.kazusa.cc
    - localhost.sec.qq.com
    - localhost.ptlogin2.qq.com
    - +.msftconnecttest.com
  default-nameserver: # 只用于解析使用域名的 DNS 服务器
    - 121.4.4.79
    - 121.4.4.205
    - tls://223.5.5.5:853
    - tls://8.8.8.8:853
  nameserver: # 国内 DNS
    - https://dns.alidns.com/dns-query
    - tls://dns.rubyfish.cn
  nameserver-policy: # 指定特定域名使用的 DNS
    v2ex.com: https://1.1.1.1/dns-query
    +.cloudfront.net: https://1.1.1.1/dns-query
  fallback: # 国外 DNS, 和上面的并发查询
    - tls://1.0.0.1:853
    - tls://1.1.1.1:853
    - https://dns.google/dns-query
    - https://doh.opendns.com/dns-query
    - https://dns.nextdns.io/dns-query
    - tls://8.8.4.4:853
    - tls://8.8.8.8:853
    - https://cloudflare-dns.com/dns-query
    - https://1.0.0.1/dns-query
    - https://1.1.1.1/dns-query
    # - https://dns.twnic.tw/dns-query
    # - dhcp://eno1
  fallback-filter: # GEO 不为 CN 时使用 fallback 解析结果
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4
      - 127.0.0.1/8
      - 0.0.0.0/32
    domain:
      - +.google.com
      - +.twitter.com
      - +.youtube.com
      - +.googleapis.com

如果需要使用 script 模式, 请看这个: https://lancellc.gitbook.io/clash/clash-config-file/script
一是实在没什么人用, 二是这意味着有更特殊的需求 (例如在软路由实现定时封禁某些网站等).

script 模式在 Meta 中不可用

规则配置

rule-providers:
  Google: {type: http, behavior: domain, url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt", path: ./ruleset/google.yaml, interval: 259200}
  TLD-NOT-CN: {type: http, behavior: domain, url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt", path: ./ruleset/tld-not-cn.yaml, interval: 259200}
  GFW: {type: http, behavior: domain, url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt", path: ./ruleset/gfw.yaml, interval: 259200}
  CN-CIDR: {type: http, behavior: ipcidr, url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt", path: ./ruleset/cncidr.yaml, interval: 259200}
  MyRules: {type: file, behavior: classical, path: ./ruleset/myrules.yaml}

rules:
  # 内网网段 IP
  - IP-CIDR,10.0.0.0/8,DIRECT
  - IP-CIDR,100.64.0.0/10,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,169.254.0.0/8,DIRECT
  - IP-CIDR,172.16.0.0/12,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,224.0.0.0/3,DIRECT
  - IP-CIDR6,::1/128,DIRECT
  - IP-CIDR6,fc00::/7,DIRECT
  - IP-CIDR6,fe80::/10,DIRECT
  - IP-CIDR6,fd00::/8,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - GEOIP,LAN,DIRECT,no-resolve
   # OpenAI
  - DOMAIN-SUFFIX,openai.com,GPT
  - DOMAIN-SUFFIX,auth0.com,GPT
  - DOMAIN-SUFFIX,sentry.io,GPT
  - DOMAIN-SUFFIX,bing.com,GPT
  - DOMAIN-SUFFIX,live.com,GPT
  # Steam 登录 / 下载
  - DOMAIN-SUFFIX,steamserver.net,PROXY
  - DOMAIN-SUFFIX,cm.steampowered.com,PROXY
  # Steam 商店 / 社区
  - DOMAIN,steambroadcast.akamaized.net,PROXY
  - DOMAIN,steamcdn-a.akamaihd.net,PROXY
  - DOMAIN,steamcommunity-a.akamaihd.net,PROXY
  - DOMAIN,steampipe.akamaized.net,PROXY
  - DOMAIN,steamstore-a.akamaihd.net,PROXY
  - DOMAIN,steamusercontent-a.akamaihd.net,PROXY
  - DOMAIN,steamuserimages-a.akamaihd.net,PROXY
  - DOMAIN-SUFFIX,fanatical.com,PROXY
  - DOMAIN-SUFFIX,humblebundle.com,PROXY
  - DOMAIN-SUFFIX,playartifact.com,PROXY
  - DOMAIN-SUFFIX,steam-chat.com,PROXY
  - DOMAIN-SUFFIX,steamcommunity.com,PROXY
  - DOMAIN-SUFFIX,steamgames.com,PROXY
  - DOMAIN-SUFFIX,steampowered.com,PROXY
  - DOMAIN-SUFFIX,steamstat.us,PROXY
  - DOMAIN-SUFFIX,steamstatic.com,PROXY
  - DOMAIN-SUFFIX,underlords.com,PROXY
  - DOMAIN-SUFFIX,valvesoftware.com,PROXY
  # Ads
  - DOMAIN-SUFFIX,tt.cn,REJECT
  - DOMAIN-SUFFIX,beizi.biz,REJECT
  - DOMAIN-SUFFIX,tpstelemetry.tencent.com,REJECT
  # 规则集
  - RULE-SET,MyRules,DIRECT
  - RULE-SET,Google,PROXY
  - RULE-SET,TLD-NOT-CN,PROXY
  - RULE-SET,GFW,PROXY
  - RULE-SET,CN-CIDR,DIRECT,no-resolve
  # 兜底规则
  - MATCH,PROXY

配置详解

  • profile.*: 缓存和性能监控相关, 一般无需在意.
  • interface-name: 指定流量出口也就是 WAN 口, 和 tun.auto-detect-interface 冲突.
  • tun.dns-hijack: 劫持指定的 DNS, 一般来说最低限度是劫持 LAN 口的 53 端口. 默认不劫持私有地址如 127.0.0.1. 因为很多情况下默认 DNS 是 223.5.5.5 和 8.8.8.8 所以最好填上. 也可以用 any:53 劫持全部的.
  • dns.default-nameserver: 只能填 IP 格式, 可以使用加密 DNS. 唯一的作用是拿来解析域名格式的 DNS 例如 https://dns.twnic.tw/dns-query
  • dns.nameserver-policy: 针对某些特殊域名使用特定 DNS, 例如我发现 v2ex 就有些问题.
  • dns.fallback: 回退策略, 指定的 IP 段和域名将使用这里的解析结果.
  • rule-providers: 没什么好说的, 绝大部分人是直接从 https://github.com/Loyalsoldier/clash-rules CV 过来用的.
  • rules: 同上, 常用的是匹配有 DOMAIN GEOIP CIDR IPSET RULE-SET 但其实还有 SRC-IP-CIDR SRC-PORT DST-PORT 但应用场景比较少.

关于规则部分可以说懂的自然懂, 不懂的也不需要.

最后是 SCRIPT 模式, 相关资料非常少并且在 Meta 中不可用, 看看就好.

script: # https://lancellc.gitbook.io/clash/clash-config-file/script
  engine: expr
  shortcuts:
    quic: network == 'udp' and dst_port == 443
  code: |
    def main(ctx, metadata):
      ip = metadata["dst_ip"]
      if ip == "":
        return "PROXY"

      for name in ['Google', 'TLD-NOT-CN']:
        if ctx.rule_providers[name].match(metadata):
          ctx.log('[Script] matched %s' % name)
          return "PROXY"
      return "PROXY" # default policy for requests which are not matched by any other script

最后

我们怀念他