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

# 路由、节点与规则

本页说明「路由」分区中的「策略」「节点」和「规则」三个页面。内容包括选择组成员、管理订阅、查看与修改规则、暂存规则后一并应用，以及用追踪模拟检查路由。

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

## 策略组

打开「路由」分区中的「策略」。「组」标签页为每个组显示一张卡片。

### 查看组卡片

1. 卡片标题行显示组名称、策略，以及可用、不可用和未测试的成员数。
2. 展开「配置」可查看组的设置，例如「检测网址」「检测间隔」和「容忍差值」。
3. 下方的成员网格显示每个成员的状态或延迟。成员超过 12 个时，网格上方会出现「筛选节点」「地区」「排序」（「按延迟」或「按名称」）和「只显示可用节点」。

### 选择成员

1. 策略为「手动选择」的组，在网格中点击成员后立即切换到该成员。
2. 自动策略的组若后端允许手动固定，点击成员即固定该成员。状态由「自动」变为「已手动固定」，提示消息说明自动策略已暂停。
3. 如需解除固定，打开卡片的「更多操作」，选择「恢复自动选择」。此项只在组已固定时出现。提示消息会列出自动策略当前选出的成员。
4. 卡片显示「两者」「TCP」「UDP」选择器时，先选择网络。选择「两者」时，选择成员、固定成员或「恢复自动选择」同时作用于 TCP 和 UDP；选择「TCP」或「UDP」时只作用于该网络。
5. 卡片显示「切换时中断现有连接」时，此开关决定切换成员时是否中断现有连接。更改此开关会写入组配置并重载。在「手动选择」策略的组中选择成员后，提示消息会说明现有连接已保留或已中断。

### 测试、编辑与检测设置

以下三项操作都位于卡片的「更多操作」中。

1. 选择「测试全部」可探测所有成员。提示消息列出可用、不可用和状态未知的数量，以及选择是否更改。后端无法探测此组时，此项停用。
2. 选择「编辑群组」可修改「选择方式」和筛选条件（「筛选 1」「筛选 2」「添加筛选」），然后点击「应用」。doona 在定义此组的文件中改写 group 区段内的策略与筛选条件，保留其他字段；校验通过后写入并重载。组有多处定义、所在文件只读，或已读取的文件中没有此组定义时，此项停用。
3. 选择「检测设置」可修改「检测网址」「检测间隔」「容忍差值」和「空闲超时」。对话框只显示后端列为可写入的字段。字段留空表示使用全局值或默认值，然后点击「应用」。对话框打开后若后端已更改某个值，该字段会显示说明；再次应用会以对话框中的值覆盖。

### 编排组成员

1. 打开「组成员」标签页。左侧为组，右侧为节点与订阅。
2. 将节点或订阅拖动到组；也可勾选多行后，点击列表下方的「加入组」。
3. 按名称加入的节点或整个加入的订阅，可点击其移除按钮移除。组通过规则选入的节点无法在此移除，须在配置来源中修改。
4. 如需创建组，点击「新建组」，输入「组名称」，选择「选择方式」，再点击「创建」。创建后须加入至少一个节点或订阅；没有成员的组会包含所有节点，因此无法应用。
5. 更改会先暂存，页面显示尚未应用的更改数。点击「全部放弃」可放弃更改；点击「检查并应用」可打开「检查更改」。
6. 「检查更改」列出每项暂存更改，每项都有撤销按钮。展开「查看写入的配置文本」可查看组文本。点击「应用」后，doona 先校验整份配置，再写入并重载；校验失败时不会写入。
7. 有暂存更改时离开页面，会先要求确认放弃更改。

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

## 节点与订阅

打开「路由」分区中的「节点」。「节点」标签页列出节点来源，包括订阅、文件和配置内的节点。后端提供节点列表时才会显示「延迟」标签页。

### 来源与节点

