Clash 使用

系统代理模式/TUN 模式和全局/分流模式完全是正交的,即下面四种情况都可能出现:

Clash Verge Rev 配置

配置同步情况

GUI 进行配置改动以后,对应的 CVR 配置文件会马上更新,然后给 clash 内核的配置文件也会更新。

CVR 配置文件改动以后,对应的 GUI 配置界面不会更新,给 clash 内核的配置文件也不会更新。

关闭 CVR 的时候,GUI 的配置,会强制写到 CVR 配置文件。

配置文件

Clash Verge Rev 配置文件夹:

~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev
$ ls -al
total 69304
drwxr-xr-x@  18 juhan  staff       576 Dec 22 06:34 .
drwx------+ 108 juhan  staff      3456 Dec 27 09:43 ..
-rw-r--r--@   1 juhan  staff       217 Oct 28 03:15 .window-state.json
-rw-r--r--@   1 root   staff     32768 Jan  1 23:50 cache.db
-rw-r--r--@   1 juhan  staff    200807 Jan  5 21:15 clash-verge-check.yaml
drwxr-xr-x@  21 juhan  staff       672 Jan  1 23:50 clash-verge-rev-backup
-rw-r--r--@   1 juhan  staff    200807 Jan  5 21:15 clash-verge.yaml
-rw-r--r--@   1 juhan  staff       508 Jan  1 23:48 config.yaml
-rw-r--r--@   1 juhan  staff  10341253 Dec 19 16:35 Country.mmdb
-rw-r--r--@   1 juhan  staff       886 May 31  2025 dns_config.yaml
-rw-r--r--@   1 juhan  staff  20521588 Dec 19 16:35 geoip.dat
-rw-r--r--@   1 juhan  staff   4143284 Dec 19 16:35 geosite.dat
drwxr-xr-x@  13 juhan  staff       416 Jan  1 23:48 logs
drwxr-xr-x@  22 juhan  staff       704 Jan  1 23:47 profiles
-rw-r--r--@   1 juhan  staff      4070 Jan  5 22:12 profiles.yaml
drwxr-xr-x@   5 juhan  staff       160 Jan 25  2025 test
-rw-r--r--@   1 juhan  staff      4617 Jan  5 21:15 verge.yaml
-rw-r--r--@   1 juhan  staff       215 Jan  1 23:48 window_state.json

DNS 设置开关和配置文件内容的关系

全局修改脚本

// Define main function (script entry)
function main(config) {

  // 1. 确保开启 GEOSITE/GEOIP 也就是 Meta 内核模式 (防止某些订阅没开)
  config["geodata-mode"] = true;
  config["geodata-loader"] = "standard";
  config["geo-auto-update"] = true;
  config["geo-update-interval"] = 24;
  config["geox-url"] = {
    "geosite": "https://testingcf.jsdelivr.net/gh/v2fly/domain-list-community@release/dlc.dat",
  };

  // 2. 【核心】直接暴力覆盖所有分流规则
  // 不管机场原来写了什么,统统替换成下面这套“LoyalSoldier精简版”
  config.rules = [

    // "AND,((DST-PORT,3389),(NETWORK,UDP)),REJECT",

    "DOMAIn-SUFFIX,xygj.pro,DIRECT",
    "DOMAIN-SUFFIX,goofish.pro,DIRECT",
    "DOMAIN-SUFFIX,bastionglobal.azure.com,DIRECT",

    "PROCESS-NAME,Windows App,DIRECT",
    "PROCESS-NAME,Telegram,Proxies",

    // 域名匹配
    "GEOSITE,private,DIRECT",
    "GEOSITE,geolocation-!cn@cn,DIRECT",
    "GEOSITE,geolocation-!cn,Proxies",
    "GEOSITE,geolocation-cn@!cn,Proxies",
    "GEOSITE,geolocation-cn,DIRECT",
    "GEOSITE,tld-cn,DIRECT",

    // IP 匹配
    "GEOIP,telegram,Proxies,no-resolve",
    "GEOIP,cn,DIRECT,no-resolve",
    "GEOIP,lan,DIRECT,no-resolve",

    "MATCH,Proxies"
  ];

  // 返回修改后的配置
  return config;
}

DNS 请求原理

DNS 泄漏

国内 DNS 服务器的后果

DNS 泄漏有两种情况,一种是你的 DNS 请求发给了国内 DNS 服务器,一种是国外 DNS 服务器。

如果有些网站检测到你在解析他们域名的时候使用的是国内的 DNS 服务器,但是你的代理 IP 在美国,这种不一致性会让网站对你的身份产生怀疑,甚至直接封禁你。

全局模式下的情况

全局模式、系统代理模式下,一些不走系统代理的应用,可能还是会在本地发起 DNS。

全局模式、TUN 模式下,代理软件(如 Clash)会强制把所有流量(包括 DNS 请求)封装进加密通道,直接发给美国代理服务器。你的电脑本地完全闭嘴,不发任何 DNS 请求。

