# 路由規則引擎

MintFlow 依 DNS 名稱與目的 IP 選擇流量出口。iOS 的 App 分流比對 App 使用的網域/IP 範圍，不會用 bundle ID 辨識來源 App。簡易模式選擇單一一般出口，已儲存的自訂規則維持停用。

規則模式包含兩個相連的決定：**如何回答 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、快取位址、App 自帶加密 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)
