Clash-Verge-Rev最佳实践

Clash-Verge-Rev最佳实践

彼方 46 2024-06-15

本文转载于:https://lainbo.com/article/clash-config

仅作为备份查看,更多内容请查看原作者博客。


关于一些客户端作者停止更新

这些客户端停止更新了, 对我们的使用是否有影响呢? 想要知道这个问题的答案, 首先我们先明白一个概念,Clash Verge(开源)、Clash for Windows、Clash X Pro这一类图形化的软件,都是一个壳,用于对接核心的功能, 停止更新的只是这个

常见的核心有Clash Premium、Clash Meta(开源)

因为Clash Verge和他能切换的内核Clash Meta都是开源的,所以我们应该优先选这个搭配,下文中也会使用。

那我们还能够继续使用他们吗?

当然可以,解释如下

  1. 就像你在使用一个收音机(Clash Verge),你不会因为收音机的制造商(作者) 倒闭了(停止更新),而立刻扔掉你的收音机

  1. 收音机的所有零件图纸是公开(开源) 的,你不用担心他可能植入一些不好的后台程序

  1. 收音机的外壳按钮(Clash Verge) ,是让我们更轻松的控制收音机里面的主板元件(Clash Meta核心) 去执行它们的任务,只要这个 外壳按钮(Clash Verge) 控制 收音机主板(Clash Meta核心) 的方式没有太大问题,那我们就可以用

  1. 外壳停止更新,意味着收音机外壳不会增加新的按钮

  1. 核心停止更新,意味着收音机主板不会更新功能,仅此而已

  1. 收音机能播放声音(开启魔法),是因为你输入了正确的FM频率(订阅链接)。只要电台(机场) 还在广播(服务),只要你的壳和核还在,就不影响你播放声音(开启魔法)

最后,我们要明确一点,下文中涉及到隐私保护的操作并不是绝对的安全,就像是想要知道你在家里做什么,可以在楼下垃圾桶翻你的扔的垃圾进行推测,可以望远镜监视你,可以把你家天花板炸了或者用大炮强行冲进来看。网络监控也一样,就看你在网络上的行为,值不值得人家用那些高阶手段了,总不能因为挖掘机一铲子能把防盗门破了我就不装防盗门了。

目前可用的开源Clash Verge客户端

现在有不少基于Clash Verge继续开发维护的客户端

为什么是这个软件?

多端兼容性出色——Clash Verge 支持 Windows、macOS、Linux。如果按照下方的教程进行操作,最终将得到一个新的订阅链接,而 iOS 上的软件 Stash 恰好完全兼容该链接中的内容。Clash Verge 与 Stash 的组合可以覆盖几乎所有主流设备,而下方的最佳实践操作,只需执行一次,就可以在众多设备上应用。

应用软件现代化——在确保易用性的前提下,采用较新技术,实现了许多其他客户端不具备的新特性和优秀功能。

太长不看版本

  1. 订阅转换(必做)

  1. 开TUN模式,关代理(可选)

  1. 关闭浏览器安全DNS地址,设置TUN模式的DNS地址(可选,如果操作了2,则此项必做)

  1. 关闭多宿主DNS解析,系统DNS设置自动,关闭浏览器QUIC(Windows可选)

  1. 设置本地中国IP数据库(可选)

解决订阅分流规则问题

拿到了订阅链接,第一步要做的应该就是订阅转换,将他的分流规则完善 (因为给你提供订阅的服务商,自带的分流规则往往就几百条,很不健全,很多人开着Clash但New Bing却用不了就是个很好的例子)

在线订阅转换不仅仅是将Shadowsocks、V2ray、Trojan 订阅链接转换为 Clash 、Stash、V2ray、Quantumult X、Surge 等软件使用的订阅格式,他还支持非常多的进阶操作,不过在本文仅以够用为目标,而不是把这个东西玩出花来。

在线订阅转换网站虽然好用,但也有一定的隐私风险,需要注意,建议会技术的朋友自己搭建在线订阅转换平台。

订阅转换网站

我搭建的订阅转换网站, 下文将使用该网站作为示例

进入: https://sub.lainbo.com/

需要操作的步骤

一般这样就已经可以比较完美的使用了,并且拥有我写的远程配置文件中的一些额外功能

判断是否成功套用了规则文件

拉取订阅后, 节点中应该会出现“🌿自动选择”、“🇭🇰香港自动”、“🇨🇳台湾自动”、“🇸🇬狮城自动”、“🇺🇸美国自动”、“🇯🇵日本自动”这几个自动节点。能看到这几个自动节点, 那你就成功在自己的订阅上套用了我的规则。

推荐在没有特殊需求的时候选择用这几个自动节点, 自动节点会帮你使用对应国家/地区节点中, 延迟最低的节点。

