V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Seayon
V2EX  ›  宽带症候群

Clash 如何优雅的管理自定义的规则集文件?

  •  
  •   Seayon · 357 天前 · 16276 次点击
    这是一个创建于 357 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我将机场订阅连接和 github 各种规则集融合在一起定义了一份自定义的规则集文件,方便自定义各种分流,比如最近的 ChatGPT 我会给他分配美国节点,而其他网站使用香港节点以获得最佳访问速度。

    但总有新的域名需要加入到规则集中,也有一些域名想临时直连试试。

    尝试自己在 github 维护了自己的规则集, 这样做因为我可以用 git 来提交和同步,并且可以提供 http 链接给 clash 可以通过网络来试试获取分流规则,我的配置文件一部分就如下

    rule-providers:
      myproxy:
        type: http
        behavior: domain
        url: "https://github.com/xxx/raw/master/MyProxy.yaml"
        path: ./ruleset/myproxy.yaml
        interval: 3600
      mydirect:
        type: http
        behavior: domain
        url: "https://github.com/xxx/Profiles/raw/master/MyDirect.yaml"
        path: ./ruleset/mydirect.yaml
        interval: 3600 
     
    # 在自定义 Rules 中引入 
    rules:
      # 自定义 Rule 开始
      - RULE-SET,myproxy,PROXY
      - RULE-SET,mydirect,DIRECT
      # 自定义 Rule 结束
    

    试了一下现在这样可以,我只需要在 git 中编辑域名列表,然后 push ,在 clash 中刷新一下规则集即可应用。但手动编辑总归还是有点麻烦,我需要提交,push 。

    早期的时候我使用 [SwitchyOmega] 浏览器插件,定义了一个全部走代理的的代理地址和端口,因为这个插件可以探测到网页的某些域名的资源加载是否正常,我可以快速的将其切换到使用直连还是使用代理,但后来发现这个插件能同步的域名列表有限,且我想要全局透明代理所以用了软路由,我在想能不能借助这个插件的能力,在检测到资源加载异常时,可以快速将一个域放到上述我定义的代理集中或者放到直连规则集中?或者大家都是怎么同步的?

    还有一个问题,因为我现在有多台软路由,还有多端同步需求,所以自定义的原始的分流配置文件我也要多端同步,我现在是放在七牛云上的私有空间临时导出带访问权限的 http 链接给 clash 导入用一下(因为这些不常变但也会变,主要还是),也想问大家怎么处理的。

    第 1 条附言  ·  357 天前

    GPT-4 的回复:

    对于您的需求,我有以下几点建议。

    1. 利用自动化工具简化域名列表编辑:您可以编写一个简单的脚本或使用现有的自动化工具(如Python脚本、Shell脚本等)来简化域名列表的编辑、提交和推送过程。当您需要添加或删除域名时,只需运行脚本,脚本会自动完成相关操作并将更改推送到GitHub仓库。这将大大减轻手动编辑、提交和推送的繁琐过程。
    2. 对于浏览器插件:虽然SwitchyOmega插件可以实现您所需的部分功能,但是要实现在检测到资源加载异常时快速将域名添加到代理集或直连规则集中,您可能需要研究其他插件或者尝试开发一个自定义的浏览器扩展来满足需求。
    3. 多端同步:您提到的将分流配置文件放在七牛云上的私有空间并导出带访问权限的HTTP链接的方法是可行的,这样可以确保多台软路由和多端设备都能访问到最新的配置。另外,您可以考虑使用其他同步工具或服务,如Dropbox、Google云端硬盘等,将配置文件同步到不同设备。这样可以确保所有设备都能获取到最新的分流配置,减轻手动同步的负担。

    最后,希望我的建议能对您有所帮助,如果您有其他问题或疑问,请随时提问。

    第 2 条附言  ·  102 天前
    5peg6ZmQ5pyf5aSH55So5rWB6YeP6a2U5oiS5py65Zy677yaaHR0cHM6Ly93d3cubW9qaWUubWUvIy9yZWdpc3Rlcj9jb2RlPUwzZUN6QWtCCuaAp+S7t+avlOi2hemrmOS4u+a1geS6jOe6v+iWr+adoeacuuWcuu+8mmh0dHBzOi8vYXYxLnd0Zi9hdXRoL3JlZ2lzdGVyP2NvZGU9UjZtbgo=

    经典年付和一个无限流量的长期的
    63 条回复    2024-01-10 13:38:14 +08:00
    cy18
        1
    cy18  
       357 天前
    不知道有没有什么工具,可以自动在后台智能判断,第一次连接新域名或者 IP 的时候通过判断可连接性自动建立规则集,那就方便了。
    Seayon
        2
    Seayon  
    OP
       357 天前
    @cy18 那怎么判断这个域名或者 ip 该走代理还是直连呢?这个数据哪里来
    cy18
        3
    cy18  
       357 天前
    @Seayon 一个初步思路,在后台分别通过代理跟不走代理连一下目标地址,然后根据连接是否成功,连接速度,甚至进一步判断内容是否一致来自动建立规则。这个只在某个域名或者 ip 第一次连接的时候做判断,所以总体来说对使用体验不大。
    cy18
        4
    cy18  
       357 天前
    当然静态规则也是必不可少的
    Musong
        5
    Musong  
       357 天前
    Musong
        6
    Musong  
       357 天前
    奥看错了 撤回
    fatelight
        7
    fatelight  
       357 天前
    参考 https://github.com/ACL4SSR/ACL4SSR/tree/master
    然后加上自己自定义,可以自己配置 config 常用远程用库里面的,自己特殊域名自己加
    Seayon
        8
    Seayon  
    OP
       357 天前
    @cy18 哇,这个思路好,牛的
    Seayon
        9
    Seayon  
    OP
       357 天前
    @fatelight 其实我的问题就是如何快速添加和移除自定义的特殊域名,以及在多端自动同步自己的操作
    bpazy
        10
    bpazy  
       357 天前
    和 OP 有相同的问题,我目前的方法是将规则写在文件中,rule-provider 指向这个文件,然后创建硬链接通过 onedrive 同步,这样多设备都可以同步了。

    快速添加规则是通过写的一个小程序来满足的: https://github.com/Bpazy/acr, 目的是添加规则到 file 中然后调用 cfw API 快速刷新规则已达到实时生效。

    这样我的整个流程就变为:
    1. 打开 YouTube 发现打不开;
    2. 执行命令快速添加域名: acr add https://www.youtube.com/
    3. 刷新网页;

    但也有问题没解决:
    1. 软路由如何同步我的配置,毕竟软路由没有 onedrive ;
    2. 添加规则后,其他机器如何立刻生效?比如我本地添加规则,其他机器立刻同步到新规则后,也可以访问相同的域名;
    Helsing
        11
    Helsing  
       357 天前 via iPhone
    GitHub 不是有手机客户端吗,编辑一下很麻烦吗

    我的自定义规则就是放在 GitHub 仓库里的,要改就打开客户端改一下
    anto17
        12
    anto17  
       357 天前
    为啥不用 geoip 啊,非大陆地址默认走代理不就好了。特殊情况想直连就单独加一条规则,但这种频率应该不高
    JxQg597
        13
    JxQg597  
       357 天前
    @bpazy #10 有修改配置和刷新重启的工具了。
    手撸一个配置中心,加分发到各个服务,如果要浏览器一键添加,再撸一个浏览器插件。
    插件填写配置中心的服务地址,浏览器添加规则到配置中心的规则文件,再通过配置中心推送到各个服务执行修改配置和刷新重启。
    bpazy
        14
    bpazy  
       357 天前
    @JxQg597 #13 请问你是怎么解决配置分发到客户端的问题的?比如软路由使用的是 openclash ,为了达成分发的目的,我还需要对 openclash 进行改造吗?
    JxQg597
        15
    JxQg597  
       357 天前
    @bpazy #14 哈哈哈,我就是提供一个理论可行的解决方案。具体实现起来应该占用很大内存(java),还需要一个公网的机器。也可以用 go 去实现把。
    openclash 点击按钮底层也是使用 sh 脚本的,直接调用它的脚本好了。
    我没那么多软路由,也没有那么多网址需要添加,所以传到 github 私有 gist 里面,手动去多端同步。
    SenLief
        16
    SenLief  
       356 天前   ❤️ 4
    不要用 rules 。尤其是经典类型的,匹配很差,性能也低。

    改用 clash.meta ,使用 geosite.dat 或者 geosite.db 以及 geoip 即可。

    例外自己的规则托管在 gist 多好啊,比如我的 rules
    rules:
    - DOMAIN-SUFFIX,jsdelivr.net,DIRECT
    - DOMAIN,ghproxy.com,DIRECT
    - RULE-SET,SelfDirect,DIRECT
    - RULE-SET,SelfProxy,Proxy

    - GEOSITE,bilibili,DIRECT
    - GEOSITE,icloud,Icloud
    - GEOSITE,onedrive,OneDrive
    - GEOSITE,spotify,Spotify
    - GEOSITE,youtube,Streaming
    - GEOSITE,netflix,Streaming
    - GEOSITE,spotify,Spotify
    - GEOSITE,telegram,Proxy
    - GEOSITE,github,Proxy
    - GEOSITE,microsoft,Microsoft
    - GEOSITE,openai,OpenAI
    - GEOSITE,category-games@cn,DIRECT
    - GEOSITE,geolocation-!cn,Proxy
    - GEOSITE,CN,CN

    # telegram
    - IP-CIDR,91.108.0.0/16,Proxy,no-resolve
    - IP-CIDR,109.239.140.0/24,Proxy,no-resolve
    - IP-CIDR,149.154.160.0/20,Proxy,no-resolve
    - IP-CIDR6,2001:67c:4e8::/48,Proxy,no-resolve
    - IP-CIDR6,2001:b28:f23d::/48,Proxy,no-resolve
    - IP-CIDR6,2001:b28:f23f::/48,Proxy,no-resolve
    - IP-CIDR,43.134.232.155/16,Proxy,no-resolve

    - GEOIP,CN,CN
    - MATCH,Proxy

    前面 SelfDirect 和 SelfProxy 是自己的规则,托管在 gist 上,如需添加就修改 gist ,然后更新一下就可以了。后面的规则全部是 GEOSITE ,最后用 GEOIP 兜底。
    SenLief
        17
    SenLief  
       356 天前
    @cy18 现在都不是这样请求的,因为你需要先 dns ,如果需要代理的请求 dns 给国内的,大概率是要污染的。
    Huelse
        18
    Huelse  
       356 天前
    我倒是没这么麻烦,在 CFW 中用配置文件预处理来实现按需分配 https://docs.cfw.lbyczf.com/contents/parser.html#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E

    prepend-proxy-groups 添加特定的规则组,例如美国 IP 的,然后在 prepend-rules 指定域名用这个规则组的连接即可,每次更新自动覆盖

    软路由的话就不清楚了,我不喜欢把代理放在路由上,没操作过
    cy18
        19
    cy18  
       356 天前
    @SenLief DNS 肯定也得分不同线路也要走两次
    SenLief
        20
    SenLief  
       356 天前
    @cy18 dns 污染后,它会给你 ip ,只不过是污染的,你还需要请求两次,两次握手还需要时间,这样无法做到无感知,你会有明显感知变慢了。
    LoveMyself546
        21
    LoveMyself546  
       356 天前
    @bpazy 配置分发的问题我想到的是用 subconverter 这种可以重新合并规则的工具,只要将 acr 添加规则到 file 变成添加规则到配置中心,配置中心收到规则整理一份新的规则文件,然后 acr 调用 cfw api 从配置中心拉取最新的规则文件,这样应该行得通。(又或者 acr 提交到 github 这类的仓库,然后直接由 subconverter 拉取合并)
    cy18
        22
    cy18  
       356 天前
    @SenLief 只在第一次连接的时候判断,根据结果写成规则,之后连接就不影响体验了。

    找了下,没找到现成的这种工具,不知道自己写一个工作量大不大。
    Seayon
        23
    Seayon  
    OP
       356 天前
    @bpazy 你是将整个配置文件进行同步了,我刚开始也想这么做,但是将配置文件上传到公网暴露出来 http 链接,里面包含了我的机场订阅链接,我担心泄露(虽然我们可以整一个非常复杂的文件名之类),然后没有考虑国外的网盘,因为本身到国外网络连接不稳,到时候再发生先有鸡还是先有蛋的难题。

    后来我想明白了,我主要变动的是自定义规则域名那块儿,其余的机场订阅链接等不会经常变,于是我就将我的域名列表配置文件抽出来放到了公网,这也会暴露,但一堆域名列表可能会暴露我的喜好而已不会暴露其他的太多东西,还能接受。

    我将域名列表更改后提交到 git ,这时候怎么让其他软路由中的 openclash 快速同步呢?
    mydirect:
    type: http
    behavior: domain
    url: "https://github.com/xxx/Profiles/raw/master/MyDirect.yaml"
    path: ./ruleset/mydirect.yaml
    interval: 3600
    除了将这个配置这里的 interval 缩短一点,比如 120 ,两分钟之类
    我还发现 openclash 带的 Yacd 控制面板 和 Dashboard 控制面板 都有一个刷新规则列表的按钮,你可以打开面板找找
    在 管理面板的规则 -》 然后找到自定义的规则的 名字(比如上述的 mydirect ),然后点击 刷新,会立刻从配置的 url 拉取最新的规则生效。
    SenLief
        24
    SenLief  
       356 天前
    @cy18 #22 如果是这个,其实不用,因为 dns 有缓存,你第一次链接后,dns 会缓存这个 ip 地址,下一次的时候会直接匹配了,不用请求 dns 服务。
    bpazy
        25
    bpazy  
       356 天前
    @Seayon #23 感谢回复,感觉你说的方法也很好,有机会尝试一下
    ungrown
        26
    ungrown  
       356 天前   ❤️ 1
    @Seayon #8 你是在找 cow proxy 吗?
    但是相信我,这玩意在解决就问题的同时带来新的问题
    qwvy2g
        27
    qwvy2g  
       356 天前
    @SenLief 这个不会污染,但是可能造成不在规则列表里面的域名查询目标暴漏给公司或者学校的记录设备,clash 对不在域名规则里面的 dns 查询会经过两次 dns 查询,第一次向本地 dns 查询,如果返回国外 ip ,clash 配置文件一般有个兜底规则,第二次就会走代理查询。被屏蔽域名一般是在列表里面,这部分自然不会泄露。但是不在列表里面的国外某些网站就不一定了,虽然比如学校或者公司不能看到你访问了某些网站,但是如果时不时查询某些网站 dns 解析结果,然后立马有加密流量,从行为上也能推断出在访问这个网站。
    mohumohu
        28
    mohumohu  
       356 天前
    dns 的话,跑个 docker 就可以解决: https://github.com/kkkgo/PaoPaoDNS
    airbotgo
        29
    airbotgo  
       356 天前
    大佬们的玩法都好高级啊。

    我是 macOS 使用 ClashX ,配置文件保存路径设置为 iCloud 云盘,例外规则通常选“ DIRECT (全球直连)”,碰到不能访问的连接就临时手动切换到“ Proxy (节点选择)”,经常访问就打开本地配置文件将规则添加进去。


    https://acl4ssr-sub.github.io/ 这个在本地生成一个配置文件(放在他们服务器上我不放心),大多数网站包括拦截广告都可以应付,例外的自己添加自定义规则到配置文件中。

    Android 使用 Clash ,ClashX 的配置文件手动传过去,基本很长时间不会动。

    iOS 使用 Shadowrocket ,网上找了拦截广告的默认配置就够用了。
    SenLief
        30
    SenLief  
       356 天前
    @qwvy2g #27 一样的,我说的就是这个意思,程序本身是没法知道域名是不是需要代理的,你如果请求就一定要走 dns 。
    airbotgo
        31
    airbotgo  
       356 天前
    @airbotgo 我的观点是,先用一个通用的规则(网上结合 GEOIP 的拦截广告规则)应付 80%的日常使用场景。剩下临时碰到的,手动切换例外规则解决,这 20%中也只有不到 20%需要添加到规则中,剩下绝大多数可能一年都访问不到几次。碰到一个添加一个,时间长一大堆冗余规则,反而不便查阅和管理。
    Yourshell
        32
    Yourshell  
       356 天前
    写一个浏览器插件或者扩展 clash dashboard ,跟 SwitchOmega 一样看可以管理一些手动规则,并且托管规则文件,更新后通知 clash 更新规则
    Alixys
        33
    Alixys  
       356 天前
    - GEOIP,CN,DIRECT
    - MATCH,MATCH
    一直都是这样兜底,上面 rule-providers 按需加现成的就完事了
    zjp
        34
    zjp  
       356 天前
    我直接摆了😂
    有些网站需要特定地区 id ,有的服务商提供的配置没有按地区分代理组,就需要自己写 append-proxy-groups 。但是代理服务器又不是固定的。
    全能的办法是用客户端提供的脚本能力来修改配置
    但是我现在 Android 、Windows 和 Linux 用了三个不同的客户端😹
    tediorelee
        35
    tediorelee  
       356 天前   ❤️ 1
    zacharyjia
        36
    zacharyjia  
       356 天前
    订阅转换啊,自己参考例子( https://github.com/tindy2013/subconverter/blob/master/base/config/ACL4SSR_Online_Full.ini)写好配置,然后扔到比如 github 上,订阅转换的 web 界面上远程配置那里把 url 给它就行了。这样每次更新订阅的时候,都会在订阅转换后端上按照你的配置文件生成对应的 profile 给 clash
    sfdev
        37
    sfdev  
       356 天前 via Android   ❤️ 1
    Clash 自定义规则及其难用!如果是 mac 或者 iOS 系统的话有更好用的应用,如圈 x 和小火箭,节点和规则分离式,使用非常省心。
    banmuyutian
        38
    banmuyutian  
       356 天前   ❤️ 1
    我是自己搭建 subconverter 再 fork ACL4SSR 规则上增加个人定制规则可以实现多端同步
    Royal22
        39
    Royal22  
       356 天前 via Android   ❤️ 1
    可以试一下我还在写的客户端 https://github.com/uutzlpikvq6852/vpc-pc-open-desktop 里面的规则集是否符合你要求
    ajyz
        40
    ajyz  
       356 天前
    现在好像 github 上很多都有 clash 适用规则的了,以前就是因为嫌麻烦,所以直接全套 surge 了
    noqwerty
        41
    noqwerty  
       356 天前 via iPhone
    @SenLief 请问下 geosite/geoip 匹配性能比传统规则高这个说法有来源吗
    Greatshu
        42
    Greatshu  
       355 天前
    我个人放弃了软路由,切换节点不够灵活,会产生单点故障,不同场景使用节点不同。我在桌面浏览器使用 switch omeg 搭配 GFWLIST ,添加代理也就几秒钟的事,然后 clash 配置域名和 IP 分流。移动端使用分应用代理,然后配置域名和 IP 分流。
    Greatshu
        43
    Greatshu  
       355 天前
    不建议折腾这个事,除非是公司网管,否则花费的时间远大于节省的时间
    muhahaha
        44
    muhahaha  
       355 天前 via iPhone
    @SenLief 请问对应的分组规则仓库地址能否给一个?
    SenLief
        46
    SenLief  
       355 天前   ❤️ 1
    @noqwerty #41 以前在群潜水的时候有看到,不过现在 PC 上性能不是问题,可能更多的是 ios 上吧,毕竟内存有限制。
    PrinceofInj
        47
    PrinceofInj  
       355 天前
    @cy18 以前我用过一个工具叫 cow ,差不多的方案,先直连,发现有问题后尝试代理。可能是不方便,后来没更新了。
    ncepuzs
        48
    ncepuzs  
       354 天前
    muhahaha
        49
    muhahaha  
       354 天前
    @SenLief 谢谢
    Nihosijie
        50
    Nihosijie  
       339 天前
    @Seayon 我用的是 clash 的 provider 功能,写一份包含规则集和分组的配置文件放在 cloudflare works 上,然后加订阅的时候,网站后面带 订阅名=订阅链接 的参数,然后就能实现不暴漏订阅链接的同时,还能自定义配置了。
    jadewant
        51
    jadewant  
       301 天前
    @airbotgo 请问本地版 Mac 怎么操作,发现本地版的工具没有 Mac 端.
    求指点
    yqs112358
        52
    yqs112358  
       226 天前
    @Seayon #23 担心订阅泄露问题的话,可以试试 github 的 gist ,这东东创建的时候默认是 secret 状态的,不像 github 仓库一样可以被搜到,只要不泄露那个 gist 网址就不会发生泄漏。可以放心地把整个配置文件托管在上面,用 raw 引用原文作为订阅链接让 clash 加载。在线编辑也比较方便,编辑完点击提交即可。
    yqs112358
        53
    yqs112358  
       226 天前
    @Huelse 我之前也用的 cfw 的 parser ,但是后面发现不方便因为其他端( android/ios )没有 parser 这东西,没法共享自定义规则。最后还是换回线上 gist 托管的模式
    Seayon
        54
    Seayon  
    OP
       226 天前
    @yqs112358 #52 非常感谢,我试一下 gist ,只是不知道这个本身会不会被墙比较麻烦
    yqs112358
        55
    yqs112358  
       225 天前   ❤️ 1
    @Seayon #54 确实会墙。所以说我这边还自己在 cloudflare workers 搭了反代给 gist.githubcontent.com 用,方便国内访问。当然既然楼主之前用 github 那肯定已经处理过墙的问题,用一样的办法对付 gist 即可。
    playboy0
        56
    playboy0  
       188 天前
    @SenLief #16 '不要用 rules 。尤其是经典类型的,匹配很差,性能也低。' 有出处吗?我查到的结果是 rule-set 性能很强
    SenLief
        57
    SenLief  
       188 天前 via iPhone
    @playboy0 翻一下 issues 就知道了,经典类型的 rules 需要全部 dns 的。性能也一般。
    playboy0
        58
    playboy0  
       188 天前
    @SenLief #57 这里的经典是指所有使用 rule-set 设置的规则吗,我查了一下,有文章建议不要展开 rule-set 即可获得较好的性能,谢谢
    SenLief
        59
    SenLief  
       188 天前 via iPhone
    @playboy0 rule-set 本身没啥问题吧,它也是下载到本地的,不过如果用的是 meta 或者 singbox 不如用 geodite.db ,匹配性能会更好一些。
    zwyyy456
        60
    zwyyy456  
       118 天前
    @SenLief 能指路一下吗,翻了一下 mihomo 的 issues ,没看到这个说法?
    SenLief
        61
    SenLief  
       117 天前
    @zwyyy456 之前看到他们在 tg 群讨论的,不过现在 sing-box 放弃 geosite 又回到 rule-set 只不过改了一下格式。
    BaymaxK
        62
    BaymaxK  
       100 天前
    @SenLief - GEOSITE,CN,CN 最后这个 CN 规则是你自己定义的吧,clash 的默认规则好像只有 DIRECT 和 REJECT
    SenLief
        63
    SenLief  
       100 天前
    @BaymaxK 对的,你可以直接用 DIRECT
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5325 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:54 · PVG 14:54 · LAX 23:54 · JFK 02:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.