12 KiB
12 KiB
✅分清 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
核心根源:
- Mihomo‑Meta:标准 YAML 无序 Map,多条 geosite 命中无顺序,随机选择;
- Stash(iOS):魔改 Clash‑Meta,map 保留配置书写顺序;多条 geosite 命中按从上到下取第一条;
- 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 行为:
- apple 国内域名匹配第一条
apple@cn,直接走 dns‑cn,不会落到下面apple规则; - apple 海外域名匹配第二条
apple,直接终止,不会走到geolocation‑!cn; - 剩下其他海外域名才命中
geolocation‑!cn。
因为是数组 list,天然顺序优先,加上
@cn标签权重,不需要集合差集。
关键要点总结,解决你之前的混淆
- 截图文档只针对 Mihomo‑Meta:
nameserver‑policy为无序 map,多条 geosite 命中随机,不看上下行。 - Stash 属于特例:同样写 YAML map,内部做改造保留配置顺序;只在 Stash 内生效,换到 Mihomo 立刻失效。不要依赖这个特性,尽量消除域名重叠。
- Sing‑Box 逻辑完全不一样:DNS 规则是数组,顺序执行;
@xxx标签有内置优先级,不用差集。 - 一份配置通吃三者的唯一办法:集合差集消除所有 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 可以识别加载
关键点说明
type: direct:Direct 直连节点,流量直接本地出站,不经过任何代理服务器。udp: true:开启 UDP 支持,DNS、QUIC 流量允许走这个直连节点。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 |