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

318 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✅分清 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)**:魔改 ClashMetamap 保留配置书写顺序;多条 geosite 命中按从上到下取第一条;
> 3. **SingBox**`dns.rules`是**数组(list)**,天生从上到下依次判断,匹配即停止;并且 geosite 标签内置权重逻辑。
## 完整优先级总表
表格
| 项目 | MihomoMeta | Stash(iOS) | SingBox |
| --- | --- | --- | --- |
| 配置底层结构 | 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`语法 | ✅支持 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@cn`**`geosite:apple@cn`标签自带高优先级;规则数组从上往下执行,命中立刻停止。
> SingBox 没有`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. **截图文档只针对 MihomoMeta**`nameserverpolicy`为无序 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 海外域名命中第一条;
- MihomoMetaapple 海外域名同时命中两条,随机选 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 不是同一个东西:
- 内置常量 `DIRECT`rules 里写`- 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。
✅完整支持:`GEOSITE`、`RULESET`、`DOMAIN`、`MATCH`。
```
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 |