V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
studyingss
V2EX  ›  分享创造

如何优雅地为 Clash 添加自定义代理规则?这是你要看的最后一篇教程

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

    前言

    上一篇文章里很多人想学怎么为 Clash 自定义教程,所以尽量快地写出来了。

    只要利用好 gist 和订阅转换,为 Clash 添加规则并不难,既不用自己写工具,也不用自己买台服务器。

    看完这篇文章,只需要短短 4 步,你就可以实现:

    • 配置一套属于自己的分流规则
    • 无需 自行搭建任何服务
    • 任意 订阅上使用你的规则
    • 拥有跨平台的、通用的、自动同步的自定义规则列表

    下面是正文,原文链接在 https://luxirty.com/article/custom-clash-rule 内容跟这里没区别,只多了一两句话

    所需工具

    • GitHub 账号
    • 订阅转换(随便找一个就行)

    一、创建远程配置

    这一步仅仅是准备工作,你只需要跟着教程做就好,不需要在意细节,等看完整篇教程再回来关注细节也不迟。

    打开 https://gist.github.com/ 创建一个新的 gist

    为了方便理解,我们从一个非常简单的配置开始

    把下面这个 gist 中的所有内容复制到你自己的 gist 里,然后点 create secret gist

    https://gist.github.com/miaomiaoclub/8afa34d1be421f9ac14ee5f872865bdb/e7e660e7796e82f6d00c46756b2e593494cd8961

    完成之后来仔细查看一下这段配置文件,它实际上就只有两项配置:

    # 定义了规则
    ruleset=
    # 定义了分组
    custom_proxy_group=
    

    暂时不需要关注更复杂的细节,下面会讲。

    二、创建你自己的代理列表

    再新建一个 gist ,这个 gist 里写你自己需要代理的域名,一行一个。

    格式如下:

    DOMAIN-SUFFIX,google.com
    

    如果想要指定 IP ,格式是

    IP-CIDR,1.201.0.0/24,no-resolve
    

    完成之后是这样:

    https://gist.github.com/miaomiaoclub/76a9b5dbaad3203f9617dd69b4c74ea5

    以后想添加需要走代理的域名,修改这个 gist 就可以。

    三、将代理列表加入规则中

    打开上一步创建的代理列表 gist ,点击 “raw”,把整段 URL 复制出来:

    https://gist.githubusercontent.com/miaomiaoclub/76a9b5dbaad3203f9617dd69b4c74ea5/raw/0d15083648bda2d0420b9260632736eceb4dcb3c/yourlist.list

    删掉“raw”后面的所有部分: https://gist.githubusercontent.com/miaomiaoclub/76a9b5dbaad3203f9617dd69b4c74ea5/raw/yourlist.list 这里我保留了文件名,删掉也可以,随你喜欢,只要能打开就行。

    回到第一步创建的 gist ,添加一行,其中后面的链接用上面得到的

    ruleset=🚀 节点选择,https://gist.githubusercontent.com/miaomiaoclub/76a9b5dbaad3203f9617dd69b4c74ea5/raw/yourlist.list
    

    完成之后是这样(第 12 行是新添加的):

    https://gist.github.com/miaomiaoclub/8afa34d1be421f9ac14ee5f872865bdb/03a5288b68c0fdb780e6e533c70ade4aff65b3a8

    四、订阅转换

    打开你平常爱用的订阅转换。

    任意一个都可以,请不要发“偷订阅”之类的回复。

    由于上个帖子有人恶意揣测,这里不贴链接和截图,自行 Google 。

    打开之后先像平常一下在订阅链接里填上订阅。

    重点来了。

    打开第一步创建的 gist ,点击 raw ,一样把 URL 中 raw 后面的内容全部删掉,粘贴到“远程配置”一栏,注意,粘贴进去之后还需要在下拉框点击一下。

    五、完成

    像平常一样点击生成订阅链接,到 Clash 中订阅,一切就完成了。

    六、一些后记

    在这篇教程的例子中,我将 chatgpt 添加到了代理列表中,如果你还没理解如何做到的,请再看一下第二步创建的配置文件。

    我相信你的好奇心和求知欲还想做更多操作,所以你应该会想看看官方文档:https://github.com/tindy2013/subconverter/blob/master/README-cn.md

    一个关于性能的小 tip

    subconverter 默认展开规则,但实际上 rule provider 的性能更好,在正文里没有提到这点是因为开启这个选项可能导致无法订阅,因为 clash 更新 provider 是通过直连。

    如果有能力,最好还是使用 provider ,ip-cidr 和 domain 两种类型的 rule set 可以带来非常大的速度提升和内存节省,stash 的 wiki 里也有提到这一点,具体原因和解释可以看 https://t.me/AirixCloud/36

    如果你觉得这个帖子有用的话,希望不要只点击收藏,可以回复来讨论或者提问,或者点一下标题下面的箭头,我更希望和各位有更加直接的交流,不需要担心自己提的问题过于简单,感谢~

    第 1 条附言  ·  256 天前

    原本不想吐槽的,结果回复里还是出现了。

    1. 这篇帖子的意义就在于说明 “subconverter 拥有远程配置功能,无需自行搭建也可以利用别人提供的 subconverter 实现自定义规则”

    2. parsers、自行编辑脚本等方法最大的问题在于两点。一是 parsers 是 CFW 的功能而不是 clash 核心的功能,你定义好之后只能在 cfw 使用,在 android、 ios、路由器上就无法使用了。第二它不具备跨平台同步功能,你需要手动维护各个客户端上的规则,如果你只有一个设备这样使用当然没问题。

    3. 末尾提到 provider 只是为了给 有足够能力理解文章主要内容,并且想要优化内存占用和性能的人 准备的,如果连 Clash 的一些基本概念都没理解,暂时没必要关注这个。

    4. Clash.Meta 的订阅转换功能是让他可以识别非 clash 格式的节点,本文的内容是 “如何利用订阅转换工具自定义分流规则”,#5 真的不是关键词机器人吗?

    60 条回复    2024-01-13 10:54:45 +08:00
    Moha
        1
    Moha  
       256 天前
    感谢分享
    paststrange
        2
    paststrange  
       256 天前
    airixcloud 所说的 rule-set 不要展开是啥意思
    studyingss
        3
    studyingss  
    OP
       256 天前   ❤️ 1
    @paststrange “subconverter 默认展开规则,但实际上 rule provider 的性能更好”,所以推荐使用 provider
    要了解 provider 可以看 clash 的官方文档 https://dreamacro.github.io/clash/premium/rule-providers.html
    或者 https://lancellc.gitbook.io/clash/clash-config-file/proxy-provider

    要让 subconverter 不展开规则,在订阅链接末尾加上&expand=false ,但是又可能导致订阅无法使用,原因正文说过了。

    说得直观一点,就是打开配置文件,如果 rule 里全部都是域名和 ip ,那么规则就是展开的,这时性能非常差,并且占内存。
    如果 rule 下面是 RULE-SET ,那么就叫做不展开,这时性能更好,匹配速度更快( 34 万规则 7 微秒),内存占用更小。

    另外,rule set 也分类型,classic 没有优化作用,ip cidr 和 domain 有强力的优化作用,这部分具体还是看 https://lancellc.gitbook.io/clash/clash-config-file/proxy-provider
    DemoJameson
        4
    DemoJameson  
       256 天前
    如果用 Clash.Meta 内核也能从 rule provider 获益么
    lekai63
        5
    lekai63  
       256 天前
    现在完全切换到 clash meta 了。感觉不需要订阅转换了。
    jiezhi
        6
    jiezhi  
       256 天前 via iPhone
    感谢分享 回去试试
    canbingzt
        7
    canbingzt  
       256 天前 via iPhone
    我是用 parsers 来添加的
    Helsing
        8
    Helsing  
       256 天前 via iPhone
    @studyingss #3

    不用 classic ,订阅规则都不好找

    按照你觉得做法维护起来也不简单,还不如搭建 subconverter ,搭好了省心的很
    studyingss
        9
    studyingss  
    OP
       256 天前
    @Helsing 你真的有看正文吗?
    luckyjoe
        10
    luckyjoe  
       256 天前
    收藏 有空了整
    studyingss
        11
    studyingss  
    OP
       256 天前
    @Helsing 从你的回复我大致可以确定你完全不懂,但是为了以防可能的误解,以及你的回复误导别人,我针对你提出的两个问题详细解释一下。

    第一个,关于 provider

    参考 https://lancellc.gitbook.io/clash/clash-config-file/rule-provider

    classic 类型的 provider 的格式是


    ```
    payload:
    - '.blogger.com'
    - '*.*.microsoft.com'
    - 'books.itunes.apple.com'
    ```

    domain 类型的 provider 的格式是

    ```
    payload:
    - DOMAIN-SUFFIX,google.com
    - DOMAIN-KEYWORD,google
    - DOMAIN,ad.com
    - SRC-IP-CIDR,192.168.1.201/32
    - IP-CIDR,127.0.0.0/8
    - GEOIP,CN
    - DST-PORT,80
    - SRC-PORT,7777
    ```

    你说的“订阅规则都不好找”是什么意思?你要说是找不到文件,配置文件里路径写的明明白白的,正常使用情况下也不用手动找。但是如果你的意思是“- DOMAIN-SUFFIX,google.com”比“.blogger.com”更容易看我觉得更奇怪。

    第二,“不如搭建 subconverter”,你真的有搭建过吗?我搭建过。你知道自定义规则需要怎么做吗?依然需要写这个格式的配置。

    对比来说,我的教程只是把自建的时候写到“配置文件”部分的内容,移动到了“外部配置”这部分,我很想知道你说的省心是指省心在哪里?

    给其他人:关于这部分内容,可以参考
    https://github.com/tindy2013/subconverter/blob/master/README-cn.md

    或许你的语言表达有误,但是单从你的这一条回复来说是基本概念没有分清的状态。
    azhangbing
        12
    azhangbing  
       256 天前
    这个非常有用 我用 clash for window 的 diff 很不好用 不会自动合并订阅的变化 每次要手动加
    Helsing
        13
    Helsing  
       256 天前 via iPhone
    @studyingss #11

    我搭 subconverter 用了快两年了,我不懂……

    另外,你把 domain 和 classic 写反了
    dl123100
        14
    dl123100  
       256 天前
    虽然远程配置就是加上&config=,但是因为出过 RCE ,明面上支持远程配置的 subcoverter 公益站不多吧,很多连上传配置功能实际都没法用。
    studyingss
        15
    studyingss  
    OP
       256 天前
    @Helsing 手滑贴反了,那么请你回答一下两个问题?省心在哪里?又不方便看在哪里?
    Helsing
        16
    Helsing  
       256 天前 via iPhone
    @studyingss #11

    要加自定义规则也很简单:

    1. 熟悉 subconverter 的话,加一个 provider 并不比你这样操作麻烦多少

    2. 如果不是在 openclash 这样的客户端用的话,桌面端基本都有 parser 可以添加规则,不比你这个要方便?
    hfl1995
        17
    hfl1995  
       256 天前
    ruleset=🎯 V2EX,https://raw.githubusercontent.com/lageev/chatgpt-openclash/main/v2ex.list
    ruleset=🎯 Chatgpt,https://raw.githubusercontent.com/lageev/chatgpt-openclash/main/chatgpt.list

    我平时需要自定义的就是 ChatGPT 和 V2 ,V2 节点要是选不好,容易进不去或者不显示头像
    civelxu
        18
    civelxu  
       256 天前
    Rule Provider 支持在 clashX 上使用吗?
    Mac 上的 clash for windows 体验太差。
    Hoshizora
        19
    Hoshizora  
       256 天前 via Android
    meta 和 premium 内核不是支持代理和规则集的订阅吗? proxy-provider 和 rule-provider 一起使用会更方便啊,还能通过 clash 自身来管理订阅的更新,配置文件也跟简洁
    thet
        20
    thet  
       256 天前 via iPhone
    studyingss
        21
    studyingss  
    OP
       256 天前
    @Hoshizora 确实,你说的这个方法更好。
    airbotgo
        22
    airbotgo  
       256 天前
    感谢楼主提供这么好的教程。对非程序员是一个很好的指导。
    SimonOne
        23
    SimonOne  
       256 天前
    @civelxu #18 clashx pro 支持,clashx 不知道
    bobbyshmurda
        24
    bobbyshmurda  
       256 天前
    看不懂,我还是用 V2RAY 3.29 版本号了。
    fox233
        25
    fox233  
       256 天前
    @thet 怎么用呢
    beyondgamp
        26
    beyondgamp  
       256 天前 via iPhone
    这个必须关注了
    GoodRui
        27
    GoodRui  
       256 天前 via Android   ❤️ 2
    我是一直不理解,为什么只有苹果系的 APP ,qx 、surge 、loon 等采用订阅节点和规则分离的架构模式?其它平台的软件为什么就没有一个这种采用灵活架构的配置文件的软件啊? clash 真的难用,不过现在躺平了,只用机场自带的配置文件懒得折腾了,除非万不得已必须要用就手动从 clash 里。加两条规则,但是一更新配置就完蛋了。
    chen7ie
        28
    chen7ie  
       255 天前
    @GoodRui 按照正常思维或者说“刻板印象”来看,我也觉得 ios 限制颇多,安卓应该有更牛逼更方便的 app 。最近买了个安卓手机双持,才发现还是 qx Loon 香啊
    95276
        29
    95276  
       255 天前
    Jaeden
        30
    Jaeden  
       255 天前
    楼主遇到过订阅转换失败吗,我之前用了 jsDriver 还是失败,换了个配置文件的地址就好了
    hehehu
        31
    hehehu  
       254 天前
    OP 可以帮我看下我这个场景的规则应该怎么配置吗? https://www.v2ex.com/t/949694
    Hoshizora
        32
    Hoshizora  
       254 天前 via Android
    @GoodRui #27 clash 的 rule provider 和 proxy provider 就是负责规则和代理分类
    635614874
        33
    635614874  
       254 天前
    @Hoshizora 那如何操作实现每次更新代理配置只更新 proxy 而保留我的 rule 呢
    binghe
        34
    binghe  
       254 天前
    @thet clash 竟然还支持 AdGuard 的规则写法吗?我目前在用的是 clash for Windows ,不知道能否支持。
    thet
        35
    thet  
       253 天前 via iPhone
    @binghe #34 不支持,只是我放一起了
    molezznet
        36
    molezznet  
       253 天前
    请问下作者,用了这个 gist 和 list 组合后,是否可以替代删除掉以下文件中的 rules 了?
    ```当初随便拿来放临时配置的 gist 也有了 50 多个 star https://gist.github.com/miaomiaoclub/6947f7cb93846301f1658da0edcd61bf
    ```
    binghe
        37
    binghe  
       253 天前
    @thet 🆗
    Hoshizora
        38
    Hoshizora  
       251 天前 via Android
    @635614874 #33 你可以订阅你自己的 rule ,然后在配置文件里用你自己的 rule 组名就行
    ob
        39
    ob  
       249 天前
    打扰下,第四步的,“打开之后先像平常一下在订阅链接里填上订阅。以及远程配置这个”,CFW 我没找着,是我姿势不对吗?能否帮忙详细描述下?谢谢
    studyingss
        40
    studyingss  
    OP
       249 天前 via Android   ❤️ 1
    @ob 你需要打开的是订阅转换网站。
    binghe
        41
    binghe  
       241 天前
    @studyingss subconverter 默认都没有 DNS 配置,再讲讲 DNS 配置方面吧。
    studyingss
        42
    studyingss  
    OP
       241 天前 via Android
    @binghe

    正确配置的规则应该完全不依赖 dns ,因为需要代理的连接在触碰到 ip rule 之前就被分流走了,dns 只用来偶尔负责兜底一些不在分流规则的网站。

    关注 dns 配置的无非就是天天说 dnsleak 的人。

    然而 dns 泄露是个伪命题,或者说这个用于 vpn 的名词根本没办法套用到需要分流的场景里。

    举个简单的例子,假如不知道域名 A 该走代理还是直连,这个时候就需要做 dns 解析,那应该先用远程 dns 解析还是本地 dns 解析呢?

    1. 用远程 dns ,会导致有海外 cdn 的网站分流错误,国内网站解析不到最优 cdn ,结果是显著影响国内网站的体验。

    2. 用本地 dns ,就会出现所谓“dns 泄露”。

    dns 泄露是 vpn 厂家发明出来的,他们的用户完全没有分流需求,要的就是极致的隐私保护,当然就不存在以上问题。用这种概念往分流代理工具上硬套完全就是庸人自扰。

    上面这段话全是事实,教程当然可以写,但是如果实事求是把这些东西讲出来,天天发 dnsleaktest 截图那帮人就不爱听了,而不关注 dns 的其他用户又不会点,结果就是根本没人看。

    y2b 上一帮哗众取宠的博主拿个概念唬小白,给出来个笑话一样的解决方案,骗到播放量跟粉丝完事,他们才不关心实际体验怎么样。

    比方说某三字主播,给的方案是所有 ip rule 加上 no resolve ,那当然没泄露了,代价是所有 ip 规则的兜底作用全部废掉,用了他的规则之后,只要是没在域名列表里面的连接要么全直连要么全代理,全代理就是国内网站巨慢,全直连就是国外网站上不去。但他才不管,小白爱听就完事了。
    binghe
        43
    binghe  
       241 天前
    @studyingss ok ,因为之前看到别人的配置文件,有些有 DNS ,有些则没有。然后用 subconverter 转换的,默认则全部没有加 dns ,我也感觉很奇怪,到底是 dns 是因为无法相对“通用”,所以默认生成的配置才没有。还是不是那么重要才没加上。
    而我因为也不了解,自己收集了一份 ip 地址,倒是统统加上了 no-resolve 。然后转换链接经过 expend=false 后,生成规则则全部都自动去掉了 no-resolve ,变成如下。
    ```
    payload:
    - '129.146.102.194/8'
    - '129.146.46.164/8'
    - '129.146.48.191/8'
    ```

    我还在想着什么时候再问问。。。

    看了你的回答后,我觉得还是跟着搞规则或者工具的人的步伐。
    studyingss
        44
    studyingss  
    OP
       241 天前 via Android
    @binghe 如果你是说 subconverter 想转出来自带 dns 配置的话,有一个叫 clash 模板的配置,你可以写好然后指定一下。

    去官方文档里面搜 clash_rule_base 就好。

    转换之后会丢掉 no resolve 这个我也没找到好办法,如果对 clash 配置再熟悉一点的话,可以手写 rule 部分来实现,我目前是这样做的。
    JimmyChan1506
        45
    JimmyChan1506  
       236 天前
    可以当个无耻的伸手党吗? 楼主可否发一下生成的最终配置? 把订阅相关的东西去掉发出来?
    @studyingss
    garyvalue
        46
    garyvalue  
       234 天前
    请问能实现这种需求吗
    用户→机场 A 中转服务器→机场 A 落地服务器→机场 B 落地服务器
    studyingss
        47
    studyingss  
    OP
       234 天前 via Android
    @garyvalue 如果 b 的落地你也有办法直接连上就可以
    garyvalue
        48
    garyvalue  
       234 天前
    @studyingss #47 b 的落地可以直接连上,但是需要怎么操作呢,毕竟只能得到订阅链接
    studyingss
        49
    studyingss  
    OP
       234 天前
    @garyvalue 这个问题问 Google 吧,已经有不少现成的教程了。
    binghe
        50
    binghe  
       229 天前
    ”subconverter 默认展开规则,但实际上 rule provider 的性能更好“

    这句话的意思是不是:
    subconverter 默认会把所有规则写入配置文件,而造成性能相对下降。
    RJY
        51
    RJY  
       181 天前
    感谢 OP ,按照这个方案搞定了 windows 设备间规则的同步。
    RJY
        52
    RJY  
       181 天前
    感谢 OP ,刚想找到如何让 subconverter 如何不展开 rule ,就在回答里找到了答案。
    RJY
        53
    RJY  
       181 天前
    查了一下,https://github.com/Dreamacro/clash/issues/1165 这条 issue 大概解释清楚了 rule-provider 三个 behavior 的区别。

    ----------------------------------------------------------------
    「 classical 是朴素的规则,支持其他所有的 rule ,但由于整个 rule 是一起的,所以当包含需要解析 dns 的规则时,整个 rule 被视为需要 dns 解析,所以要对 classical 做适当拆分(当然如果不在乎 dns 解析忽略即可)

    ipcidr 和 domain 是对大量的 ipcidr 和域名规则做优化,能在有大量规则的同时还保持着很快的匹配速度,当然这是以牺牲内存为代价换来的匹配速度(以目前的实现来说,几十万的规则大概占用几十兆内存)。台式机不在乎那点内存,但一些性能受限的设备可能很在乎。」
    Temtselt
        54
    Temtselt  
       103 天前
    感谢楼主!
    Mickeyy
        55
    Mickeyy  
       99 天前
    感谢楼主,真的帮大忙了,小白还有个问题,这个 Gits 可以和本地的编译器之类的同步吗?每次改规则都要去 Github 有点麻烦
    studyingss
        56
    studyingss  
    OP
       95 天前
    @Mickeyy vscode 里有个叫做 gist 的插件,我是用那个编辑的,感觉还不错。
    zwyyy456
        57
    zwyyy456  
       67 天前
    @studyingss 有个问题请教一下,domain 模式的 rule-set ,"+.google.com" 会同时匹配 "google.com" 和 "www.google.com" 吗?
    另外,规则文件其实不需要放在 gist ,完全可以自己建立一个 repo 把规则都放进去,可以通过 raw.githubusercontent.com 像 gist 那样直接下载文件。
    zwyyy456
        58
    zwyyy456  
       67 天前
    以及,ip-cidr 类型的 rule-set ,例如 cncidr ,是在 cncidr 的文件里面加上 no-resolve 还是 RULE-SET,cncidr,DIRECT,no-resolve 呢?
    z5238384
        59
    z5238384  
       48 天前
    楼主,你好,我完整 的看了你的思路,也阅读 了 subconverter 的文档,目前还是遇到些困难,个人小白一枚,只能求助:
    情况:
    1. 我的机场提供了一份完整的 clash 配置订阅文件。
    2. 自己在原配置文件上增加了 一些分流规则,修改了配置文件头部的一些信息,目前是在 CFW 上使用 diff 来完成的。

    期望目标:
    我希望通过 subconverter 来实现:保留机场的完整 clash 配置,仅仅把我定义的规则和修改过的几项配置,每次刷新订阅,通过类似 CFW 中 diff 功能那样的合并方式,生成新的订阅链接。

    目前想法:
    使用机场完整的 clash 配置文件,作为 clash_rule_base 的参数。 但是机场 clash 的配置中,并没有使用 subconveter 中模板文件那样的 INJA 语法,base 文件中并不是这样的语法:

    意味着我无法通过在外部配置文件中使用如下字段,设置 clash 头部的单项参数:
    [[template.local]]
    key = "clash.socks_port"
    value = "7891"

    个人目前得出的结论是 subconverter 似乎并适合处理上述这种情况, 特来求助,有没有其他什么方式能实现我期望的目标。
    万分感谢,写的罗里吧嗦,希望大佬不要介意。
    gtshine
        60
    gtshine  
       46 天前
    我也希望能保留机场配置, 然后给 proxy-groups 中的某个 group.proxies 增加选择, 刚接触 subconverter. 文档看的头晕.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1002 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:49 · PVG 06:49 · LAX 14:49 · JFK 17:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.