Files
ruleset/config/stash/stash-config-wiki.MD
T

12 KiB
Raw Blame History

分清 4 个容易混淆字段(Stash/mihomo

表格

参数 干什么用
defaultnameserver 解析 DoH/DoT DNS 服务器自身域名(引导启动)GitHub
proxyservernameserver 只解析代理节点 server 域名,直连出站Stash
nameserver 用户正常上网,网站域名的主 DNS
nameserverpolicy 指定某些域名 /geosite 强制用某组 DNS

proxyservernameserver

   `proxyservernameserver` 只负责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. `nameserverpolicy` 是字典,**geosite 之间调换书写顺序不能控制优先级**。
2. 想要强制某一类域名优先,用**通配符 `+.shturl.`**,它优先级高于全部 geosite 集合。
3. `geosite:apple`集合里很多域名同时属于`geolocation!cn`,只写 geosite 会出现解析策略不确定。

1. nameserver-policy: singbox vs mihomo 对比小结

表格

项目 singbox mihomo
geosite:xxx@tag权重 内置更高优先级,自动优先匹配 无内置优先级;map 无序,同时命中会随机选一条
DNS# 出站标记语法 格式不一样,server 里写detour字段 支持dnsaddr#策略组名
解决 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]

nameserverpolicy 三大内核完整对比:MihomoMeta / Stash / SingBox

