yyhhyy's blog

yyhhyy

Mihomo Party 覆写

776
2024-10-29

请大家先看看我的上一篇文章:Mihomo自用配置 再观看以下内容,理解起来可能更为顺畅!

1. 起因

Windows我自己一直都是用的clash,从最早的clash for Windowsclash verge再到clash verge rev然后回到裸核,最后又发现了一个不错的软件Mihomo Party,从他不到几十个star用到现在,个人感觉体验下来还是十分不错的~ 也推荐使用,裸核用久了还是十分焕然一新的~

项目地址:https://github.com/mihomo-party-org/mihomo-party

我其实写了一份自用的mihomo.yaml配置,不过在mihomo pary上还是想把覆写玩起来,于是多方借鉴下,自己也折腾了一份覆写。

仓库:https://github.com/yyhhyyyyyy/selfproxy

覆写脚本:https://github.com/yyhhyyyyyy/selfproxy/blob/main/Mihomo/Mihomo_Party/party.js

希望大伙看到能点个小小的star,这样写文章比较有动力哈哈

2.覆写内容

2.1 覆写规则

规则在Mihomo中是重中之重的,因此就先写了

我的整体规则组成很简单 ,大体分成两个部分且请遵循我写的先后顺序:nonip(非ip类)>ip(ip类) 原因请看 Mihomo自用配置

  • nonip

    adNonipRules>customRules>nonipRules

    整体就是去广告规则集放最先,之后是自定义规则集(这边是为了保证优先级,所以这么放进来了,里面放nonip和ip类规则都行,就是保证其优先级),最后再放入非ip类的规则集即可

  • ip

    直接放入 ipRules 即可

最后的顺序也就是 adNonipRules>customRules>nonipRules>ipRules

