# ✅分清 4 个容易混淆字段(Stash/mihomo) 表格 | 参数 | 干什么用 | | --- | --- | | `default‑nameserver` | 解析 DoH/DoT DNS 服务器自身域名(引导启动)GitHub | | **`proxy‑server‑nameserver`** | **只解析代理节点 server 域名,直连出站**Stash | | `nameserver` | 用户正常上网,网站域名的主 DNS | | `nameserver‑policy` | 指定某些域名 /geosite 强制用某组 DNS | # ✅proxy‑server‑nameserver ``` `proxy‑server‑nameserver` 只负责ssr.ee解析代理节点本身的域名, 不处理日常访问域名解析。 ``` # ✅nameserver-policy: ``` '+.ssr.ee': ['system', '223.5.5.5'] '+.sswiwi.com': ['system', '223.5.5.5'] '+.oracle.com': ['system', '223.5.5.5'] 'geosite:apple@cn': ['system', '223.5.5.5'] 'geosite:cn': ['system', '223.5.5.5'] 'geosite:apple': ['1.1.1.1', '8.8.8.8'] 'geosite:geolocation-!cn': ['1.1.1.1', '8.8.8.8'] 优先级上至下,geosite单独一行,dns不能加#节点,不支持rule-set Stash 会**并发请求 policy 里全部 DNS 上游**,1.1.1.1 和 8.8.8.8 同时走代理并发查询,取最快返回结果 字典的 key 没有从上到下的匹配优先级,**不是写在前面就优先**。 内核内部匹配优先级固定: `精确域名` > `通配符 +.shturl.` > **geosite 集合(所有 geosite 之间不分先后)** ### 总结关键点 1. `nameserver‑policy` 是字典,**geosite 之间调换书写顺序不能控制优先级**。 2. 想要强制某一类域名优先,用**通配符 `+.shturl.`**,它优先级高于全部 geosite 集合。 3. `geosite:apple`集合里很多域名同时属于`geolocation‑!cn`,只写 geosite 会出现解析策略不确定。 ``` ## 1. nameserver-policy: sing‑box vs mihomo 对比小结 表格 | 项目 | sing‑box | mihomo | | --- | --- | --- | | `geosite:xxx@tag`权重 | 内置更高优先级,自动优先匹配 | 无内置优先级;map 无序,同时命中会随机选一条 | | DNS# 出站标记语法 | 格式不一样,server 里写`detour`字段 | 支持`dns‑addr#策略组名` | | 解决 apple@cn+apple 冲突 | 直接写两条即可 | 必须用集合差集 `geosite:apple,!apple@cn` | ## 2. 完整可直接复制的 mihomo dns 片段示例 ``` dns: enable: true respect-rules: true # 开启,#节点选择标记才生效 nameserver-policy: 'geosite:apple@cn': [system, 223.5.5.5] '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语法写法 ``` nameserver: - '1.1.1.1#节点选择' 只能在这里加#节点 - '8.8.8.8#节点选择' 只能在这里加#节点 ``` # ✅default-nameserver: ``` ['system','223.5.5.5'] dns模块都支持写system ``` # proxies:语法有效性 ``` proxies: - {name: "🟢 直连", type: direct, udp: true, ip-version: ipv4} ``` ✅ **YAML 行内对象语法合法,Stash 可以识别加载** ## 关键点说明 1. `type: direct`:Direct 直连节点,流量直接本地出站,不经过任何代理服务器。 2. `udp: true`:开启 UDP 支持,DNS、QUIC 流量允许走这个直连节点。 3. `ip‑version: ipv4`:强制只用 IPv4 出站,不使用 IPv6。 ## 小坑 - direct 节点**没有 server、port 字段**,本身就不需要填写,direct 类型特殊。 - 图标 emoji `🟢` Stash 完全支持显示。 - 你定义完之后,就可以在 proxy‑groups 里面引用 `🟢 直连` 这个名字。 ### proxy‑groups 使用示例 ``` proxy-groups: - name: "节点选择" type: select proxies: - "🟢 直连" - 你的其他节点 ``` ## 等价展开写法(方便阅读,效果完全一样) ``` proxies: - name: "🟢 直连" type: direct udp: true ip-version: ipv4 ``` ## ⚠️重要提醒 这个自定义`🟢 直连`和内核内置 DIRECT 不是同一个东西: - 内置常量 `DIRECT`:rules 里写`- GEOSITE,cn,DIRECT`,调用内核内置直连。 - 你手动新增的`🟢 直连`是一个**自定义代理项**,只能在 proxy‑groups 里面选择使用;**不能直接写在 rules 里面**,rules 不识别这个自定义名字。 > > rules 分流只能用系统保留字 `DIRECT`,不要写`🟢 直连`,会匹配失败。 > 如果想让分流使用你这个自定义直连节点,就把它放进 proxy‑groups,rules 指向组名。 小结: - 在`proxies:`块里定义:✅有效 - 在 proxy‑groups 选择使用:✅有效 - 在 rules 直接写`🟢 直连`:❌无效,必须用保留字`DIRECT`。 ## fake‑ip‑filter📌关键区分表 表格 | 项目 | 原版 Mihomo (Android/Linux/Windows) | Stash‑iOS | | --- | --- | --- | | blacklist 模式下写 `- rule‑set:xxx` | ✅原生支持 | ❌不生效,被裁剪 | | blacklist 模式下写 `- geosite:xxx` | ✅支持 | ✅支持 | | fake‑ip‑filter‑mode: rule | ✅完整支持 | ✅内核存在,但**官方 Wiki 不记载**,属于继承特性 | | rule 模式语法 `RULE‑SET,xxx,real‑ip` | ✅原生支持 | ✅可以用,但文档无记录 | ## 2、规则模式 `fake‑ip‑filter‑mode: rule` 完整规则语法,和外层`rules:`语法一致,自上而下匹配,**每条末尾必须写动作 `fake‑ip` / `real‑ip`**GitHub。 ✅完整支持:`GEOSITE`、`RULE‑SET`、`DOMAIN`、`MATCH`。 ``` dns: enhanced-mode: fake-ip fake-ip-filter-mode: rule fake-ip-filter: - '*.lan,real-ip' - 'GEOSITE,private,real-ip' - 'RULE‑SET,salem@cn,real‑ip' - 'MATCH,fake‑ip' ``` 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 |