本文適合已具備可用代理出站、需要調整 DNS 策略的使用者。先釐清解析器選擇與查詢傳輸路徑,再整合中國大陸網域規則、遠端 DoH 與直連出站設定,最後透過獨立測試入口檢查解析鏈路。範例採用 V2Ray 風格的 JSON 片段,不會取代訂閱中的伺服器設定,也不假設所有用戶端都使用相同核心。
一、DNS 分流分為解析器選擇與查詢路由
DNS 分流不是把兩個伺服器位址放進清單就完成了。第一步是決定某個網域交由哪個解析器處理,第二步是決定連往解析器的連線採直連或代理。兩者都設定清楚,才能確認境外網域的查詢是否經過預期鏈路。加密 DNS 能保護查詢傳輸,但無法保證解析服務回傳的結果永遠正確。
核心 DNS 不等於作業系統 DNS。應用程式透過 SOCKS 傳入網域時,代理協定可能會把網域交由伺服器解析;若應用程式先呼叫系統解析器取得 IP,核心看到的可能只有 IP。只修改設定中的 dns 物件,不會自動接管電腦或手機上所有程式的查詢。
- 核心解析:路由需要 IP、直連出站需要解析,或 DNS 入站交由 DNS 出站處理時,才會用到內建解析模組。
- 遠端解析:目標網域隨代理請求送至伺服器後,實際使用的解析器取決於伺服器環境。
- 應用程式內建解析:瀏覽器的安全 DNS 可能會自行發出 DoH 請求,不會直接使用這裡的伺服器清單。
二、設定前確認核心、規則檔與出站標籤
v2rayN 是桌面端設定管理用戶端,實際行為取決於目前使用的核心。Android 版 v2rayNG 使用 Xray 核心,v2flyNG 則使用 V2Fly 核心。兩者許多欄位相近,但不代表所有 DNS 選項、FakeDNS 行為和預設值都完全相同。請先記下核心名稱與版本,再對照相關設定文件確認欄位是否支援。
- 在 v2rayN 的「設定」→「參數設定」中確認與目前核心相關的選項;DNS 設定入口會因用戶端版本而異,請以實際介面為準。
- 先備份目前的設定,查看產生的設定檔中
outbounds,記下代理與直連出站實際使用的tag。 - 確認執行目錄中的
geosite.dat可以讀取,且包含cn分類。只有使用 IP 分類時,才需要相應的geoip.dat規則。 - 先確認代理連線可用,再調整 DNS。若代理出站本身無法連線,遠端查詢失敗不一定是解析器造成的。
這些數字是設定所用的連接埠,不是效能測試結果。下文將現有代理出站稱為 proxy,直連出站稱為 direct;若實際標籤不同,引用處也要一併替換,不能只複製規則中的名稱。
三、中國大陸網域使用直連 DNS,其餘查詢使用遠端 DoH
將以下片段合併至現有設定頂層的 dns 欄位。中國大陸分類優先使用 223.5.5.5 查詢,未符合該分類的查詢則使用 https://1.1.1.1/dns-query。這兩個位址只是具體設定範例,不代表在所有網路環境中都能連線,也不表示一定要使用這組公共解析服務。
{
"dns": {
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"port": 53,
"domains": [
"geosite:cn"
],
"skipFallback": true
},
{
"address": "https://1.1.1.1/dns-query"
}
]
}
}
domains是解析器的優先比對條件。geosite:cn會依據規則檔中的分類運作,並非單純依網域後綴判斷,也不保證涵蓋所有中國大陸網站。skipFallback: true表示這台伺服器不會參與未符合網域的通用回退,避免境外網域在回退階段送往這個直連解析器。- 此設定仍允許中國大陸網域優先解析失敗後改用遠端伺服器,因此並非「中國大陸查詢絕不出境」的嚴格隔離策略。若需要嚴格隔離,請另外確認核心提供的回退控制選項。
UseIPv4可先縮小 IPv6 問題的排查範圍,但不代表系統停用了 IPv6。若需要雙堆疊,應依實際 IPv6 路由重新評估查詢策略。
遠端位址使用 IP 字面值,可減少「連線至 DoH 前還得先解析 DoH 網域」的前置依賴,但仍須通過 TLS 憑證驗證。請勿為了解決連線錯誤而關閉憑證驗證。若改用網域形式的解析服務,也要安排該服務網域的引導解析,避免再次依賴尚未建立的同一條 DNS 鏈路。
四、為 DNS 查詢指定出站,避免預設路由改變連線路徑
以下規則片段採用 AsIs,先處理兩個解析端點,再處理中國大陸網域,最後將其餘 TCP 與 UDP 連線交由代理處理。一般的 https:// DoH 與帶有本地直連語意的 https+local:// 不可混為一談:本例需要查詢連線經過核心路由,因此使用前者。
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": ["223.5.5.5"],
"port": "53",
"network": "udp",
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["1.1.1.1"],
"port": "443",
"network": "tcp",
"outboundTag": "proxy"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
這是方便觀察連線路徑的基本策略,不包含區域網路、企業內網或廣告分類等規則。合併時應保留必要的既有規則並檢查順序:規則通常依序比對,放在末尾的兜底規則不能提前攔截解析端點規則。上述 IP 與連接埠規則也會比對連往同一端點的其他連線,不只辨識 DNS 模組產生的流量。
直連出站也要檢查 Freedom 的網域策略。以下是既有直連出站應具備的結構;請修改對應項目,不要新增另一個同名標籤。UseIP 會讓該出站透過內建 DNS 取得目標 IP,否則預設行為可能仍依賴系統解析。
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIP"
}
}
結論:分別確認解析路徑與連線路徑
先確認中國大陸網域的直連出站確實會呼叫內建 DNS,再確認遠端 DoH 連線符合代理規則。只看到網頁能開啟,無法證明 DNS 分流已生效;代理請求若攜帶網域,目標解析仍可能在伺服器端進行。
五、透過獨立 DNS 入口驗證,別把瀏覽器快取當成結果
若要直接測試內建解析模組,可在現有 inbounds 與 outbounds 陣列中分別加入以下物件。入站只綁定 127.0.0.1,不要改成對外監聽位址。此入口供本機排查使用,不會自動修改系統 DNS,也不會自動接管瀏覽器查詢。
{
"tag": "dns-in",
"listen": "127.0.0.1",
"port": 1053,
"protocol": "dokodemo-door",
"settings": {
"address": "1.1.1.1",
"port": 53,
"network": "tcp,udp"
}
}
{
"tag": "dns-out",
"protocol": "dns",
"settings": {}
}
接著將以下規則放到前文 routing.rules 的最前面,讓測試請求進入 DNS 出站,而不是被末尾的代理兜底規則接走。DNS 出站會對 A、AAAA 查詢呼叫內建解析模組;其他記錄類型的處理與轉送行為應另行驗證,不要用一次 TXT 查詢取代本例的位址記錄測試。
{
"type": "field",
"inboundTag": ["dns-in"],
"outboundTag": "dns-out"
}
- 重新啟動核心,先檢查設定載入記錄,排除連接埠遭占用、欄位不明及規則檔讀取失敗等問題。
- 在已安裝
dig的環境中執行以下指令,分別測試中國大陸分類與遠端解析路徑。 - 搭配 DNS 除錯記錄與出站存取記錄,確認兩個解析端點實際使用的標籤。排查期間可暫時提高記錄層級,完成後再調回原設定。
- 每次只修改一項設定。重複查詢可能會命中快取;必要時重新啟動核心並清除應用程式或系統快取,再比對結果。
dig @127.0.0.1 -p 1053 www.baidu.com A
dig @127.0.0.1 -p 1053 www.example.com A
測試網域是否符合分類,仍須以目前使用的規則檔為準。解析結果不同不一定代表遭到污染;CDN 調度、解析服務位置與快取狀態都可能影響答案。應觀察查詢是否送往預期的解析器、是否逾時,以及最終目標連線是否成功,而非只比較兩次回傳的 IP。
六、FakeDNS、快取與路由解析策略的適用範圍
FakeDNS 回傳的是供核心映射使用的合成位址,不是目標網站的真實位址。它主要用來處理流量進入代理後保留或還原網域資訊的需求,不能取代真實解析服務,也無法修復無法連線的代理伺服器。啟用前應確認目前的核心、流量接管方式與網域還原鏈路都支援相應設定。
| 設定或機制 | 實際作用 | 常見誤判 |
|---|---|---|
| DNS queryStrategy | 控制內建解析模組查詢或使用的位址類型。 | 設為 IPv4 後,誤以為所有應用程式都不會再發出 IPv6 流量。 |
| routing.domainStrategy | 控制路由比對時是否為網域取得 IP。 | 把 AsIs 誤解為整個核心永遠不會解析網域。 |
| Freedom domainStrategy | 控制直連出站建立連線時如何處理網域。 | 只修改 DNS 清單,卻仍讓直連出站依賴系統解析。 |
| FakeDNS | 維護網域與合成位址的映射,後續流量必須回到能還原映射的核心。 | 只啟用合成回應,卻未確保對應連線也由核心接管。 |
| DNS 快取 | 重複使用先前取得的解析結果,減少重複查詢。 | 修改設定後仍看到舊結果,就認定新設定未載入。 |
IPIfNonMatch 會在網域規則未符合時嘗試解析,再繼續比對 IP 規則;IPOnDemand 則會在比對需要 IP 的規則時觸發解析。兩者都可能增加本機查詢。若設定中已有必定符合的兜底規則,別想當然地認為每個網域都會進入 IP 解析階段。
- 先用一般 DNS 與明確的網域規則確認基本鏈路,再加入 FakeDNS,避免同時引入位址映射與解析回退兩個變因。
- 修改規則檔後,依用戶端行為重新啟動或載入核心;更新檔案不代表執行中的規則已切換。
- 瀏覽器安全 DNS、系統 DNS 快取與核心 DNS 快取應分開排查;清除其中一層不會自動清除其他層。
七、DNS 分流常見問題與排查順序
設定了遠端 DNS,為什麼瀏覽器還是向本地解析器查詢?
先確認查詢是否進入核心。使用上文的 1053 連接埠測試入口單獨驗證,再檢查瀏覽器安全 DNS與系統代理行為。一般系統代理主要處理應用程式連線,不代表會接管作業系統的 UDP 53 查詢。
中國大陸網站可以開啟,境外網域卻一直解析逾時,該怎麼辦?
檢查 1.1.1.1:443 是否符合 proxy,並確認該標籤存在且代理連線正常。接著檢查 TLS 錯誤與系統時間。若代理伺服器位址本身是網域,也要排除其引導解析依賴遠端 DoH 而造成的循環。
更新訂閱後,剛設定的 DNS 怎麼不見了?
確認修改內容是否寫在用戶端暫時產生的執行設定檔中。切換節點或重新啟動時,產生的檔案可能會被覆寫。請使用目前版本提供的 DNS 設定或自訂設定入口儲存,再查看產生的結果,確認欄位與標籤都還在。
啟用 FakeDNS 後部分程式完全無法連線,該先檢查什麼?
先恢復一般解析並重新啟動核心,再清除相關應用程式快取。確認恢復正常後,檢查合成位址對應的連線是否回到同一個核心,以及入站網域還原設定是否符合目前核心的要求。請勿讓取得合成位址的程式繞過接管機制直接連線。
完成驗收後應保留三項記錄:目前使用的核心與設定來源、兩個解析端點對應的出站標籤,以及獨立測試入口的查詢記錄。這樣才能將問題定位在解析器選擇、查詢傳輸或目標連線階段,而不是一再更換公共 DNS 位址。