关于远程配置

这个远程配置是什么,能赋予你的订阅什么功能,你可以打开「远程配置」原文的链接,顶部有注释

解决DNS泄露问题

DNS 泄露指的是在使用 VPN 或其他隐私服务的情况下,用户的真实 IP 地址通过 DNS 请求被发送到了 ISP(如联通,移动)的 DNS 服务器,而不是通过 VPN 设置的安全、匿名的 DNS 服务器。如果在 DNS Leak Test 、ipleak这种网站的列表中看到了中国国旗,就要意识到可能发生了DNS泄露。

如果真的泄露了有什么问题呢 ? 我也不知道可能导致什么,或许你可能收到下图这样的消息

我觉得还是尽量不要让他们知道这件事。虽然没有人知道具体的探测机制是什么,但很可能是从网络层面获取的。在一般的家庭网络拓扑中,wireshark可以看到什么内容,运营商就能看见什么内容,所以你使用114.114.114.114、223.5.5.5这样的DNS解析去访问了什么网站是很清晰的。

这就要衍生出第一个使用技巧——Clash开启TUN模式,关闭系统代理去使用

与普通的系统代理模式区别在于,TUN模式下Clash会创建一张虚拟网卡,从网络层面接管所有的网络流量。

普通的系统代理模式,是作为一个软件的权限去接管别的软件的网络,总有一些无法接管的应用,比如游戏,比如命令行。所以我们应该开启TUN模式,关闭系统代理,让网卡做这件事,而不是让软件做这件事

操作一 (开启TUN模式)

  1. 首先切换Clash Verge的内核,选开源的Clash Meta内核,然后重启整个Clash Verge确保生效

    1. (Clash Meta在后期可能在不同的客户端名称有所不同, 如果看到内核名字是Mihomo 版本号是1.x.x的也是Meta)

  1. 安装服务并且开启Tun模式,按下方图中的数字序号顺序点击

    1. 如果服务模式无法安装

    2. Win可以尝试在系统命令行(PowerShell)中执行sc delete clash_verge_service 来删除之前的Clash Verge服务,这可能是你之前安装过Clash Verge,但是卸载的时候没有写在这服务模式,导致新的安装不上

    3. Mac/Linux请在设置的Clash内核点开齿轮图标⚙️,点"授权”

    4. 其他疑难杂症参考https://github.com/clash-verge-rev/clash-verge-rev/issues/125

但是当我们开启了TUN,再去查看泄露时,发现还是有中国服务器(Windows系统可能出现)。这是由于fake-ip模式将DNS请求同时发送给了本地的物理网卡和Clash虚拟网卡,我们希望只发送给Clash的网卡,因为Clash创建的虚拟网卡会按我们的要求做事,本地真实的网卡不会。

操作二 (调整组策略 Mac跳过)

要解决这个问题也很简单,问题出现的原因是Windows系统默认使用多宿主DNS解析,会使用所有的网卡发起请求,我们只需要在组策略(Windows家庭版无该功能)中关闭这个功能即可(Win+R,输入gpedit.msc 点确定)。

至此,我们解决了Clash在Windows下可能发生的DNS泄露问题(主要靠分流规则起作用)。

但并不能保证ipleak检测不到,因为这个网站并不被墙。虽然我可以将ipleak加入规则中,但这样做就是掩耳盗铃。只要确保某些黑名单网站不被漏掉,不会收到上面那种短信,我认为就可以了。

操作三 (使用一个稳定的的DNS)