1. 「来源」表格显示每个来源的「种类」「节点」「用量」「更新」「自动刷新」「到期」和「状态」。
2. 选中一行来源后，下方的节点表格显示该来源的节点。「搜索节点」覆盖所有来源；「组」和「协议」可筛选表格。
3. 每行节点显示「协议」「延迟」和「所属组」。点击该行的测试按钮可测量此节点；提示消息显示延迟或失败原因。
4. 在节点行点击「加入组」，再选择组。doona 会在主配置中将节点名称加入该组并重载。选择「新建组…」可创建以名称筛选纳入此节点的组：输入「名称」，选择「选择方式」，再点击「加入」。

### 延迟

1. 打开「延迟」标签页。摘要显示最低延迟、最高延迟和不可用的节点数。
2. 图表显示每个节点的「当前延迟」。后端提供时，也会显示「移动平均」和「近 10 次平均」。
3. 在「分组方式」中选择「按组」或「按协议」。每组会列出不可用或未测量的节点名称。
4. 点击图表中的节点，可在「节点」标签页打开该节点。

### 添加订阅或节点

添加或移除订阅与文件来源需要后端允许管理来源；添加或移除单个节点需要后端允许管理节点。两类操作都要求主配置可写入；参阅[只读来源](https://zakkaus.github.io/doona-docs/zh-CN/troubleshooting.md#read-only)。

1. 点击「添加订阅」，输入「名称」和「订阅网址」（HTTP 或 HTTPS）。视后端支持情况，对话框还提供「自动刷新」「User-Agent」和「缓存订阅内容」。
2. 点击「添加」。后端将订阅写入主配置的 subscription 区段。订阅网址会保存，但不会再返回显示。
3. 新订阅在获取前没有节点。后端支持刷新订阅时，doona 会立即刷新，提示消息显示节点数。刷新失败时，提示消息提供「重试」。
4. 如需添加单个节点，点击节点表格上方的「粘贴节点链接」。输入「名称」和「节点链接」（例如 `vless://…`），再点击「添加」。节点会写入主配置的 node 区段。

### 刷新订阅

1. 点击订阅行的刷新按钮，可立即获取该订阅。点击「刷新全部订阅（N）」可一次获取所有订阅；「设置」页的[后端操作](https://zakkaus.github.io/doona-docs/zh-CN/config-and-settings.md#backend-actions)也提供相同操作。
2. 刷新会经由订阅的下载路由获取内容，并应用新的节点；订阅的来源设置不会改变。
3. 成功时，提示消息显示节点数。失败时，保留最近一次成功加载的节点。
4. 下载路由尚无可用节点时，刷新会失败，不会改用直连。例如，路由规则将订阅导向一个由该订阅尚未提供的节点组成的组。
5. 如需更改订阅的刷新频率，在该行的「自动刷新」列选择数值。doona 会将间隔写入主配置并重载。

### 移除来源或节点

1. 如需移除订阅或文件来源，打开该行的「更多操作」，选择移除项，再在对话框中确认。doona 会从主配置删除此来源及其节点并重载。
2. 配置内的节点在其行上有移除按钮。移除后，该节点会从主配置的 node 区段删除并重载。

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

## 路由规则

打开「路由」分区中的「规则」。标签页包括「路由规则」「DNS 规则」和「追踪模拟」；每个标签页只在后端提供对应功能时显示。

### 查看规则列表

1. 从上到下阅读列表。第一条匹配的规则决定出站；最后一行编号为 `—`，即 fallback。
2. 每行显示「序」「表达式」「出站」「位置」和「命中」。`must` 标记表示出站已锁定。
3. 「位置」显示规则所在的文件和行号。「命中」统计当前快照中保留的流程记录，不是累计值。
4. 列表说明文字显示规则数和规则列表的 `generation`。
5. 后端只提供流程记录而不提供规则列表时，此标签页改为显示当前快照中按规则分组的流程，包括「命中」和「占比」。

### 打开规则来源

1. 点击某行的「打开来源」，「配置」页会打开该文件并定位到规则所在行；参阅[编辑来源](https://zakkaus.github.io/doona-docs/zh-CN/config-and-settings.md#edit-source)。
2. 位于引入文件、且不在 routing 区段内的规则无法在列表中更改，须通过「打开来源」在文件中编辑。

### 编辑或移除规则

1. 点击某行的「编辑出站设置」。对话框显示规则的表达式。选择其他「出站」，必要时打开「锁定此出站」，再点击「编辑出站设置」确认。此操作只修改出站，条件保持原样。
2. 点击某行的「移除规则」。对话框列出将删除的文件和行号。点击「移除规则」确认。
3. 两项操作都在校验通过后写入并重载。提示消息说明更改已生效；现有连接保持当前路由，重新连接后才应用更改。
4. 规则所在文件只读或内容不完整、doona 无法定位规则所在行，或规则位于 routing 区段外的引入文件时，两个按钮都会停用，鼠标悬停时显示原因。
5. 在连接的「更多操作」中选择「编辑命中规则的出站设置」，会为该连接命中的规则打开此对话框。

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

## DNS 规则

1. 打开「DNS 规则」标签页。标签页包含两份列表，各自按顺序匹配：「request 规则」决定如何处理每个查询；「response 规则」决定接受应答、拒绝应答，或通过另一个上游重新查询。
2. 每行显示规则的表达式、「动作」和「位置」。「解析记录」和「打开 DNS 配置」分别链接到「DNS」页和配置的 dns 区段。
3. 在任一列表点击「新建规则」可添加规则。对话框与[从规则列表新建](https://zakkaus.github.io/doona-docs/zh-CN/routing.md#add-rule)相同，但以「动作」取代「出站」，且没有「锁定此出站」。规则会写入来源文件的 dns routing 区段。
4. 点击某行的「移除规则」可删除规则。DNS 规则没有编辑按钮；如需修改，通过「打开来源」在文件中编辑。

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

## 新建规则

新建规则有两种对话框。从规则列表打开的对话框会立即写入规则；从观测流量打开的对话框另外提供暂存。

### 从规则列表新建

1. 在「路由规则」标签页，点击列表上方的「新建规则」。
2. 在「条件写法」中选择「选择」，再选择「依据」（例如「域名后缀」「geosite 分类」或「目标 IP」）并输入「值」，多个值以逗号分隔；或选择「表达式」，直接输入「条件」，例如 `domain(geosite:netflix)`。
3. 选择「出站」。默认为第一个组；没有组时为 `direct`。打开「锁定此出站」会加上 `must`。
4. 选择「插入位置」：「最后（fallback 之前）」或「第 N 条之前」。默认为列表中的第一个位置。
5. 点击「新建规则」。doona 将规则加入来源文件的 routing 区段，校验通过后写入并重载。

### 从观测流量新建

以下页面也提供「新建规则」：

- 「连接」：选中一行后使用工具栏按钮，或在连接详情面板中使用。参阅[连接](https://zakkaus.github.io/doona-docs/zh-CN/observe.md#connections)。
- 「分流」：记录详情中的「为此目标新建规则」。参阅[分流](https://zakkaus.github.io/doona-docs/zh-CN/observe.md#flows)。
- 「DNS」：「查询」结果及其中每个应答地址、「解析记录」中的记录，以及「缓存」中的条目。参阅[DNS](https://zakkaus.github.io/doona-docs/zh-CN/observe.md#dns)。
- 「追踪模拟」：提供此按钮的规则评估卡片。参阅[追踪模拟](https://zakkaus.github.io/doona-docs/zh-CN/routing.md#trace)。

在对话框中：

1. 流量可写入多份列表时，选择「规则列表」：「路由规则」「DNS request 规则」或「DNS response 规则」。
2. 流量提供多种条件时，选择「依据」。DNS 规则还可限定为该查询的记录类型。
3. 选择「出站」；DNS 规则则选择「动作」。出站没有预设值。选项下方显示当前的出站；所选出站不会改变流量走向时，对话框会提示。
4. 确认「插入位置」。流量命中的规则位于可写入文件时，默认为「命中规则之前」。其他选项为「最后（fallback 之前）」和「最前」。
5. 对话框底部预览规则内容。前面的规则仍可能先命中此流量，或列表、暂存列表中已有相同规则时，对话框会显示说明。
6. 点击「暂存」或「应用」：
   - 「暂存」将规则加入暂存列表，不写入。提示消息提供「查看暂存的规则」。
   - 「应用」立即写入这条规则并重载。提示消息说明新规则已生效；路由规则提供「查看规则」，从 DNS 查询新建的 DNS 规则则提供「重新查询」。
7. 配置无法写入时，对话框改为提供「复制规则」。

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

## 暂存列表

1. 暂存规则只保留在当前的浏览器会话中。重新加载页面会丢弃暂存规则，因此有暂存规则时离开页面，浏览器会先要求确认。
2. 「规则」页在每份含暂存规则的列表上方显示「待应用：N」卡片。每行显示规则内容和插入位置。
3. 点击某行的「舍弃暂存的规则」可舍弃该规则。
4. 点击卡片上的「应用暂存的规则」或顶部栏的「应用（N）」，会写入所有列表中的全部暂存规则。卡片会注明其他列表中的暂存规则数；需写入多个文件时，也会显示文件数。
5. 规则逐个文件写入，每个文件各自校验并重载。已写入的规则会离开暂存列表。某个文件失败时，尚未写入的规则保留在暂存列表中，失败原因和相关行号显示在卡片上。
6. 顶部栏的「重载 honk」只重载已写入的配置，不会写入暂存规则。参阅[顶部栏](https://zakkaus.github.io/doona-docs/zh-CN/tour.md#top-bar)。

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

## 追踪模拟

追踪模拟按当前配置模拟规则匹配，不会与目标建立连接。

### 执行追踪

1. 打开「规则」中的「追踪模拟」。
2. 选择「网络协议」（TCP 或 UDP）。输入「域名」「目标 IP」或两者，以及「目标端口」。
3. 选择「解析模式」：「不解析（none）」「实时解析（live）」或「先查 DNS 再模拟（query）」。live 和 query 会先解析域名，因此须填写域名，并将「目标 IP」留空。只能使用后端提供的模式。
4. 展开「高级条件」可加入「来源 IP」「来源端口」或「进程名称」。
5. 点击「开始追踪」。

仅提供目标 IP 时，模拟按 IP 与端口判定。`dial_mode` 使用 domain 系列模式时，引擎会从实际 TLS 或 HTTP 流量嗅探域名，并重新评估规则；如需模拟此结果，请一并提供域名。

### 解读结果

1. 状态行显示观测时间和追踪所依据的 `generation`。
2. 使用 query 解析时，DNS 查询卡片显示查询结果。「查询 DNS」和「查看缓存」会在「DNS」页打开该名称。
3. 每张「规则评估 N」卡片显示「判定」（「已判定」或「无法判定」）和「出站」。前序规则缺少输入时，卡片改为显示「可能出站」和「缺少输入」；补齐这些输入后重新执行追踪。
4. 出站为组时，卡片显示「节点」链和「连通性」。测试按钮可测量该节点；查看组和查看节点的链接可打开对应页面。
5. 表格列出每条规则的「结果」（「匹配」「不匹配」「跳过」或「无法判定」）以及该规则缺少的输入。

### 从结果新建规则

点击规则评估卡片上的「新建规则」，会打开[从观测流量新建](https://zakkaus.github.io/doona-docs/zh-CN/routing.md#add-rule)的对话框，条件取自追踪输入。再点击「暂存」或「应用」。
