<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-TW/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-TW/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-TW/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-TW/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-TW/observe.md#connections)。
- 「分流」：記錄詳細資料中的「為此目標新增規則」。參閱[分流](https://zakkaus.github.io/doona-docs/zh-TW/observe.md#flows)。
- 「DNS」：「查詢」結果及其中每個回答位址、「解析記錄」中的記錄，以及「快取」中的項目。參閱[DNS](https://zakkaus.github.io/doona-docs/zh-TW/observe.md#dns)。
- 「追蹤模擬」：提供此按鈕的規則評估卡片。參閱[追蹤模擬](https://zakkaus.github.io/doona-docs/zh-TW/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-TW/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-TW/routing.md#add-rule)的對話框，條件取自追蹤輸入。再點選「暫存」或「套用」。