DNS这部分有人会教使用运营商的DNS,运营商的DNS只适合小白用户,因为他可能连反诈,所以建议使用国内大厂的。

  1. 关闭浏览器的QUIC, 中国大陆的isp是限速udp的, 所以导致QUIC这个优秀的协议, 到了中国大陆的网络下成了个负面增益效果。

    1. about://flags/#enable-quic 设置为Disabled (点下方弹出的重启浏览器生效)

  1. 关闭浏览器中的“安全DNS”

    1. Chrome: chrome://settings/security

      • 【使用安全DNS】(新版Chrome中叫做【对您访问的网站的名称进行加密】),关闭

    2. Edge: edge://settings/privacy

      • 找到【安全性】 -【使用安全的 DNS 指定如何查找网站的网络地址】,关闭

  1. 在Clash Verge的【配置】中,点右上角的新建,进行如下操作

  1. 右键点击新建的卡片,选择编辑文件,并输入以下内容,保存,右键点击卡片启用

    1. function main(content) {
        const isObject = (value) => {
          return value !== null && typeof value === 'object'
        }
      
        const mergeConfig = (existingConfig, newConfig) => {
          if (!isObject(existingConfig)) {
            existingConfig = {}
          }
          if (!isObject(newConfig)) {
            return existingConfig
          }
          return { ...existingConfig, ...newConfig }
        }
      
        const cnDnsList = [
          'https://223.5.5.5/dns-query',
          'https://223.6.6.6/dns-query',
        ]
        const trustDnsList = [
          'quic://dns.cooluc.com',
          'https://doh.apad.pro/dns-query',
          'https://1.0.0.1/dns-query',
        ]
        const notionDns = 'tls://dns.jerryw.cn'
        const notionUrls = [
          'http-inputs-notion.splunkcloud.com',
          '+.notion-static.com',
          '+.notion.com',
          '+.notion.new',
          '+.notion.site',
          '+.notion.so',
        ]
        const combinedUrls = notionUrls.join(',');
        const dnsOptions = {
          'enable': true,
          'prefer-h3': true, // 如果DNS服务器支持DoH3会优先使用h3
          'default-nameserver': cnDnsList, // 用于解析其他DNS服务器、和节点的域名, 必须为IP, 可为加密DNS。注意这个只用来解析节点和其他的dns,其他网络请求不归他管
          'nameserver': trustDnsList, // 其他网络请求都归他管
          
          // 这个用于覆盖上面的 nameserver
          'nameserver-policy': {
            [combinedUrls]: notionDns,
            'geosite:geolocation-!cn': trustDnsList,
            // 如果你有一些内网使用的DNS,应该定义在这里,多个域名用英文逗号分割
            // '+.公司域名.com, www.4399.com, +.baidu.com': '10.0.0.1'
          },
        }
      
        // GitHub加速前缀
        const githubPrefix = 'https://fastgh.lainbo.com/'
      
        // GEO数据GitHub资源原始下载地址
        const rawGeoxURLs = {
          geoip: 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat',
          geosite: 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat',
          mmdb: 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb',
        }
      
        // 生成带有加速前缀的GEO数据资源对象
        const accelURLs = Object.fromEntries(
          Object.entries(rawGeoxURLs).map(([key, githubUrl]) => [key, `${githubPrefix}${githubUrl}`]),
        )
      
        const otherOptions = {
          'unified-delay': true,
          'tcp-concurrent': true,
          'profile': {
            'store-selected': true,
            'store-fake-ip': true,
          },
          'sniffer': {
            enable: true,
            sniff: {
              TLS: {
                ports: [443, 8443],
              },
              HTTP: {
                'ports': [80, '8080-8880'],
                'override-destination': true,
              },
            },
          },
          'geodata-mode': true,
          'geox-url': accelURLs,
        }
        content.dns = mergeConfig(content.dns, dnsOptions)
        return { ...content, ...otherOptions }
      }

启用后再次点击重新激活订阅按钮, 确保正确的应用了设置 (这里的任何代码变动, 都需要点击这个按钮手动刷新运行时的配置)

这段代码的作用是

  • 使用阿里和DNSPod(腾讯的DNS)的DoT来解析节点、DNS服务器

  • 使用无污染的DNS服务器解析其他网站

  • 使用非营利组织的DoT解析Notion网站

  • tun模式堆栈使用自适应模式

  • 更换延迟计算方式,去除握手等额外延迟

  • 开启TCP并发的支持

  • 开启域名嗅探, 准确还原域名, 进行域名分流

  • 设置geodata的下载源为国内加速下载源

如果你完全按照上面的步骤设置好了,再看看DNS Leak Test 、ipleak ,你会发现大部分的解析结果都是来自国外的Cloudflare和Google的DNS, 这是节点服务器不管拿到了你传过去的真ip还是假ip地址, 他都会再去请求一次Cloudflare/Google的DNS服务, 确保解析的正确性。但是重要的是没有中国大陆的DNS服务器了,如果还是有,那你应该往当前设备的更上层寻找问题所在,比如路由器的设置等。

解决GEOIP, CN问题

目前市面上绝大多数的代理工具都依赖于 GeoIP2 数据库判断地址所属地。它们的规则结尾部分一般都会有一条类似 GEOIP, CN,用来查询目的 IP 地址是否属于中国大陆,从而判断是否直连。

这些代理工具通常使用的 GeoIP2 数据库是来自于 MaxMind 的 GeoLite2 免费数据库。这个数据库目前存在一下几个问题:

  • 获取不便:从 2019 年 12 月 30 日起,必须注册后才能下载

  • 数据量大:数据库庞大,包含全球的 IP 地址段,约 10 MB

  • 准确度低:对中国大陆的 IP 地址判定不准,如:香港阿里云的 IP 被判定为新加坡、中国大陆等。

庞大的数据量对于大多数中国大陆的用户来说是没有意义的,因为只仅需要去判断 IP 的地理位置是否属于中国大陆境内,其他国家的 IP 一律代理/直连。过多的数据量会增加载入时间,降低查询效率。