核心根源:

  1. MihomoMeta:标准 YAML 无序 Map,多条 geosite 命中无顺序,随机选择;
  2. Stash(iOS):魔改 Clash‑Meta,map 保留配置书写顺序;多条 geosite 命中按从上到下取第一条;
  3. SingBoxdns.rules数组(list,天生从上到下依次判断,匹配即停止;并且 geosite 标签内置权重逻辑。

完整优先级总表

表格

项目 MihomoMeta Stash(iOS) SingBox
配置底层结构 YAML Map(无序字典) YAML Map,但 Stash 内部保留插入顺序 dns.rulesArray 数组,有序
大类固定优先级 精确域名 > 通配符 > geosite 集合 精确域名 > 通配符 > geosite 集合 精确域名 > 通配符 > geosite 集合
多个 geosite 同时命中 全部 geosite 平级,无顺序,随机选一条,和 yaml 行位置无关 按 YAML 从上到下,匹配到第一条 geosite 即生效 按数组从上往下,匹配第一条规则立刻终止
geosite:xxx@tag标签 无特殊权重,普通 geosite 集合 无特殊权重,普通 geosite 集合 @标签自带更高优先级geosite:apple@cn优先于普通geosite:apple,不需要差集
policy 内部ip#group语法 支持 nameserverpolicy 内写1.1.1.1#节点选择 policy 内 #无效,# 仅顶层 nameserver 生效 #group语法,DNS 出站由detour指定
DNS 上游 fallback 行为 数组顺序,失败依次切换 并发查询,取最快返回 数组顺序,失败依次切换
关键开关 respectrules: true开启 #detour followrule: false本方案不开启 无开关,每个 nameserver 独立配置 detour

分别示例(苹果分流,海外同时命中 apple 和 geolocation!cn

1. MihomoMeta(无序 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. SingBoxdns.rules 是数组,从上往下匹配,支持 @标签权重)

SingBox 不需要差集 ,!apple@cngeosite:apple@cn标签自带高优先级;规则数组从上往下执行,命中立刻停止。 Sing‑Box 没有nameserverpolicy,等价能力在 dns.rules

"dns": {
  "nameserver": [
    {
      "tag": "dnscn",
      "address": "223.5.5.5",
      "detour": "direct"
    },
    {
      "tag": "dnsproxy",
      "address": "1.1.1.1",
      "detour": "节点选择"
    },
    {
      "tag": "dnsproxy2",
      "address": "8.8.8.8",
      "detour": "节点选择"
    }
  ],
  "rules": [
    {"geosite": ["apple@cn"], "server": "dnscn"},
    {"geosite": ["apple"], "server": ["dnsproxy", "dnsproxy2"]},
    {"geosite": ["geolocation!cn"], "server": ["dnsproxy", "dnsproxy2"]},
    {"geosite": ["cn"], "server": "dnscn"}
  ]
}

SingBox 行为:

  1. apple 国内域名匹配第一条apple@cn,直接走 dnscn,不会落到下面apple规则;
  2. apple 海外域名匹配第二条apple,直接终止,不会走到geolocation!cn
  3. 剩下其他海外域名才命中geolocation!cn

因为是数组 list,天然顺序优先,加上@cn标签权重,不需要集合差集。


关键要点总结,解决你之前的混淆

  1. 截图文档只针对 MihomoMetanameserverpolicy为无序 map,多条 geosite 命中随机,不看上下行。
  2. Stash 属于特例:同样写 YAML map,内部做改造保留配置顺序;只在 Stash 内生效,换到 Mihomo 立刻失效。不要依赖这个特性,尽量消除域名重叠
  3. SingBox 逻辑完全不一样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 海外域名命中第一条;
  • MihomoMeta: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. ipversion: ipv4:强制只用 IPv4 出站,不使用 IPv6。

小坑

  • direct 节点没有 server、port 字段,本身就不需要填写,direct 类型特殊。
  • 图标 emoji 🟢 Stash 完全支持显示。
  • 你定义完之后,就可以在 proxy‑groups 里面引用 🟢 直连 这个名字。

proxygroups 使用示例

proxy-groups:
  - name: "节点选择"
    type: select
    proxies:
      - "🟢 直连"
      - 你的其他节点

等价展开写法(方便阅读,效果完全一样)

proxies:
  - name: "🟢 直连"
    type: direct
    udp: true
    ip-version: ipv4

⚠️重要提醒

这个自定义🟢 直连和内核内置 DIRECT 不是同一个东西:

  • 内置常量 DIRECTrules 里写- GEOSITE,cn,DIRECT,调用内核内置直连。
  • 你手动新增的🟢 直连是一个自定义代理项,只能在 proxy‑groups 里面选择使用;不能直接写在 rules 里面rules 不识别这个自定义名字。

rules 分流只能用系统保留字 DIRECT,不要写🟢 直连,会匹配失败。 如果想让分流使用你这个自定义直连节点,就把它放进 proxy‑groupsrules 指向组名。

小结:

  • proxies:块里定义:有效
  • 在 proxygroups 选择使用:有效
  • 在 rules 直接写🟢 直连无效,必须用保留字DIRECT

fakeipfilter📌关键区分表

表格

项目 原版 Mihomo (Android/Linux/Windows) StashiOS
blacklist 模式下写 - ruleset:xxx 原生支持 不生效,被裁剪
blacklist 模式下写 - geosite:xxx 支持 支持
fakeipfiltermode: rule 完整支持 内核存在,但官方 Wiki 不记载,属于继承特性
rule 模式语法 RULESET,xxx,realip 原生支持 可以用,但文档无记录

2、规则模式 fakeipfiltermode: rule

完整规则语法,和外层rules:语法一致,自上而下匹配,**每条末尾必须写动作 fakeip / realip**GitHub。 完整支持:GEOSITERULESETDOMAINMATCH

dns:
  enhanced-mode: fake-ip
  fake-ip-filter-mode: rule
  fake-ip-filter:
    - '*.lan,real-ip'
    - 'GEOSITE,private,real-ip'
    - 'RULESET,salem@cn,realip'
    - 'MATCH,fakeip'

x

表格

项目 Stash(iOS) MihomoMeta SingBox
policy 内写ip#组名 不支持 支持 无此语法
#有效位置 仅顶层nameserver 顶层 /nameserverpolicy detour字段
是否需要差集,!apple@cn 建议使用 必须使用 不需要
开关 followrule:false respectrules:true 无开关,靠 detour
geosite 匹配规则 从上往下顺序匹配 map 无序 内置 tag 权重优先
DNS 数组行为 并发抢最快 顺序 fallback 顺序 fallback