# 內部 DNS 伺服器

MintFlow DNS 在 VPN 通道內於本機執行：回答 DNS 查詢、選擇直接連線或 VPN/代理伺服器上游、快取結果，並將網域路由資訊交給封包引擎。它不是公共 DNS 服務，也不供其他區域網路裝置查詢。

規則模式請在 **DNS 與分流**啟用自訂網域分流（`[dns] app-routing-enabled=true`）；簡易模式同樣使用內部 DNS。兩者都關閉時，內部 DNS 功能便不會生效。即使流量全走直接連線，也必須連線 MintFlow VPN。

## 不需要遠端 VPN 的加密 DNS

將**直接連線 DNS**設定為 DoH 或 DoT，並選擇直接連線出口。iOS 的加密 DNS 與 DNS 廣告阻擋皆可免費使用，無須遠端 VPN 訂閱或 HTTP 檢查憑證。

```ini
[dns]
app-routing-enabled=true
direct-dns=tls://1.1.1.1
optimistic-dns-caching=true

[routing]
DNS-FALLBACK,DIRECT
DEFAULT,DIRECT
```

一般 IP（例如 `1.1.1.1`）使用明文 DNS；`tls://1.1.1.1` 使用 DoT；`https://cloudflare-dns.com/dns-query` 使用 DoH。請選擇你信任的解析器。加密保護與解析器之間的連線，解析器仍能看見查詢。[Cloudflare 的 DoT 文件](https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-tls/)介紹了這種傳輸方式。

## 分流 DNS 與 VPN DNS

**直接連線 DNS**解析直接連線的網域，**VPN DNS**解析指派給 VPN 或代理伺服器的網域。工作網域可交給私有解析器，一般名稱則交給選定的公共解析器。所選出口必須能連到私有解析器。

如果加密的 `vpn-dns` 上游使用主機名稱，請以 `VPN-DNS-SERVER-DOMAINS` 指定啟動解析的 VPN/代理伺服器路徑；`bootstrap-dns` 提供初始解析器位址。啟動查詢與加密的應用程式網域查詢是不同步驟。

```ini
[dns]
app-routing-enabled=true
direct-dns=tls://1.1.1.1
vpn-dns=https://cloudflare-dns.com/dns-query
bootstrap-dns=1.1.1.1,8.8.8.8

[routing]
VPN-DNS-SERVER-DOMAINS,L3VPN,my-wireguard
DNS-FALLBACK,L3VPN,my-wireguard
DEFAULT,L3VPN,my-wireguard
```

此片段假設已建立可用的 `my-wireguard` 介面與對等節點。完整匯入步驟請見 [WireGuard 服務商與加密 DNS](https://galaxnet.dev/zh-hant/mintflow/articles/wireguard-provider-secure-dns/)。同時使用直接連線及 VPN/代理伺服器路徑時，請設定兩組 DNS。

## 靜態 DNS 記錄與 Tailscale 名稱

Pro 靜態記錄適合家用 NAS、測試伺服器或本機服務，不必將位址公布到公共 DNS：

```ini
[dns-hosts]
nas.example.com=192.168.40.10
lab.example.com=192.168.40.20,192.168.40.21
```

記錄精確比對主機名稱，不支援萬用字元，也不自動涵蓋子網域。最多 256 個名稱，每個名稱可有 1–16 個 IPv4 位址。這些記錄先於網域規則與廣告過濾在本機回答，但不會建立流量路由；請加入適當的 CIDR 路由，或確認位址能經其他路徑存取。簡易模式不啟用靜態及衍生記錄。

Pro Tailscale 介面啟用 `drive-dns:true` 後，可衍生對等節點 IPv4 記錄。使用者靜態記錄優先於衍生名稱。使用中 tailnet DNS 區域內的未知名稱留在本機，不會交給公共 DNS。這是 MintFlow 衍生 DNS，並非官方用戶端的完整 MagicDNS 設定。請見 [Tailscale 設定](../howtos/tailscale.md)。

## 2.1.0 內建 DNS 廣告阻擋

過濾需自行啟用，在裝置本機執行，只有放行的查詢會送到上游。一次選擇一份預設清單：**AdGuard DNS filter**（預設）、**HaGeZi Multi Normal** 或 **OISD Small**。三者皆附有初始離線快照；開啟 App 時會為已啟用清單安排非同步更新，也能按**重新整理**手動檢查。更新失敗時沿用最後接受的副本。

1. 選取所需設定檔，開啟 **DNS 與分流 → DNS 廣告阻擋**。
2. 開啟過濾、選擇清單並儲存；必須啟用內部 DNS。
3. 啟動 VPN。已連線時請查看使用中狀態：支援的單純過濾變更可即時套用，其他設定檔變更可能需要重新啟動。
4. 利用網域檢查器、**DNS 日誌 → 規則類型**及**工具 → DNS 執行階段 → DNS 廣告阻擋**查看實際狀態。只檢查快取清單，無法證明執行中的通道會阻擋該網域。

```ini
[dns-adblock]
enabled=true
list=adguard-dns
```

遭阻擋的查詢會收到 **NODATA**（成功但沒有答案的 DNS 回應），不向上游查詢，也不回傳假位址。DNS 過濾不需要 MITM 憑證，清單不會占用網域集合路由額度。

## 例外與限制

規則模式順序為**使用者靜態記錄 → Tailscale 衍生 DNS → 網域集合 → 有序關鍵字 → 廣告過濾 → DNS 預設處理**。符合轉送類網域規則時會略過過濾；Drop/Reject 規則仍依原有行為阻擋。請將放行例外限制在必要範圍。`DNS-FALLBACK,DIRECT` 不會停用過濾。簡易模式則為**廣告過濾 → 所選出口**，已儲存的靜態及網域規則不會啟用。

過濾檢查查詢的 DNS 名稱，不檢查每個 URL 或回傳的完整 CNAME 鏈。它無法移除網頁空白，也難以可靠阻擋與正常內容共用網域的廣告，例如許多影片與動態消息廣告。App 自帶加密 DNS、代理伺服器端遠端解析、直接使用 IP 或既有位址快取，都可能略過本機 DNS 檢查。2.1.0 不支援自訂訂閱或疊加清單。

誤擋時請先檢查符合的規則。規則模式可加入範圍較小的轉送網域集合例外；簡易模式可換清單、關閉過濾，或切換規則模式使用例外。範例請見[路由規則引擎](routing-engine.md)。
