2026-09-09 · 進階設定 · 約 12 分鐘

DNS 分流與解析設定

說明 dns 區段的 servers、domains、expectIPs 欄位,並示範搭配 geosite 規則分流國內外網域解析,減少解析結果錯誤。

本文重點

本文適合已能連線至節點,並準備調整 DNS 與路由規則的使用者。範例以 Xray 核心的傳統 JSON 設定為基礎,分別說明解析器選擇、解析結果篩選與連線出口,並提供可合併的設定片段及驗證步驟。V2Fly 支援哪些欄位,請依實際核心版本確認,不能只憑客戶端名稱判斷相容性。

先釐清解析與連線出口

DNS 分流決定「向哪個解析器查詢網域」,路由分流則決定「連線從哪個出口送出」。兩者彼此相關,但不是同一個開關。指定某網域使用國內解析器,不代表該網域一定直連;選擇代理出口,也不代表應用程式先前的 DNS 查詢已經透過代理。

網域進入核心 判斷網域規則 視需要解析 IP 位址 判斷 IP 位址規則 選擇連線出口

這個流程對應本文採用的 routing.domainStrategy: "IPIfNonMatch":先嘗試比對網域規則,未命中時才為 IP 規則解析位址。如果已命中網域規則,路由階段可能完全不會查詢內建 DNS;後續是否解析,則取決於實際出站的處理方式。因此,不能只因為「沒看到 DNS 記錄」就判定設定未生效。

servers、domains 與 expectIPs

dns.servers 是解析器清單,可填入伺服器位址,也可使用附帶條件的物件。物件中的 domains 用來優先比對網域;expectIPs 則用來檢查伺服器回傳的位址是否符合預期。前者用來選擇查詢對象,後者用來篩選結果,兩者不能互相取代。

國內網域解析器

address
223.5.5.5
domains
geosite:cn
expectIPs
geoip:cn
skipFallback
true

優先處理國內網域,並排除在其他網域的一般備援候選清單之外。

一般備援解析器

address
https://1.1.1.1/dns-query
傳輸方式
HTTPS
domains
不限
查詢 IP 類型
沿用全域 UseIPv4

處理未命中專用規則,或專用解析結果未通過篩選的查詢。

skipFallback: true 的意思是「此伺服器不參與一般備援」,而不是「命中此伺服器後禁止再使用備援」。如果國內網域的回應不符合 expectIPs,範例仍可能改用其他備援解析器。混淆這兩種語意,就容易誤判查詢實際送往何處。

geosite:cn 來自網域分類資料,geoip:cn 則來自 IP 分類資料。它們不是即時地理位置服務,也不會依網頁顯示語言判斷所在地。國內服務使用境外位址、跨區 CDN,或分類資料更新不及時時,嚴格的 IP 預期可能會篩掉有效結果。

合併 DNS 與路由設定片段

以下 JSON 並非完整的節點設定。範例假設現有的 outbounds 已包含 direct 和 proxy 兩個標籤,分別代表直連出站與已確認可用的代理出站。合併時請更新現有的 dns 和 routing,不要在同一個物件中重複宣告這些鍵。

{
  "dns": {
    "queryStrategy": "UseIPv4",
    "servers": [
      {
        "address": "223.5.5.5",
        "domains": [
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ],
        "skipFallback": true
      },
      "https://1.1.1.1/dns-query"
    ]
  },
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": [
          "223.5.5.5/32"
        ],
        "port": "53",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "1.1.1.1/32"
        ],
        "port": "443",
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": [
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "geoip:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

前兩條規則會指定解析器連線的出口:連往 223.5.5.5:53 的查詢走直連,連往 1.1.1.1:443 的連線走代理。一般的 https:// 格式 DoH 會使用核心的路由機制;不要直接換成帶有 +local 的格式,兩者的連線處理路徑不同。這些 IP 與埠號規則也會比對目的地相同的其他流量,不只辨識 DNS 內容。

53
國內解析器的 UDP 目的埠
443
DoH 解析器的 HTTPS 目的埠
2
範例設定中的上游解析器

請勿任意調換規則順序。解析器出口規則應放在前面,避免 DoH 位址被後續的 IP 分類規則意外分流;最後一條規則明確將剩餘的 TCP、UDP 流量送往 proxy,而非依賴出站清單的預設順序。若已有區域網路、封鎖或業務規則,請逐條整合;不能整段覆蓋後,就假設原有行為仍會保留。

判斷方式:先固定解析器出口,再比較回應

先確認 1.1.1.1:443 確實命中 proxy,再觀察網域的解析結果。只更改 DNS 位址而不檢查連線出口,無法確認遠端查詢是否依預期送出。

也要確認直連出站的解析策略

