V2Ray DNS 設定指南:中國大陸與海外分流解析與防污染寫法

以 Xray 設定中的 dns 區段為例,說明中國大陸網域走本機解析、海外網域走加密遠端解析的分流架構,以及 expectIPs 與 DoH 伺服器的組合用法。

本文速覽

適合已能正常連線代理、想最佳化網域解析品質的使用者。讀完能獨立寫出含中國大陸與海外分流的 dns 區段,理解 expectIPs 的驗證語意,並對應到 v2rayN 的參數設定項目。

DNS 分流要解決的兩個問題

在中國大陸網路環境下直接查詢海外網域,回應經常被污染:回傳的 IP 不屬於目標站點,連線表現為逾時或落到錯誤頁面。加密遠端解析把查詢包進 TLS 通道,污染源無法竄改回應內容,這是 DoH 在分流中的核心作用。

中國大陸網域則相反。走遠端解析雖然也能拿到結果,但查詢鏈路多一跳代理,且部分中國大陸 CDN 會依解析來源回傳不同節點,遠端解析容易拿到跨區節點。中國大陸網域交給本機 DNS,就近解析,CDN 調度更準。

應用程式發起請求命中網域規則中國大陸走本機 DNS海外走 DoH依 IP 建立連線
比較維度本機 DNS遠端 DoH
查詢鏈路直接連線電信業者或公共 DNS經代理出站加密查詢
適用網域geosite:cn 中國大陸網域geosite:geolocation-!cn 海外網域
防污染能力弱,明文查詢強,TLS 內不可竄改
延遲表現低,就近解析較高,多一跳代理

分流的目標不是把查詢機械式拆開,而是讓兩類網域各走各的解析通道,同時保證 routing 規則與 dns 區段使用同一套網域集合。

dns 區段的基礎結構與分流寫法

Xray 的 dns 區段是一個 servers 陣列,依序匹配:網域命中某個條目的 domains 列表就使用該條目;不帶 domains 的條目匹配所有網域,放在最後做為兜底。把下面這段放到設定根節點即可。

"dns": {
  "servers": [
    {
      "address": "https://1.1.1.1/dns-query",
      "domains": ["geosite:geolocation-!cn"],
      "tag": "proxy"
    },
    {
      "address": "223.5.5.5",
      "domains": ["geosite:cn"],
      "expectIPs": ["geoip:cn"]
    },
    "223.5.5.5"
  ]
}

第一條管海外,查詢經代理出站發出;第二條管中國大陸,用 expectIPs 驗證回應歸屬;第三條是裸位址兜底,涵蓋 geosite 資料未收錄的網域。v2rayN 產生的設定中,代理出站 tag 為 proxy,直連為 direct,引用時保持一致。代理伺服器位址建議直接填 IP,減少誘導解析環節。

本機 DNS

位址
223.5.5.5 或 119.29.29.29
匹配
geosite:cn
驗證
expectIPs: geoip:cn
出站
direct

中國大陸網域就近解析,CDN 調度準確。

遠端 DoH

位址
https://1.1.1.1/dns-query
匹配
geosite:geolocation-!cn
出站
tag: proxy
驗證
可選 geoip:!cn

查詢經代理發出,回應不可被污染。

有固定解析需求的網域可以寫進 dns.hosts,它的優先順序高於 servers 陣列,查詢不會對外發出。內網主機名稱、自建服務網域適合放在這裡。

routing 規則與 domainStrategy 的搭配

dns 區段決定網域由誰解析,routing 決定連線走哪條出站。只設 dns 區段不設 routing,流量仍可能全走代理;只設 routing 不設 dns,中國大陸網域也會被遠端解析污染。兩者必須成對出現。

"routing": {
  "domainStrategy": "IPIfNonMatch",
  "rules": [
    {
      "type": "field",
      "domain": ["geosite:cn"],
      "outboundTag": "direct"
    },
    {
      "type": "field",
      "domain": ["geosite:geolocation-!cn"],
      "outboundTag": "proxy"
    }
  ]
}

domainStrategy 三種取值的適用場景

結論:讓 dns 區段與 routing 共用同一套網域集合

geosite:cn 在兩側同時出現,海外側用 geosite:geolocation-!cn 取補集,中間不留空白,否則會出現解析走 DoH、連線走直連的錯位。

expectIPs 的防污染語意與驗證方法

expectIPs 不是路由規則,它只驗證解析結果:結果不在給定 geoip 列表內就丟棄,並依序嘗試下一個伺服器。中國大陸條目最常用的寫法是 expectIPs: ["geoip:cn"],確保本機 DNS 只接受中國大陸 IP。

{
  "address": "223.5.5.5",
  "domains": ["geosite:cn"],
  "expectIPs": ["geoip:cn", "geoip:private"]
}

expectIPs 支援取反寫法,海外條目可以加 geoip:!cn,拒絕解析到中國大陸 CDN 節點的結果。若希望驗證失敗直接報錯而不是回退,可在條目上加 skipFallback: true。geoip:private 放行內網位址區段,避免內網網域被誤判丟棄。

驗證分流是否生效

  1. 設定 → 參數設定 → 基礎設定,把日誌等級調到 debug,重新連線節點。
  2. 造訪一個海外站點,在日誌裡確認該網域由第一條 DoH 解析,查詢經代理發出。
  3. 造訪一個中國大陸站點,確認查詢落到 223.5.5.5,且回應通過 geoip:cn 驗證。
  4. 在命令列執行 nslookup www.qq.com 223.5.5.5,確認本機 DNS 本身可用。

結論:expectIPs 是驗證器,不是路由器

它只丟棄不合格的解析結果,不改變流量走向;流量走哪條出站由 routing 規則決定,不要指望 expectIPs 替你分流。

常見問題與排查

設定分流後遇到問題,依下面四條順序排查。

開啟分流後中國大陸網站反而變慢?

先看日誌確認查詢命中了哪台伺服器。常見原因是 geosite:cn 資料過舊,新網域沒被收錄,走了遠端 DoH。更新 geosite 與 geoip 資料檔,或把該網域寫進 dns.hosts 固定走本機解析。

遠端 DoH 一直逾時?

確認 DoH 條目的 tag 指向代理出站,v2rayN 裡對應勾選「遠端DNS走代理」。1.1.1.1 直連無法連線時,把位址換成 https://dns.google/dns-query 或 https://8.8.8.8/dns-query。

海外網域解析到的 IP 仍是污染位址?

該網域很可能不在 geosite:geolocation-!cn 涵蓋範圍內。檢查 dns 區段第一條的 domains 與 routing 的海外規則是否使用同一網域集合,再把日誌等級調到 debug,確認查詢確實落在 DoH 條目上。

手改 config.json 後一選節點就失效?

v2rayN 切換伺服器時會依內建模板重新產生設定,手改的 dns 區段會被覆蓋。分流設定請在「設定」→「參數設定」→「DNS設定」裡完成,不要直接編輯產生的設定檔。

v2rayN下載