DNS
規則要先看見名字,或看見地址。兩套 DNS 會給出兩套答案。
域名條件吃主機名。IP / GEOIP 條件吃目的地址。名字從哪來、地址由誰解析,決定這一條連線打在名單的哪一段。解析沒有異常時,不必同時改系統 DNS 和應用內 DNS。
01
系統一份,應用內可以再有一份
裝置本身已有系統 DNS(營運商、路由器、或你在系統設定裡寫的伺服器)。Shadowrocket 還可以在配置裡指定自己的 DNS,包括加密查詢。兩套同時存在時,某一次查詢走哪一套,以目前配置為準,不是「兩個結果取平均」。
系統 DNS 與應用內 DNS 指向不同的遞迴、且對同一名字給出不同地址時,規則裡的 GEOIP 會跟著變:同一主機名,一次命中 CN,一次落到 FINAL。這不是規則檔案被改了,是目的地址換了。
對照時一次只改一處。先讓 Direct 下的系統解析能工作(門戶頁、本機訪問),再開啟隧道。應用內 DNS 填錯、填成不可達的地址,表現為所有依賴解析的請求失敗,開關卻可以是亮的。用 Data 看有沒有位元組,比反覆換記錄快。
02
有的請求帶名字,有的只剩地址
瀏覽器通常既有主機名(Host / SNI)又有解析出的地址,域名行和地址行都有機會命中——仍然是自上而下先中的那一行。
應用若直接連線 IP、或不帶 SNI,域名行全部落空,只能打在 IP-CIDR、GEOIP 或 FINAL 上。於是「同一個站點,Safari 走代理、某用戶端走直連」:兩個程式送給引擎的資訊不一樣。見規則頁「主機名從哪來」。
SNI 寫的是 example.com,實際連的是 CDN 的另一個地址:域名行按 example.com 匹配,GEOIP 按 CDN 地址歸類。若域名行寫在 GEOIP 前面並已命中,GEOIP 根本不會被問到;若域名行沒命中,你看到的就是 CDN 所在庫,不是你對這個名字的印象。
03
只寫了 IPv4 網段時,IPv6 目的地址看不見這行
IP-CIDR,10.0.0.0/8,DIRECT 不管 IPv6。裝置若用 fd00:: 或全球 IPv6 去訪問同一臺服務,這一行不命中,請求繼續往下掉,直到 GEOIP 或 FINAL。Wi-Fi 給了 IPv6、行動網路沒給,同一規則會在兩種網路下表現不同。
需要管兩種地址族時,補 IP-CIDR6,或在設定裡關掉不使用的那一種。不要用「再加一條相同的域名 DIRECT」去修地址族問題——域名行在「只有地址、沒有名字」的請求上幫不上忙。
04
本地對映:規則可能看見一張不是公網的地址
部分配置會把域名先解析到一組本地或虛假地址,再在隧道裡換成真實目的。這時 IP-CIDR / GEOIP 看到的是對映後的地址,不是網站在公網上的地址。GEOIP 的國家代碼行對這樣的地址沒有意義,結果會全部落到其他行。
若名單大量依賴 GEOIP,而解析策略改成了虛假地址,分流會整體偏移。改解析模式等於換了一套規則在吃的輸入,不是小選項。改之前先用固定記錄、Proxy 策略確認出口本身可用,見 Data。
本機 hosts 式的對映只影響被寫出的那些名字。沒寫到的名字仍走目前 DNS。不要指望對映表代替規則檔案。