From 1b97860dfdb90c7aa31852f7fe8e7e933d112bf3 Mon Sep 17 00:00:00 2001 From: salem <77879189@qq.com> Date: Sun, 30 Aug 2026 18:25:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20config/stash/stash-config-?= =?UTF-8?q?wiki.MD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/stash/stash-config-wiki.MD | 159 +++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) diff --git a/config/stash/stash-config-wiki.MD b/config/stash/stash-config-wiki.MD index 51189c2..ea753de 100644 --- a/config/stash/stash-config-wiki.MD +++ b/config/stash/stash-config-wiki.MD @@ -58,7 +58,152 @@ dns: 'geosite:apple,!apple@cn': [1.1.1.1#节点选择, 8.8.8.8#节点选择] 'geosite:cn': [system, 223.5.5.5] ``` +# nameserver‑policy 三大内核完整对比:Mihomo‑Meta / Stash / Sing‑Box +> +> 核心根源: +> +> +> 1. **Mihomo‑Meta**:标准 YAML 无序 Map,多条 geosite 命中无顺序,随机选择; +> 2. **Stash(iOS)**:魔改 Clash‑Meta,map 保留配置书写顺序;多条 geosite 命中按从上到下取第一条; +> 3. **Sing‑Box**:`dns.rules`是**数组(list)**,天生从上到下依次判断,匹配即停止;并且 geosite 标签内置权重逻辑。 + +## 完整优先级总表 + +表格 + +| 项目 | Mihomo‑Meta | Stash(iOS) | Sing‑Box | +| --- | --- | --- | --- | +| 配置底层结构 | YAML Map(无序字典) | YAML Map,但 Stash 内部保留插入顺序 | `dns.rules`是**Array 数组,有序** | +| 大类固定优先级 | 精确域名 > 通配符 > geosite 集合 | 精确域名 > 通配符 > geosite 集合 | 精确域名 > 通配符 > geosite 集合 | +| **多个 geosite 同时命中** | 全部 geosite 平级,**无顺序,随机选一条**,和 yaml 行位置无关 | 按 YAML 从上到下,匹配到第一条 geosite 即生效 | 按数组从上往下,匹配第一条规则立刻终止 | +| `geosite:xxx@tag`标签 | 无特殊权重,普通 geosite 集合 | 无特殊权重,普通 geosite 集合 | **@标签自带更高优先级**,`geosite:apple@cn`优先于普通`geosite:apple`,不需要差集 | +| policy 内部`ip#group`语法 | ✅支持 nameserver‑policy 内写`1.1.1.1#节点选择` | ❌policy 内 #无效,# 仅顶层 nameserver 生效 | ❌无`#group`语法,DNS 出站由`detour`指定 | +| DNS 上游 fallback 行为 | 数组顺序,失败依次切换 | 并发查询,取最快返回 | 数组顺序,失败依次切换 | +| 关键开关 | `respect‑rules: true`开启 #detour | `follow‑rule: false`本方案不开启 | 无开关,每个 nameserver 独立配置 detour | + +--- + +## 分别示例(苹果分流,海外同时命中 apple 和 geolocation‑!cn) + +### 1. Mihomo‑Meta(无序 map,必须消除重叠) + +> +> 同域名命中多条 geosite → 随机选 policy,**严禁依赖书写顺序,必须差集语法** + +``` +dns: + enable: true + respect-rules: true + nameserver-policy: + 'geosite:apple@cn': [223.5.5.5] + 'geosite:apple,!apple@cn': ["1.1.1.1#节点选择","8.8.8.8#节点选择"] + 'geosite:geolocation-!cn,!apple': ["1.1.1.1#节点选择","8.8.8.8#节点选择"] + 'geosite:cn': [223.5.5.5] +``` + +> +> 必须写 `geolocation‑!cn,!apple`,把 apple 域名排除,彻底消除域名重叠,避免随机命中。 + +### 2. Stash (iOS)(map 保留书写顺序,但建议依然消除重叠) + +> +> 虽然 Stash 可以靠行顺序优先匹配上方`apple,!apple@cn`,但是迁移 Mihomo 直接出 bug。最佳实践依然消除重叠。 + +``` +dns: + enable: true + follow-rule: false + nameserver: + - 223.5.5.5 + - "1.1.1.1#节点选择" + - "8.8.8.8#节点选择" + nameserver-policy: + 'geosite:apple@cn': [223.5.5.5] + 'geosite:apple,!apple@cn': [1.1.1.1, 8.8.8.8] + 'geosite:geolocation-!cn,!apple': [1.1.1.1, 8.8.8.8] + 'geosite:cn': [223.5.5.5] +``` + +### 3. Sing‑Box(dns.rules 是数组,从上往下匹配,支持 @标签权重) + +> +> Sing‑Box **不需要差集 `,!apple@cn`**:`geosite:apple@cn`标签自带高优先级;规则数组从上往下执行,命中立刻停止。 +> Sing‑Box 没有`nameserver‑policy`,等价能力在 `dns.rules`。 + +``` +"dns": { + "nameserver": [ + { + "tag": "dns‑cn", + "address": "223.5.5.5", + "detour": "direct" + }, + { + "tag": "dns‑proxy", + "address": "1.1.1.1", + "detour": "节点选择" + }, + { + "tag": "dns‑proxy2", + "address": "8.8.8.8", + "detour": "节点选择" + } + ], + "rules": [ + {"geosite": ["apple@cn"], "server": "dns‑cn"}, + {"geosite": ["apple"], "server": ["dns‑proxy", "dns‑proxy2"]}, + {"geosite": ["geolocation‑!cn"], "server": ["dns‑proxy", "dns‑proxy2"]}, + {"geosite": ["cn"], "server": "dns‑cn"} + ] +} +``` + +Sing‑Box 行为: + +1. apple 国内域名匹配第一条`apple@cn`,直接走 dns‑cn,不会落到下面`apple`规则; +2. apple 海外域名匹配第二条`apple`,直接终止,不会走到`geolocation‑!cn`; +3. 剩下其他海外域名才命中`geolocation‑!cn`。 + +> +> 因为是数组 list,天然顺序优先,加上`@cn`标签权重,不需要集合差集。 + +--- + +## 关键要点总结,解决你之前的混淆 + +1. **截图文档只针对 Mihomo‑Meta**:`nameserver‑policy`为无序 map,多条 geosite 命中随机,不看上下行。 +2. **Stash 属于特例**:同样写 YAML map,内部做改造保留配置顺序;只在 Stash 内生效,换到 Mihomo 立刻失效。**不要依赖这个特性,尽量消除域名重叠**。 +3. **Sing‑Box 逻辑完全不一样**:DNS 规则是数组,顺序执行;`@xxx`标签有内置优先级,不用差集。 +4. **一份配置通吃三者的唯一办法:集合差集消除所有 policy 之间域名重叠**。也就是大集合做排除 `geolocation‑!cn,!apple`,同一个域名最多只会命中一条 policy,不受内核优先级差异影响。 + +## 踩坑实例 + +> +> ❌ 危险写法(Stash 能跑,Mihomo 随机故障) + +``` +nameserver-policy: + 'geosite:apple,!apple@cn': [1.1.1.1] + 'geosite:geolocation-!cn': [8.8.8.8] +``` + +- Stash:因为顺序,apple 海外域名命中第一条; +- Mihomo‑Meta:apple 海外域名同时命中两条,随机选 1.1.1.1 或者 8.8.8.8,结果不可控。 + +> +> ✅安全写法,三者兼容 + +``` +nameserver-policy: + 'geosite:apple@cn': [223.5.5.5] + 'geosite:apple,!apple@cn': [1.1.1.1,8.8.8.8] + 'geosite:geolocation-!cn,!apple': [1.1.1.1,8.8.8.8] + 'geosite:cn': [223.5.5.5] +``` + +如果你需要,我可以输出三份可以直接复制粘贴、完全消除域名重叠的成品完整配置。 +---nameserver-policy:结束 # ✅nameserver语法写法 @@ -158,4 +303,16 @@ dns: - 'GEOSITE,private,real-ip' - 'RULE‑SET,salem@cn,real‑ip' - 'MATCH,fake‑ip' -``` \ No newline at end of file +``` +x + +表格 + +| 项目 | Stash(iOS) | Mihomo‑Meta | Sing‑Box | +| --- | --- | --- | --- | +| policy 内写`ip#组名` | ❌不支持 | ✅支持 | ❌无此语法 | +| `#`有效位置 | 仅顶层`nameserver` | 顶层 /nameserver‑policy | `detour`字段 | +| 是否需要差集`,!apple@cn` | ✅建议使用 | ✅必须使用 | ❌不需要 | +| 开关 | `follow‑rule:false` | `respect‑rules:true` | 无开关,靠 detour | +| geosite 匹配规则 | 从上往下顺序匹配 | map 无序 | 内置 tag 权重优先 | +| DNS 数组行为 | 并发抢最快 | 顺序 fallback | 顺序 fallback | \ No newline at end of file