Clash DNS 設定詳解:nameserver、fallback 與 DNS 劫持的關係

解析 Clash DNS 模組中 nameserver、fallback、enhanced-mode 各自的作用與設定值,說明 DNS 劫持情境下的正確設定方式。

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.5119.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: truegeoip-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 區段欄位速查

欄位作用常見設定值
enableDNS 模組總開關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 埠」這兩個特徵,對策也圍繞這兩點展開。

下面四條同時成立,防劫持才算閉環:

  1. nameserver 與 fallback 全部使用 DoH、DoT,查詢內容加密,中間設備讀不到也改不了封包。
  2. enhanced-mode 使用 fake-ip,本地不再為走代理的網域發起真實解析,攻擊面進一步收縮。
  3. 系統 DNS 指向 Clash 的 listen 位址,或開啟 TUN 模式接管全部流量,所有查詢收口進入 Clash 內部。
  4. 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。

下載Clash