適合已能正常連線代理、想最佳化網域解析品質的使用者。讀完能獨立寫出含中國大陸與海外分流的 dns 區段,理解 expectIPs 的驗證語意,並對應到 v2rayN 的參數設定項目。
DNS 分流要解決的兩個問題
在中國大陸網路環境下直接查詢海外網域,回應經常被污染:回傳的 IP 不屬於目標站點,連線表現為逾時或落到錯誤頁面。加密遠端解析把查詢包進 TLS 通道,污染源無法竄改回應內容,這是 DoH 在分流中的核心作用。
中國大陸網域則相反。走遠端解析雖然也能拿到結果,但查詢鏈路多一跳代理,且部分中國大陸 CDN 會依解析來源回傳不同節點,遠端解析容易拿到跨區節點。中國大陸網域交給本機 DNS,就近解析,CDN 調度更準。
| 比較維度 | 本機 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 三種取值的適用場景
- AsIs:只用網域字串匹配規則,不主動解析,適合規則全部按網域書寫、不依賴 IP 規則的場景。
- IPIfNonMatch:網域規則未命中時再解析網域並嘗試 IP 規則,是分流場景的常用值。
- IPOnDemand:只要規則裡出現 IP 條件就解析,DNS 請求更頻繁,一般不需要。
結論:讓 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 放行內網位址區段,避免內網網域被誤判丟棄。
驗證分流是否生效
- 設定 → 參數設定 → 基礎設定,把日誌等級調到 debug,重新連線節點。
- 造訪一個海外站點,在日誌裡確認該網域由第一條 DoH 解析,查詢經代理發出。
- 造訪一個中國大陸站點,確認查詢落到 223.5.5.5,且回應通過 geoip:cn 驗證。
- 在命令列執行
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設定」裡完成,不要直接編輯產生的設定檔。