在 Windows 上,如果是 TUN 模式,即使是全局模式,也还是会发起 DNS 请求。Windows 默认会将 DNS 请求发给所有网卡上配置的 DNS 服务器。要把这个设置关掉。

分流模式、系统代理

浏览器要访问谷歌,由于配置了系统代理,浏览器不再进行 DNS 查询,而是直接将访问网站的请求交给我们的代理客户端。

代理客户端拿到请求之后,此时会有两种情况:

一种是不发起 DNS 请求就能判断走直连还是走代理(按域名进行分流),这种情况基本不存在 DNS 泄露;

如果使用按 IP 进行分流的规则,代理软件为了判断一个域名该走代理还是直连,往往会先在本地发起一次 DNS 查询拿到 IP,再根据 IP 决定怎么走。只要在本地发起 DNS 查询,不管发给国内还是国外,都经过了运营商和防火墙,这就是泄漏。

实际例子:

你的分流规则里写着“国内 IP 走直连,国外 IP 走代理”。

矛盾点:既然要按 IP 分流,那 Clash 必须先知道 www.google.com 的 IP 是多少,才能判断它是国内还是国外,对吧?

死结:为了拿到 IP,Clash 必须先在本地发起一次 DNS 请求(这就是之前说的泄漏源)。一旦在本地发起了,就被运营商和防火墙看到了。然后懂的都懂。

如何解决分流模式、系统代理的 DNS 泄漏

在 Clash 使用域名匹配按 ip 分流的规则时,会在本地进行一次 DNS 请求(泄漏),获取域名的 ip 地址。但是这个 ip 只是用来进行 ip 分流规则的匹配,没有别的作用。你发给节点的数据包中,存的还是域名。

那么如何解决这个 DNS 泄漏?

一种办法是给所有基于 IP 分流的匹配规则都加上 no-resolve,这样就不会触发 DNS 请求。但是会有一个问题:如果 GEOIP,CN,DIRECT 加上了 no-resolve,那么国内小众网站在看到这条时,会直接跳过,如果最后兜底的是 MATCH, proxy,那么国内小众网站就会走代理了。

另一种方式,就是在 IP 规则前,先把所有的黑名单网站的匹配规则先加上,比如 google youtube facebook twitter 等等。这样就可以优先匹配到域名规则,直接交给节点处理,不会再往下匹配,也就不会触发 IP 规则的 DNS 请求了。

分流模式、TUN 模式:fake-ip

前面主要在讲系统代理模式下的情况,TUN 模式下的分流情况要复杂一些。现在主要使用 fake-ip。

手写 clash 内核配置

分流规则如何写

总体指南

一个真正高手的规则列表顺序应该是这样的(优先级从高到低):

GEO 文件

DNS 规则如何写

DNS 和分流规则别人的例子

https://www.aloxaf.com/2025/04/how_to_use_geosite

dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - 'rule-set:fake-ip-filter'
  prefer-h3: false
  default-nameserver:
    - 223.5.5.5
  proxy-server-nameserver:
    - 223.5.5.5
  direct-nameserver:
    - 'https://doh.pub/dns-query'
    - 'https://223.5.5.5/dns-query'
    - 'https://doh.360.cn/dns-query'
  nameserver:
    - 'https://dns.google/dns-query#PROXY&ecs=120.76.0.0/14&ecs-override=true'
    # - 由于国外 DoH 普遍被墙,这里填的实际上是自建的 DoH

domain_rule: &domain_rule
  type: http
  behavior: domain
  format: text
  interval: 86400

rule-providers:
  reject-list:
    <<: *domain_rule
    url: https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/reject-list.txt
    path: ./ruleset/reject-list.txt
  fake-ip-filter:
    <<: *domain_rule
    url: https://cdn.jsdelivr.net/gh/juewuy/ShellCrash@dev/public/fake_ip_filter.list
    path: ./ruleset/fake_ip_filter.list

rules:
  - DOMAIN-SUFFIX,steamserver.net,DIRECT

  ##### 域名匹配 #####
  - GEOSITE,private,DIRECT
  - RULE-SET,reject-list,REJECT
  - GEOSITE,category-ai-!cn,🤖AIGC
  - GEOSITE,category-pt,DIRECT
  - GEOSITE,category-public-tracker,DIRECT
  - GEOSITE,category-number-verification-cn,DIRECT
  - GEOSITE,category-speedtest,PROXY
  - GEOSITE,geolocation-!cn@cn,DIRECT
  - GEOSITE,geolocation-!cn,PROXY
  - GEOSITE,geolocation-cn@!cn,PROXY
  - GEOSITE,geolocation-cn,DIRECT
  - GEOSITE,tld-cn,DIRECT

  ##### IP 匹配 #####
  - GEOIP,telegram,PROXY,no-resolve
  - GEOIP,lan,DIRECT
  - GEOIP,cn,DIRECT
  - NOT,((DST-PORT,80/443/8080/8888)),❓其他端口
  - MATCH,PROXY