DNS 模組在 Clash 裡的位置
Clash 的分流規則分兩類:按網域名稱比對(DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD)與按 IP 比對(IP-CIDR、GEOIP)。按 IP 的規則必須先取得網域對應的位址才能判定走向,因此 Clash 內建了完整的 DNS 解析模組,而不是把解析交還給作業系統。網域規則在連線進入時即可比對,IP 規則則依賴 DNS 模組給出的解析結果,兩者共同決定一次連線走哪條策略組。
系統預設 DNS 通常是電信業者下發的明文 UDP 53 服務,查詢內容全程可見、可被中間設備竄改。Clash 接管 DNS 之後,查詢走哪條線路、用什麼協定、採信哪份結果,全部都能在設定裡固定下來,這是 nameserver、fallback、enhanced-mode 這些欄位存在的前提。
dns 區段的總開關是 enable;listen 決定 Clash 在哪個位址與埠上應答查詢,常見寫法 0.0.0.0:53。桌面用戶端開啟系統代理或 TUN 模式時,通常會自動把系統 DNS 指向這個監聽位址,區域網路內其他裝置也可以把 DNS 手動指過來,達到查詢統一收口的效果。
nameserver:主要上游與寫法
nameserver 是 Clash 的主要解析線路,清單內每一項支援三種寫法:
- 純 IP,如
223.5.5.5,走傳統明文 UDP 53,延遲最低; tls://1.1.1.1:853,DNS over TLS,查詢走加密的 853 埠;https://doh.pub/dns-query,DNS over HTTPS,查詢封裝在 HTTPS 請求裡。
清單的語意是並發競速,而不是主備:Clash 會同時向清單內全部上游發起查詢,採用最先回傳的結果。因此 nameserver 裡放 2~3 個低延遲上游即可,堆疊更多項目不會提升可靠度,只會放大出口流量。
與 nameserver 搭配的是 default-nameserver,它是整條線路的引導解析器。DoH、DoT 上游本身以網域形式給出,解析「解析器自己的網域」時不能再依賴這些上游,否則會形成循環依賴。default-nameserver 必須填可直接以 UDP 存取的純 IP,例如 223.5.5.5、119.29.29.29,只在啟動階段使用,平時查詢不會經過它。
default-nameserver 只填純 IP
不要把 https:// 或 tls:// 形式填進 default-nameserver。它是 DNS 線路的起點,職責是解析 DoH、DoT 伺服器的網域,本身必須不依賴任何加密上游。
fallback 與 fallback-filter:備援結果的判定邏輯
對 fallback 最常見的誤解是「主上游掛了才啟用」。實際行為是:設定 fallback 後,Clash 對同一網域會同時查詢 nameserver 與 fallback 兩組上游,再依 fallback-filter 的規則決定採信哪一份結果。fallback 是結果篩選機制,不是故障轉移機制。
預設判定條件是 geoip: true 加 geoip-code: CN:若 nameserver 回傳的 IP 屬於中國大陸,採用 nameserver 的結果;否則改用 fallback 的結果。這條邏輯的目的很直接——境內網域信任境內低延遲上游,境外網域的解析結果只信任加密出境的上游。
fallback-filter 還有兩個補充條件:ipcidr 列出不可信的網段,回傳 IP 落入其中(例如保留段 240.0.0.0/4)即判定結果被污染,強制採用 fallback;domain 列出直接採用 fallback 結果的網域,適合個別已確認會被投毒的目標。
有個前提不能省:fallback 上游必須全部使用 DoH 或 DoT。如果 fallback 裡填明文 UDP 位址,境外網域的查詢仍以明文出網,劫持與投毒問題原樣保留,fallback 機制形同虛設。
enhanced-mode:fake-ip 與 redir-host 的分歧
enhanced-mode 決定 Clash 如何回應應用程式發起的 DNS 請求,兩個設定值對應兩條路線。
redir-host 是傳統模式:Clash 收到網域連線後先做一次真實解析,取得 IP 再依規則轉發。行為直觀、相容性最好,代價是本地會產生真實的 DNS 查詢,這些查詢經過網路時存在被劫持、被記錄的空窗。
fake-ip 是預設建議模式:Clash 對需要解析的網域直接回傳 fake-ip-range(預設 198.18.0.1/16)段內的一個假位址,應用程式連線這個假位址時,Clash 反查出原始網域並依網域規則分流,真正的解析延後到代理出口一側完成。本地幾乎不再發起真實網域查詢,劫持者拿不到可竄改的明文請求,延遲也少一次往返。
fake-ip-filter 列出不應回傳假位址的網域。區域網路網域(*.lan、*.local)、NTP 校時、STUN 打洞類服務必須拿到真實 IP 才能運作,收到假位址會直接異常,這些項目要保留在過濾清單裡。fake-ip 與區域網路共享代理、部分 P2P 連線場景存在相容性問題,遇到異常時退回 redir-host 即可,兩種模式可隨時切換比較。
dns 區段欄位速查
| 欄位 | 作用 | 常見設定值 |
|---|---|---|
enable | DNS 模組總開關 | true |
listen | 應答查詢的監聽位址埠 | 0.0.0.0:53 |
ipv6 | 是否回傳 AAAA 記錄 | false |
enhanced-mode | 應答模式 | fake-ip / redir-host |
fake-ip-range | 假位址分配段 | 198.18.0.1/16 |
fake-ip-filter | 不回傳假位址的網域 | *.lan、*.local 等 |
default-nameserver | 引導解析器,解析上游網域 | 223.5.5.5 |
nameserver | 主要上游,並發競速 | DoH / DoT / 純 IP |
fallback | 備援上游,依 filter 採信 | DoH / DoT |
fallback-filter | 結果採信判定條件 | geoip、ipcidr、domain |
DNS 劫持的機制與設定對策
DNS 劫持的典型機制:明文 UDP 53 查詢經過電信業者閘道時,閘道搶在真實上游之前回傳偽造應答,把網域指向錯誤的 IP。外在表現是造訪正常網站卻被帶到不相關頁面、同一網域在不同網路下解析出差異巨大的結果。劫持針對的是「明文」與「53 埠」這兩個特徵,對策也圍繞這兩點展開。
下面四條同時成立,防劫持才算閉環:
- nameserver 與 fallback 全部使用 DoH、DoT,查詢內容加密,中間設備讀不到也改不了封包。
- enhanced-mode 使用 fake-ip,本地不再為走代理的網域發起真實解析,攻擊面進一步收縮。
- 系統 DNS 指向 Clash 的 listen 位址,或開啟 TUN 模式接管全部流量,所有查詢收口進入 Clash 內部。
- fallback-filter 保持 geoip 判定,境外網域的結果只來自加密上游,境內結果來自低延遲本地上游。
驗證設定是否生效
把用戶端日誌等級調到 debug,觀察 dns 相關輸出;再用 dig @127.0.0.1 網域 分別測試境內與境外網域,比對回傳的 IP 是否符合分流預期——境內網域應得到本地電信業者附近的結果,走代理的網域在 fake-ip 模式下應回傳 198.18 段位址。
可直接套用的完整範例
下面這段 dns 設定把前述欄位整合成一份可用範本,逐行對應前面的講解,替換上游位址為自己偏好的即可:
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "localhost.ptlogin2.qq.com"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback:
- https://dns.google/dns-query
- tls://1.1.1.1:853
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
domain:
- "+.example.com"
要點回顧:default-nameserver 兩個純 IP 負責引導;nameserver 兩個境內 DoH 並發競速;fallback 兩個加密境外上游;fallback-filter 用 geoip-code CN 做採信分界,ipcidr 擋掉保留段污染,domain 清單依需求增減個別網域。fake-ip-filter 裡的項目按實際區域網路環境補充,某服務出現異常時優先懷疑它缺了過濾項目。
mihomo(Clash Meta)裡的演進
mihomo 核心完整相容上述欄位,舊的 dns 設定可以原樣搬移。在此基礎上,它新增了幾個更細緻的欄位,適合逐步遷移:
nameserver-policy:依網域後綴規則指定上游,比 fallback 的二元判定更細緻,可以把某一組網域固定交給指定 DoH,實現多條解析線路並存;proxy-server-nameserver:專門解析設定裡節點伺服器的網域,避免節點網域被污染導致整組代理不可用;direct-nameserver:為直連流量單獨指定解析線路,與代理網域解耦;respect-rules:讓 DNS 查詢本身也依分流規則選擇出口,境外上游的 DoH 請求經代理發出,進一步降低被干擾的機率。
遷移建議:新寫的 mihomo 設定優先用 nameserver-policy 表達分流意圖,把 fallback 留作備援;舊設定不必急著重寫,先確認 fallback-filter 行為符合預期,再逐條遷移。
下載用戶端,動手設定 DNS
dns 區段寫法在各家 Clash 用戶端裡通用。先到下載中心依平台裝好用戶端,再依本文調整 nameserver、fallback 與 enhanced-mode。