# 路由规则引擎

MintFlow 按 DNS 名称和目标 IP 选择流量出口。iOS 的应用分流匹配应用使用的域名/IP 范围，不通过 bundle ID 识别来源应用。简易模式选择一个普通出口，已保存的自定义规则保持停用。

规则模式包含两个相关决策：**DNS 查询如何回答**，以及**数据包如何到达解析出的地址**。不能用一个自上而下的顺序概括两者。

## DNS 优先级：从高到低

只有生效且启用的配置参与。编译时因缺少 Pro 权限而排除的条目没有优先级。

| 顺序 | 来源 | 匹配与结果 |
|---:|---|---|
| 1 | 用户静态 DNS 记录 | 精确匹配 `[dns-hosts]` 主机名；本地应答，不创建 DNS 所属的流量路由。 |
| 2 | Tailscale 派生 DNS | 先精确派生名称，再最具体的已启用派生子树，最后处理活动 tailnet 区域内的权威否定应答；名称留在本地。 |
| 3 | 用户 `DOMAIN-SET` 路由 | 选择最具体的后缀，与行位置无关；包括域名本身及子域名。 |
| 4 | 用户 `DOMAIN-KEYWORD` 路由 | 按已保存的关键词顺序选择第一个字面子串命中项。 |
| 5 | 内置广告过滤 | 仅在以上均未命中时查询所选列表；阻止时返回 NODATA，不访问上游。 |
| 6 | `DNS-FALLBACK` | 按所选动作/出口解析剩余名称，不作为广告过滤例外。 |

域名集合或关键词命中转发动作（`DIRECT`、`L3VPN`、`L4PROXY`）会绕过广告过滤；`DROP` 或 `REJECT` 保留原有 DNS 拒绝行为。更高优先级的静态应答也会优先于域名 Reject。DNS 规则不能替代 IP 防火墙。

活动 Tailscale 区域内的未知名称收到本地否定应答，不会发送到公共 DNS。静态记录和 Tailscale 名称仅在权限及 DNS 模式允许时启用。

## 域名集合、关键词与冲突

集合中的 `example.com` 匹配自身及 `a.example.com`，不匹配 `badexample.com`。更具体的 `help.example.com` 优先于 `example.com`，即使较宽规则是 Reject 且排在前面。

关键词匹配规范化 DNS 查询名称中的字面子串，不匹配 URL、路径、SNI 或 HTTP Host。`ads` 可匹配 `ads.example.com` 和 `downloads.example.com`，没有标签边界限制。匹配会规范化大小写和末尾点号，国际化名称使用 ASCII 形式。关键词支持 ASCII 字母、数字、点、连字符与下划线，不支持通配符或正则。最多 256 条关键词路由，付费出口限制仍适用。

域名集合始终优先于关键词。关键词内部按保存顺序决定，不自动按最长词或 Reject 优先。相同规范化后缀或关键词配置冲突的动作/目标会导致编译错误，不能用调整顺序解决。

## 示例

```ini
[domain-sets]
blocked=example.com
allowed=help.example.com

[routing]
DOMAIN-KEYWORD,help,REJECT
DOMAIN-SET,blocked,REJECT
DOMAIN-SET,allowed,DIRECT
DOMAIN-KEYWORD,ads,REJECT
CIDR,192.168.40.0/24,DIRECT
DNS-FALLBACK,DIRECT
DEFAULT,DIRECT
```

- `help.example.com` 使用直连 DNS：较具体的集合优先于父域名 Reject 和前面的关键词，也会绕过广告过滤。
- `shop.example.com` 命中较宽的集合，被拒绝。
- `ads.other.test` 命中关键词，被拒绝。
- 其他名称仍先经过广告过滤，再使用直连 DNS 兜底。
- 若为其中某个名称配置精确静态记录，静态记录优先于上述所有域名规则。

宽泛的转发集合或关键词会让很多域名绕过过滤。处理误拦截时，优先添加范围较小的域名集合。使用 DNS 日志规则类型过滤和广告过滤检查器查看命中来源。

## IP 路由与数据包转发

`CIDR` 和 `CIDR-SET` 会成为 IP 路由。匹配时最长前缀优先：`192.168.40.10/32` 比 `192.168.40.0/24` 更具体，后者又比 `DEFAULT` 更具体。将 CIDR 行移到域名行前，不会改变 DNS 优先级。

DNS 决策可为解析出的 IPv4 目标附加 VPN/代理或阻止策略。直连 DNS 结果继续经过普通 IP 路由，因此显式 CIDR 规则仍可为该地址选择 VPN/代理。用户静态记录也由 IP 规则决定数据包路径。`DNS-FALLBACK` 选择未匹配名称的策略，`DEFAULT` 是最终 IP 路由；请分别配置。

域名分流依赖查询进入 MintFlow DNS。共享 IP、缓存地址、应用自带加密 DNS 和直接使用 IP 的连接，都会限制域名规则的区分能力。调查意外出口时，请结合流量捕获和 DNS 日志检查。

## 保留规则与简易模式

`VPN-DNS-SERVER-DOMAINS,L3VPN|L4PROXY,target` 指定带域名的加密 VPN DNS 的引导路径。这是 DNS 基础设施保留规则，不是用户域名白名单。

简易模式不启用已保存的静态记录、Tailscale 派生 DNS、域名集合、关键词或自定义 CIDR 规则。DNS 广告拦截仍在所选出口之前执行。仅支持 TCP 的代理不能传输任意 UDP；简易模式会丢弃不支持的 UDP，不会静默直连。

保存配置修改，检查编译诊断，并按提示重启 VPN。纯过滤修改和明确的运行时控制可能实时应用。[路由语法](../profile/routing.md) · [内部 DNS](internal-dns.md)