我们在之前创建的Script中已经包含了下载更精简合适中国大陆的IP数据库链接, 现在只需要手动操作下载和替换即可。

  1. 点击Clash Verge Rev的设置菜单, 找到「更新GeoData」, 点击进行更新, 他会在后台进行下载和本地的文件替换, 通常在10秒内完成。

  1. 验证是否下载完成: 右键托盘中的Clash Verge图标,【打开目录】-【应用目录】, 找到geoip.dat文件, 查看其文件体积, 如果是几百KB则成功, 如果是好几MB则未成功或未下载完成(几百KB下载要不了多久, 太久没有效果可能需要你使用下方的操作去重启Clash客户端重试)。

  1. 下载完成后右键托盘中的Clash Verge图标,【更多】-【重启应用】确保数据库被正确应用

我希望xxx.com不要走代理, 如何做?

  1. 点击左侧「订阅」菜单, 点击右上角的「新建」按钮

  1. 类型选择「Merge」, 名称自己起一个, 点保存

  1. 右键点击刚才新建出来的Merge, 点击「编辑文件」, 在prepend-rules: 后面进行添加 (Clash的策略是从上往下读取规则, 读取到了就不再往下找, 所以要使用prepend, 在前面插入规则)

  1. 格式如下, 自行灵活组合即可添加你想要的规则, 写时注意yaml文件的缩进

    1. 注意,此处我根据最新官方文档贴上了可用的规则,直接粘贴修改其中的规则文字即可:

      ## 官方提醒:
      
      自行将下方配置中的代理出口(自行修改),替换成原配置中存在的代理名称或代理组名称(如🚀节点选择、♻️自动选择、🇺🇸 美国节点之类的)。
      
      如果你的 Clash Verge Rev 版本低于 v1.6.2 ,本配置会覆盖原配置中的 rule-providers ,请知悉。
      首次使用需要下载规则集文件,可能需要加载一段时间,请耐心等待。若等待过久可尝试多次重新激活配置,下载未下载完成的规则集文件。
      prepend-rules:
        - RULE-SET,applications,DIRECT
        - DOMAIN,clash.razord.top,DIRECT
        - DOMAIN,yacd.haishan.me,DIRECT
        - RULE-SET,private,DIRECT
        - RULE-SET,reject,REJECT
        - RULE-SET,icloud,DIRECT
        - RULE-SET,apple,DIRECT
        - RULE-SET,google,代理出口(自行修改)
        - RULE-SET,proxy,代理出口(自行修改)
        - RULE-SET,direct,DIRECT
        - RULE-SET,lancidr,DIRECT,no-resolve
        - RULE-SET,cncidr,DIRECT,no-resolve
        - RULE-SET,telegramcidr,代理出口(自行修改),no-resolve
        - GEOIP,LAN,DIRECT,no-resolve
        - GEOIP,CN,DIRECT,no-resolve
      
      rule-providers:
        reject:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
          path: ./ruleset/loyalsoldier/reject.yaml
          interval: 86400
        icloud:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt"
          path: ./ruleset/loyalsoldier/icloud.yaml
          interval: 86400
        apple:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt"
          path: ./ruleset/loyalsoldier/apple.yaml
          interval: 86400
        google:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt"
          path: ./ruleset/loyalsoldier/google.yaml
          interval: 86400
        proxy:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
          path: ./ruleset/loyalsoldier/proxy.yaml
          interval: 86400
        direct:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
          path: ./ruleset/loyalsoldier/direct.yaml
          interval: 86400
        private:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt"
          path: ./ruleset/loyalsoldier/private.yaml
          interval: 86400
        gfw:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
          path: ./ruleset/loyalsoldier/gfw.yaml
          interval: 86400
        tld-not-cn:
          type: http
          behavior: domain
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt"
          path: ./ruleset/loyalsoldier/tld-not-cn.yaml
          interval: 86400
        telegramcidr:
          type: http
          behavior: ipcidr
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt"
          path: ./ruleset/loyalsoldier/telegramcidr.yaml
          interval: 86400
        cncidr:
          type: http
          behavior: ipcidr
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
          path: ./ruleset/loyalsoldier/cncidr.yaml
          interval: 86400
        lancidr:
          type: http
          behavior: ipcidr
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt"
          path: ./ruleset/loyalsoldier/lancidr.yaml
          interval: 86400
        applications:
          type: http
          behavior: classical
          url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt"
          path: ./ruleset/loyalsoldier/applications.yaml
          interval: 86400

  1. 写完之后右键你新建出来的Merge, 点击「启用」, 再点击右上角的「重新激活订阅」按钮来刷新配置


至此,就完成了我认为的Clash的最佳实践配置。

远程配置的维护我会持续进行,希望文章的内容能对你有所帮助。