// 覆写规则
function overwriteRules (params) {
    const adNonipRules = [
        "RULE-SET,reject_non_ip,REJECT",
        "RULE-SET,reject_domainset,REJECT",
        "RULE-SET,reject_non_ip_drop,REJECT-DROP",
        "RULE-SET,reject_non_ip_no_drop,REJECT"
    ];
​
    const customRules = [
        // 在此添加自定义规则,优先级次于ad。例子:
        // "DOMAIN,baidu.com,DIRECT",
      ];
​
    const nonipRules = [
        "RULE-SET,cdn_domainset,🎯 节点选择",
        xxxxx
    ];
​
    const allNonipRules = [
        ...adNonipRules,
        ...customRules,
        ...nonipRules
    ];
​
    const ipRules = [
        "RULE-SET,reject_ip,REJECT",
        xxxxx
    ];
​
    const rules = [
        // 非ip类规则
        ...allNonipRules,
        // ip类规则
        ...ipRules
    ];
    
    const ruleProviders = {
        // 去广告
        reject_non_ip_no_drop: {
            type: "http",
            behavior: "classical",
            url: "https://ruleset.skk.moe/Clash/non_ip/reject-no-drop.txt",
            path: "./rule_set/sukkaw_ruleset/reject_non_ip_no_drop.txt",
            interval: 43200,
            format: "text",
            proxy: "🎯 节点选择"
        },
        xxxxx
    };
    ...  // 具体代码看github 这边只是示例

2.2 覆写代理组

这次相比于我之前写的Mihomo自用配置多了个url-test自动选择,因为上篇文章有一部分同学问我怎么没有自动选择,因此这边加入。

思路简单说下:

  1. 写好包含正则以及排除正则两者合并构造总的国家正则

  2. 写个找正则的函数

    function getProxiesByRegex (params, regex) {
        const matchedProxies = params.proxies.filter ((e) => regex.test (e.name)).map ((e) => e.name);
        return matchedProxies.length > 0 ? matchedProxies : ["COMPATIBLE"];
    }
  3. 生成自动选择代理组

        const autoProxyGroups = autoProxyGroupRegexs
            .map ((item) => ({
                name: item.name,
                type: "url-test",
                url: "https://cp.cloudflare.com",
                interval: 300,
                tolerance: 50,
                proxies: getProxiesByRegex (params, item.regex),
                hidden: true,
            }))
            .filter ((item) => item.proxies.length > 0);
  4. 手动选择代理组类似,不过这边加入了图标icon,以显示的更佳美观~具体请看仓库,代码其实差不多

  5. 划分不同的代理组

    贴个最后出来的效果图:

2.3 覆写DNS

DNS老生长谈了,这边就带过吧,如果还有疑问,可以看上篇文章 Mihomo自用配置

再简单说下我的观点,还是依旧,如果网络环境文明,那么直接使用运营商提供的DNS,如果网络环境不文明再用公共DNS。这边每个人都有每个人的见解,按照你自己的习惯想法来吧,我只不过是赞同我所理解的观点。

配置如下:

// 覆写DNS
function overwriteDns (params) {
    const dnsList = [
        "https://223.5.5.5/dns-query",
        "https://doh.pub/dns-query",
    ];
​
    const proxyDnsList = [
        "https://223.5.5.5/dns-query",
        "https://doh.pub/dns-query",
    ];
​
    const dnsOptions = {
        enable: true,
        ipv6: false,
        "prefer-h3": true, // 如果 DNS 服务器支持 DoH3 会优先使用 h3
        "respect-rules": true, // 仅对符合规则的请求使用 DNS
        "enhanced-mode": "fake-ip", // 伪装 IP
        "fake-ip-range": "28.0.0.1/8",
        nameserver: dnsList, // 其他网络请求都归他管
        "proxy-server-nameserver": proxyDnsList, // 代理服务器的 DNS
    };
    params.dns = { ...dnsOptions };
}

还需要补充一下其中的 fake-ip-filter

这个我留个坑,后面有空写个action自动同步上游fake-ip-filter 然后更新整份覆写脚本

目前就先写死 具体看仓库

2.4 覆写基本配置项

这边就没啥好讲的了直接贴上来吧

// 覆写Basic Options
function overwriteBasicOptions (params) {
    const otherOptions = {
        "mixed-port": 7890,
        "allow-lan": true,
        "unified-delay": true,
        "tcp-concurrent": true,
        "find-process-mode": "strict",
        "global-client-fingerprint": "chrome",
        profile: {
            "store-selected": true,
            "store-fake-ip": true,
        },
        ipv6: false,
        mode: "rule",
        "log-level": "warning",
        udp: true,
        sniffer: {
            enable: true,
            sniff: {
                HTTP: {
                    ports: [80, "8080-8880"],
                    "override-destination": true,
                },
                TLS: {
                    ports: [443, 8443],
                },
                QUIC: {
                    ports: [443, 8443],
                },
            },
            "skip-domain": ["Mijia Cloud", "+.push.apple.com"]
        },
    };
    Object.keys (otherOptions).forEach ((key) => {
        params [key] = otherOptions [key];
    });
}

这部份就是覆写的内容咯,具体脚本还是建议去我仓库看看,接下来就是如何在mihomo party上使用了。

2.5 覆写Tunnel

我个人还是比较推崇Tunnel模式的,也建议大伙使用Tunnel模式,比系统代理香不少~

还是老生长谈,stack的选择请看这边文章tunnel stack如何选择 不想看也没事 结论就是 一个个测试过去 测试顺序 system>mixed>gvisor 哪个最先能用 用哪个。

// 覆写Tunnel
function overwriteTunnel (params) {
    const tunnelOptions = {
        enable: true,
        stack: "system",
        device: "tun0",
        "dns-hijack": ["any:53", "tcp://any:53"],
        "auto-route": true,
        "auto-detect-interface": true,
        "strict-route": true,
    };
    params.tun = { ...tunnelOptions };
}

PS:Tunnel目前在mihomo party中没法覆写,只能通过GUI面板配置,留个占位坑,后续如果可以覆写了,直接用就行

2.6 覆写FakeIpFilter

这部分就是对这些地址,不使用fakeip的解析方式,而直接使用realip进行解析。

该部分已经实现了github action的自动更新上游的方式。具体是搭配仓库内的python脚本。有兴趣的同学可以去仓库里看看。

// 覆写DNS.Fake IP Filter
function overwriteFakeIpFilter (params) {
    const fakeIpFilter = [
        // 具体有哪些地址,请看上游,或者去仓库直接copy脚本使用即可
    ];
    params.dns["fake-ip-filter"] = fakeIpFilter;
}

2.7 覆写NameserverPolicy

实际上就是DNS分流,通俗易懂一些,你是阿里的域名,我就用阿里的DNS服务器解析自家的域名,这样更友好。

// 覆写DNS.Nameserver Policy
function overwriteNameserverPolicy (params) {
    const nameserverPolicy = {
        // 很多,具体映射看仓库脚本
    };
    params.dns["nameserver-policy"] = nameserverPolicy;
}

2.8 覆写hosts

搭配上面的覆写NameserverPolicy。

// 覆写hosts
function overwriteHosts (params) {
    const hosts = {
        "dns.alidns.com": ['223.5.5.5', '223.6.6.6', '2400:3200:baba::1', '2400:3200::1'],
        "doh.pub": ['120.53.53.53', '1.12.12.12'],
        "localhost": ['127.0.0.1']
    };
    params.hosts = hosts;
}

3. 使用教程

3.0 基本设置

请先参考我的设置页进行一次基础设置,否则可能覆写脚本不一定完全生效!

3.1 Sub-Store订阅节点

mihomo party很好的其中一个点就是在集成了 sub-store 这是非常好用的工具,我在surge上也是必装的~ 怎么添加节点具体看接下来的图

如果有多个节点一个个添加单条订阅进来就行。

因为我有多节点,所以我会用到组合订阅,组合订阅请继续看

3.2 导入覆写

  1. 如果能与github连通,那么可以使用远程导入

  1. 如果不能连通,就直接本地导入

把仓库里的脚本全部复制进来就行

3.3 订阅管理

选择刚刚导入或者新建的覆写文件,然后保存即可。

3.4 补充Tunnel面板设置


可以参照我的设置打开开关以及填写内容即可