<a name="routing"></a>

# 管理节点、策略组和规则

在路由分区中，可以添加节点来源、设置组如何选择节点，并决定哪些流量使用这些节点。本页适用于标准版；完整操作示例见[首次连接教程](https://doona.daeuniverse.org/zh-CN/tutorial.md)。

| 任务 | 页面 | 开始前检查 |
| --- | --- | --- |
| 添加或编辑订阅、节点 | [节点](https://doona.daeuniverse.org/zh-CN/routing.md#nodes) | [节点管理](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-nodes) |
| 更新订阅 | [节点](https://doona.daeuniverse.org/zh-CN/routing.md#nodes) | [订阅更新](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-subscription-refresh) |
| 选择成员或固定自动组的成员 | [策略](https://doona.daeuniverse.org/zh-CN/routing.md#policies) | [成员选择](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-group-selection) |
| 修改成员范围或组设置 | [策略](https://doona.daeuniverse.org/zh-CN/routing.md#policies) | [编辑组](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-group-edit) |
| 测试节点或组 | [节点或策略](https://doona.daeuniverse.org/zh-CN/routing.md#policies) | [延迟探测](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-probes) |
| 应用模板或编辑规则 | [规则](https://doona.daeuniverse.org/zh-CN/routing.md#rules) | [规则与模板](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-rules) |
| 模拟路由结果 | [追踪模拟](https://doona.daeuniverse.org/zh-CN/routing.md#trace) | [路由追踪](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-routing-trace) |

更改何时生效，见 [doona 能修改什么](https://doona.daeuniverse.org/zh-CN/what-doona-can-change.md)。控件不可用时，打开其旁的帮助查看具体原因。

<a name="nodes"></a>

## 添加和维护节点

打开**节点**。选择来源卡片后，查看其节点；通过表格的搜索和筛选查找节点。**延迟**标签页用于比较已有的测量结果。

**搜索节点** 搜索所有来源，**组** 和 **协议** 可筛选表格。协议后会显示后端报告的流传输方式，协议筛选仍按协议匹配。

来源卡片显示类型、状态、节点数、更新时间、到期时间和用量；后端报告配额时还会显示用量条。到期时间显示到分钟，悬停提示显示秒。方向键可在卡片间移动。**尚未获取** 表示尚未成功获取且没有报告错误；**过期数据** 表示保留的数据需要更新。空文件来源仍会显示其状态。

**延迟** 显示最低、最高延迟和不可用节点数。可比较 **当前延迟**，以及后端报告的 **移动平均** 和 **近 10 次平均**。**分组方式** 按组或协议汇总，并列出不可用或未测量节点。选择图表中的节点会在 **节点** 中打开。

### 添加订阅

1. 点击**添加订阅**。
2. 填写**名称**和**订阅网址**。如果提供**自动更新**、**User-Agent**和**缓存订阅内容**，检查这些选项。
3. 点击**添加**。支持订阅更新时，doona 会获取新来源并报告节点数量。如果获取失败，使用通知中的**重试**。
4. 选择来源卡片，检查节点后再创建组。

订阅 URL 必须使用 HTTP 或 HTTPS。未填写协议的 URL 会在字段失去焦点或保存时补上 `https://`。无效 URL 和节点链接的原因会显示在字段下方。

### 添加节点链接

1. 点击**粘贴节点链接**。
2. 只有一个链接时，填写**名称**和**节点链接**。有多个链接时，每行粘贴一个，再检查解析出的名称和错误。
3. 确认添加并检查结果。部分链接失败时，对话框会保留这些链接供你修正。

honk 支持 Trojan、VMess 和 VLESS 链接使用 XHTTP over H2。`xhttp` 和 `splithttp` 均选择此传输方式，支持 `auto`、`packet-up`、`stream-up` 和 `stream-one` 模式。可用选项与限制见 [honk XHTTP 参考](https://github.com/daeuniverse/honk/blob/main/doc/en/reference/nodes.md#xhttp-over-h2)。

### 更新或编辑订阅

1. 使用来源卡片的更新操作立即获取订阅。页面上的订阅更新按钮会更新全部订阅。
2. 要修改网址或选项，使用卡片的编辑操作。修改提供的字段后，点击**应用**。如果卡片提供的是**打开配置文件**，则在那里编辑声明。
3. 用**自动更新**选择间隔。选择**自定义**时，填写**间隔**和**单位**。
4. 如果提供**下载路由**，选择获取订阅时使用的路由。此选项不决定使用订阅节点的流量走哪条路由。

更新失败会保留上次成功加载的节点。若下载路由没有可用节点，更新会失败，不会回退到直连。例如，订阅通过自身提供的节点下载，但这些节点尚未加载时，就会出现此情况。

清空 **User-Agent** 会移除 `ua`，改用引擎默认值。条目设置了 `cache` 或后端报告缓存默认值时，才会显示 **缓存订阅内容**。选择 **按路由规则** 会移除显式 `route`，其他选项保留原文。

重命名可同步更新同一文件中的简单 `subtag(...)` 过滤条件。保持更新开关开启，可保留这些组的成员关系。其他文件或表达式中的引用会阻止重命名。

**自定义** 自动更新间隔的 **间隔** 必须为非负整数，并需选择 **单位**。

如果组筛选条件阻止重命名，按对话框中的链接前往**策略**，先修改这些筛选条件。下载失败时，检查[订阅更新条件](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-subscription-refresh)。

### 编辑或移除节点来源

通过来源卡片的**更多操作**菜单移除来源，再检查确认提示。如果仍有组引用该订阅，对话框会列出这些组；须先修改其筛选条件。

对于配置中声明的节点，使用节点行提供的编辑或移除操作。如果声明位于引入文件且无法移除，在[配置](https://doona.daeuniverse.org/zh-CN/config-and-settings.md#edit-source)中打开该文件。

重命名配置内的节点时，会同步更新同一来源中精确匹配节点名的过滤条件、默认成员、最终出站及 DNS 上游的绕行目标。其他来源中的引用会阻止重命名。

**加入组** 会打开组编辑器，并将节点加入草稿；点 **应用** 才会保存。选择器列出可写主文件及 include 文件中的组，并支持搜索。即使运行时组 API 不可用，只要配置可读，仍可编辑组。

<a name="policies"></a>

## 选择和编辑策略组

打开**策略**。每张卡片代表一个组；展开折叠的卡片即可查看成员。卡片显示所选成员和后端报告的成员健康状态。

**全部**、**手动选择** 和 **自动选择** 按选择类型筛选组并显示数量。筛选条件保存在 URL 中；打开被隐藏的组会切回 **全部**。卡片显示策略及可用、不可用、未测试的数量。超过 12 个成员的组提供 **筛选节点**、**地区**、**排序** 和 **只显示可用节点**。自动组初始折叠；固定选择的组或通过链接打开的组会自动展开。

嵌套组显示父组对它测得的延迟；若没有此样本，则显示其当前选择最终指向节点的延迟。

### 选择成员

1. 如果卡片提供**两者**、**TCP**和**UDP**，先选择要修改的网络协议。
2. 选择成员。手动组会选择该成员；允许覆盖的自动组会将其固定，并显示**已手动固定**。
3. 要取消固定，在**更多操作**中选择**恢复自动选择**。卡片展开时，此操作遵循所选网络协议；自动组卡片折叠时，会清除两种协议的固定状态。

重启后是否保留选择，见[持久保存条件](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-persistence)。

### 创建或编辑组

1. 点击**新建组**，或点击卡片的铅笔按钮编辑该组。
2. 新建组须填写**组名称**，然后选择**选择方式**。
3. 选择要包含的地区、订阅、节点或嵌套组。保存前检查**匹配的节点**。空筛选条件会包含所有节点。
4. 成员选项不能表达的条件，通过**添加筛选**补充。同一筛选中的条件须全部匹配；**添加 OR 匹配**用于增加另一种匹配方式。
5. 检查提供的**默认成员**、**最终出站**和切换时中断连接的开关。默认成员用于手动选择的初始状态；没有可用成员时使用最终出站。
6. 新建组点击**创建**，编辑组点击**应用**，随后检查结果。**取消**会在必要的放弃确认后丢弃草稿。

移除显式选择的成员后，如果该节点仍匹配其他筛选条件，就不会被排除；须同时修改对应条件。字段无法修改时，参阅[组编辑条件](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-group-edit)。

**默认成员** 只在手动选择策略下显示，列出直接成员。改用自动策略不会清除已保存的 `default`。**最终出站** 可选 `direct`、`block`、组和节点，但不包含会形成循环引用的组。选择 **无** 会移除对应的 `default` 或 `final` 设置。

**切换时中断现有连接** 控制切换成员时是否关闭现有连接。在 **编辑群组** 中修改后需点 **应用**；在 **查看配置** 中切换则立即写入。

配置冲突后重试会保留未编辑字段的新值。双方修改同一字段或组被重命名时，需重新打开编辑器。若组已在别处删除，编辑器会保持打开并提示更改未保存。

展开 **地区** 可选择地区，已选标签会保持显示。**添加筛选** 支持名称和 `subtag` 匹配，自定义表达式仍可作为文本编辑。**子组** 和 **节点** 选择器滚动选项时，搜索框保持固定。

### 测试成员或修改后台检查

使用组的 **更多操作** → **测试全部** 或节点测试按钮，按[手动探测偏好](https://doona.daeuniverse.org/zh-CN/config-and-settings.md#settings-page)测试。选择 **按选项探测…** 可调整本次测试。操作不可用时，查看[探测要求](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-probes)。

探测超时、取消、无可用地址或本地拒绝可能使结果为 `unknown`；这不能证明节点不可用。Trojan、AnyTLS 和 VLESS 仍提供 DNS UDP 探测选项，是否支持取决于节点配置。后端拒绝探测时会显示原因，不会自动改用 HTTP。

要修改组的后台检查，选择**更多操作** → **检测设置**，修改提供的字段后点击**应用**。后台检查与手动测试分开设置。

检查字段留空会清除组的覆盖值，改用全局值或默认值。发生冲突后，未编辑的字段会采用后端新值；双方都改过的字段保留草稿，并在旁边显示后端值。再次应用会用草稿覆盖该值。

<a name="rules"></a>

## 应用路由模板

打开**规则** → **路由规则**。显示视图切换时，**简易**用于模板，**高级**用于规则列表。应用前先检查[规则与模板条件](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-rules)。

即使规则 API 不可用，仍可从可读配置查看模板。**简易** 是默认视图；链接指定规则、预填新规则或查看暂存规则时除外。自定义路由或分布在多个文件中的路由不会选中任何模板。

1. 选择**分流方式**，或打开**更多模板**。检查模板说明和选项。
2. 点击**应用**，打开确认对话框。
3. 检查目标文件、将创建或复用的组，以及文件差异。模板会替换目标文件的顶层路由规则。替换时移除的路由引入语句不再引入原有规则，但被引入的文件仍保留在磁盘上。
4. 如果提供**同时加入 DNS 路由**，决定是否加入建议的 DNS 配置。
5. 点击**应用**确认，随后检查结果。校验失败时，先修正报告的问题再应用。

已有组会保留原设置。确认前须检查复用组或组名与节点名冲突的警告。

| 模板选项 | 默认值与效果 |
| --- | --- |
| **屏蔽广告** | 默认关闭；开启后拦截 `geosite:category-ads-all`。 |
| **屏蔽 QUIC** | 默认开启，拦截 UDP 443 端口。honk 在路由前标记自身套接字，因此不会拦截其与 QUIC 节点的连接。 |
| **NetworkManager 直连** | 默认开启，将 NetworkManager 流量直连。 |

所有已加载文件都没有 `dns` 块时，才会显示 **同时加入 DNS 路由**，且默认勾选。它将 `geosite:cn` 查询通过 UDP 发往 `223.5.5.5:53` 的 `alidns`，其余查询通过 DNS over TLS 发往 `1.1.1.1:853` 的 `cloudflare`。

警告会指出只选择单个精确节点或使用 `fixed` 策略的现有组。若新组与节点同名，使用该名称的规则会指向组，而不是节点。

**分流方式** 提供 **绕过中国大陆**、**只代理 GFW 名单** 和 **全局代理**。**更多模板** 提供 **单一代理组**、**按服务分组**、**按服务与地区分组** 和 **回国**。最后一项将中国大陆域名及 IP 发往 `cn` 组，该组按节点名称匹配成员时排除香港、澳门和台湾，其余流量直连。

目标为包含顶层 `routing` 的文件；若不存在，则使用主文件。缺少的组会在目标文件中创建。现有 DNS 路由、其他内容及其他文件保持不变。新组标签使用界面语言，地区标签带国旗。

<a name="add-rule"></a>

## 添加或修改单条路由规则

1. 打开**规则** → **路由规则**；显示视图切换时，选择**高级**。
2. 点击**新建规则**。选择**依据**并填写**值**，多个值以逗号分隔。**添加 AND 条件**用于添加必须同时匹配的条件；自定义条件可使用**表达式**。
3. 选择**出站**和**插入位置**。决定位置时须检查前面的规则，因为第一条匹配的规则决定结果。
4. 点击**新建规则**，在列表中检查结果。

从 **表达式** 切换到 **选择** 时，可转换的表达式会变为条件行；其余表达式保留在 **表达式** 并显示提示。**域名关键字** 匹配子串，例如 `tracker, ads` 匹配任一关键词。

**出站** 提供 `direct`、`block` 和组，不提供单个节点。开启 **锁定此出站** 会添加 `must`。**插入位置** 可选 **最后（fallback 之前）** 或某条规则之前，初始选择为第一个可用位置。两个选择器都支持搜索。

通过规则行的**编辑规则**修改条件或目标，再点击**保存**；通过**移除规则**并确认删除。**打开配置文件**会定位到声明所在的来源。前面的规则都不匹配时，使用 fallback 行指定的目标。

若规则无法在列表中编辑或删除，请用 **打开配置文件** 编辑声明文件。只读来源也可通过此操作打开到规则所在行。编辑兜底规则只会改变目标。

**命中** 只统计仍保留且 `rule_generation_id` 与规则列表 `generation_id` 相同的流量记录，不是累计值。没有规则列表时，视图按规则汇总当前快照中的流量，显示 **命中** 和 **占比**。**规则来源** 区分 `kernel`、`userspace`、`recomputed` 和 `unknown`。

### 从已观察到的流量创建规则

1. 使用**连接**、**分流**或 **DNS** 行上的添加规则操作，或使用追踪结果中提供的添加操作。
2. 检查所选规则列表、条件、目标和插入位置。DNS 域名可以打开 DNS 请求规则；不支持 DNS 规则时会打开路由规则。
3. 检查预览，以及规则重复或前序规则可能先匹配的警告。
4. 点击**应用**写入这条规则，或点击**暂存**加入[暂存规则](https://doona.daeuniverse.org/zh-CN/routing.md#held-rules)。无法写入时，使用**复制规则**。

对话框不预选出站，会显示当前出站，并在所选目标不会改变出站时提示。命中规则属于可写文件时，**插入位置** 默认选择 **命中规则之前**；其他选项为 **最后（fallback 之前）** 和 **最前**。DNS 条件还可限制为该查询的记录类型。

无需先选中行即可使用行内图标。**连接** 的详情面板也有 **新建规则**，工具栏没有此操作。**分流** 使用行内图标，详情面板没有此操作。**DNS** 在查询结果、回答地址旁，以及 **解析记录** 和 **缓存** 行内提供 **新建规则**。

应用成功后，路由规则的提示提供 **查看规则**；从 DNS 查询添加的 DNS 规则则提供 **重新查询**。

<a name="dns-rules"></a>

## 添加或修改 DNS 规则

打开**规则** → **DNS 规则**。请求规则决定如何解析查询；响应规则决定如何处理应答。

1. 在 **request 规则**或 **response 规则**下点击**新建规则**。
2. 选择条件并输入值，或使用**表达式**。
3. 选择**动作**，并在需要时选择上游。须先定义上游时，参阅 [DNS 设置示例](https://doona.daeuniverse.org/zh-CN/tutorial.md)。
4. 选择**插入位置**，检查条件和动作，再点击**新建规则**。
5. 在 [DNS 页面](https://doona.daeuniverse.org/zh-CN/observe.md#dns)查询域名，检查结果。

已有 DNS 规则使用与路由规则相同的编辑、保存和移除控件。列表或操作不可用时，参阅 [DNS 规则条件](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-rules)。

两个 DNS 列表都按顺序匹配。响应规则可接受回答、拒绝回答或查询其他上游。DNS 规则对话框使用 **动作**，不使用 **出站**，也不提供 **锁定此出站**。**解析记录** 打开 DNS 页面；**打开 DNS 配置** 打开 `dns` 区段。

<a name="held-rules"></a>

## 应用暂存规则

暂存规则只保留在当前页面会话中。刷新浏览器页面会丢失这些草稿。

1. 打开**规则**，检查各列表的待应用卡片。
2. 用**舍弃暂存的规则**移除不需要的条目。
3. 点击**应用暂存的规则**，或顶栏显示规则数量的应用按钮。此操作会应用所有列表中的暂存规则。
4. 检查结果。文件逐个处理；某个文件失败时，尚未写入的规则会继续暂存。已写入的规则即使未能生效，也会从暂存列表移除；继续操作前须按失败通知处理。

有暂存规则时，离开页面前浏览器会要求确认。待处理卡片列出规则及插入位置，提示其他列表的暂存规则；涉及多个文件时还会显示文件数。写入失败的规则会显示在卡片上。

**重载 honk**只会重新加载已保存的配置，不会应用暂存规则。

<a name="trace"></a>

## 用追踪检查路由

追踪会按当前配置评估输入，不会测试到目标的连接。

1. 打开**规则** → **追踪模拟**。
2. 选择**网络协议**，填写**域名**、**目标 IP**或两者，并填写**目标端口**。
3. 选择可用的**解析模式**。支持的模式见[追踪条件](https://doona.daeuniverse.org/zh-CN/feature-requirements.md#req-routing-trace)。

   **实时解析（live）** 和 **先查 DNS 再模拟（query）** 必须填写 **域名**，并将 **目标 IP** 留空。

4. 规则需要来源、进程、DSCP 或标记信息时，展开**高级条件**并填写对应字段。

   **DSCP** 接受 0 到 63 的整数。

5. 点击**开始追踪**，查看**判定**、出站和各条规则的结果。输入不足时，补充后再次追踪。
6. 要检查真实连接，打开[连接](https://doona.daeuniverse.org/zh-CN/observe.md#connections)。追踪结果提供**新建规则**时，可以用该次输入创建规则。

只填写 IP 时，Trace 只评估该 IP 和端口。domain 系列 `dial_mode` 可从真实 TLS 或 HTTP 流量中发现域名并重新评估路由；模拟此情况时需填写域名。无法确定结果时，补充 **缺少输入** 中列出的信息。若显示 **可能出站**，它是根据同一世代中的命中规则推断的，不代表已确定结果。结果标明观测时间和配置世代，并将每条规则标为 **匹配**、**不匹配**、**跳过** 或 **无法判定**。

先解析再模拟时，会显示 DNS 查询卡片，提供 **查询 DNS** 和 **查看缓存** 链接。组结果在 **节点** 下显示组到节点的链，并显示 **连通性**，并提供测试节点、打开组或节点页面的操作。
