适用对象

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

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

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

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

配置

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

理论上对于其他变种例如 meta 内核同样适用。

说明

配置文件采用 YAML 语法, 有两种常见写法: Block-style & Flow-style. 一般来说订阅部分采用流式, 而其他部分的配置是块式方便阅读.
你可以理解为流式就是写成一行或者说不换行, 块式就是有缩进的多行.

# 来自 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
一是实在没什么人用, 二是这意味着有更特殊的需求 (例如在软路由实现定时封禁某些网站等).

规则配置

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 模式, 太冷门就不写了, 这里给个示例.

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

最后

我们怀念他