國內網域命中網域規則後,連線會進入 direct。如果該出站使用 Freedom 協定並保留預設解析策略,最終連線仍可能使用系統解析,而非本文設定的內建 DNS。若要讓直連出站明確使用內建解析,請檢查現有出站並調整其 settings.domainStrategy。

{
  "tag": "direct",
  "protocol": "freedom",
  "settings": {
    "domainStrategy": "UseIPv4"
  }
}

這是 outbounds 陣列中的單一物件,請修改現有的 direct,不要再新增同名出站。此處的 UseIPv4 搭配前述 DNS 查詢策略,可做為方便排查問題的 IPv4 基準;這不表示必須停用 IPv6。

在客戶端驗證實際設定

v2rayN 是桌面客戶端,v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心。客戶端介面會產生執行設定,因此「編輯欄位中有這個欄位」不代表「目前的核心正在使用它」。本文不綁定特定介面版本;驗證時一律以目前的節點、執行核心與最終產生的 JSON 為準。

  1. 保存基準設定:備份目前可用的設定,記錄節點、核心版本、系統代理狀態,以及是否啟用虛擬網卡。一次只調整 DNS 與相關路由,避免同時更換節點和傳輸參數。
  2. 檢查執行設定檔:確認最終 JSON 包含兩項 dns.servers、預期的出站標籤及完整的規則順序。若設定由介面產生,請在持久化的設定入口修改,不要只編輯下次啟動時會被覆寫的暫存檔。
  3. 啟用診斷記錄:暫時將 log.loglevel 設為 debug,重新啟動核心後再次發出請求。記錄內容會因版本而異,請特別留意解析器目標、命中的出站和錯誤訊息。
  4. 分開測試:選一個確認屬於 geosite:cn 的網域,再選一個不在該集合中的網域。關閉重複連線,必要時重新啟動應用程式,避免重用連線而掩蓋新的 DNS 行為。
  5. 恢復日常記錄層級:測試完成後,將記錄層級調回 warning 或原設定。分享記錄前,請先清除節點位址、訂閱連結和存取網域等資訊。

如果本機有對應的核心指令,可先在設定檔所在目錄檢查語法與載入狀況。以下兩個指令分別是 Xray 和 V2Fly 常見的命令列格式,請只執行符合實際核心的一個;設定測試通過不代表上游解析器已可連線。

xray run -test -config config.json
v2ray test -c config.json

不要用 nslookup example.com 223.5.5.5 的結果來證明核心 DNS 分流已生效。此指令會直接查詢指定伺服器,適合檢查這條查詢路徑是否可用,但不會經過本文的網域分類、備援與代理出口規則。系統 DNS 測試和核心請求測試應分開記錄。

DNS 污染防護的限制與常見問題

本文所說的「DNS 污染防護」,是透過加密遠端查詢、固定出口和篩選異常位址來減少錯誤結果,並非由單一欄位提供絕對保證。DoH 只能保護查詢傳輸至解析器的過程;解析器是否可信、應用程式是否另外發出查詢,以及系統是否使用快取,仍會影響最終連線。

國內網站也開始載入很久,該先改哪裡?

先暫時移除國內伺服器的 expectIPs,其他設定保持不變後重新測試。如果延遲恢復,請檢查該網域的實際回應是否符合 geoip:cn 分類;不要直接增加更多備援伺服器來掩蓋原因。

設定遠端 DNS 後,為什麼還是看到本機查詢?

先判斷查詢是來自瀏覽器、作業系統、節點網域解析,還是核心。檢查應用程式的安全 DNS、系統代理涵蓋範圍,以及 Freedom 的 domainStrategy。核心 DNS 設定不會自動阻止其他程序向外送出查詢。

設定一儲存就無法啟動,該如何排查?

先查看第一則錯誤是否指出 JSON 語法、未知欄位或分類資料載入問題。確認核心可以讀取 geosite.dat、geoip.dat,並核對 direct、proxy 是否確實是現有的出站標籤。

DoH 一直逾時,但代理節點可以連線?

確認 1.1.1.1:443 的請求確實命中代理出站,並檢查節點至解析器的連線狀況。確認系統時間及是否有憑證錯誤;不要藉由關閉憑證驗證來規避問題。必要時可另外更換一個可驗證的 DoH 端點進行比較。

修改完成後,為什麼網頁仍連到舊位址?

結束並重新開啟應用程式、重新啟動核心,再測試新的連線。瀏覽器、作業系統、核心和遠端解析器都可能使用快取;只重新整理頁面可能會沿用現有連線,不能據此判定新規則未生效。

保留容易排查的最小設定

可維護的 DNS 分流設定,應能回答三個問題:網域為何選中這個解析器、解析器連線為何經過這個出站,以及最終目標為何採用直連或代理。先透過記錄和執行設定釐清這三點,再逐步新增規則,比不斷堆疊解析器位址更容易找出問題。

客戶端與安裝檔