Clash DNS 設定完全解析:nameserver、fallback 與 DNS 劫持三段怎麼填

從 dns 段的 enable、listen 開始,逐欄說明 nameserver 與 fallback 的分工、fallback-filter 的過濾邏輯,以及 TUN 模式下 DNS 劫持為何必須搭配 Fake-IP 才能生效。

Clash 的 dns 段是設定裡最容易產生歧義的部分。同樣一份設定,有人開啟網頁秒開,有人卻一直轉圈;差別通常不在節點,而在 nameserverfallbackdns-hijack 三個欄位的搭配。本文依照 dns 段的書寫順序,逐個欄位說明它為什麼存在、什麼時候生效。

dns 段先設對:enable、listen 與 enhanced-mode

dns 段不是一組開關,而是 Clash 內建 DNS 伺服器的完整設定。它負責三件事:接收查詢、決定回傳什麼位址、把結果交給路由規則區使用。先看最小可用形態:

dns:
  enable: true
  listen: 127.0.0.1:53
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - '*.lan'
    - '*.local'
  default-nameserver:
    - 223.5.5.5
    - 1.1.1.1
  nameserver:
    - 223.5.5.5
    - 119.29.29.29

enable 決定內建 DNS 是否運作。關閉時,系統代理模式下所有網域都交給系統解析器,規則裡的 GEOIPIP-CIDR 判斷拿到的可能是被污染的位址,分流自然不準。開啟後,Clash 自己成為解析器,查詢結果同時供規則比對使用。

listen 決定監聽位址與連接埠。127.0.0.1:53 只服務本機,適合純系統代理情境;0.0.0.0:53 同時服務區網裝置與 TUN 劫持進來的查詢,TUN 模式建議用後者。若 53 連接埠被其他程式占用,可改成 127.0.0.1:5353,但系統 DNS 與代理設定要同步指過去。

enhanced-mode 二選一:fake-ip 回傳保留網段的假位址,redir-host 回傳真實位址。這個欄位對規則比對的影響最大,第四節單獨展開。先記住結論:TUN 模式選 fake-ip

欄位作用建議值
enable是否執行內建 DNStrue
listen監聽位址:連接埠系統代理用 127.0.0.1:53;TUN 用 0.0.0.0:53
ipv6是否回應 AAAA 查詢false,避免 IPv6 外洩與解析變慢
enhanced-mode回傳假位址或真實位址fake-ip
fake-ip-range假位址保留網段198.18.0.1/16
default-nameserver引導解析 DoH 伺服器網域223.5.5.5、1.1.1.1

nameserver 與 fallback 的分工:一條主路,一條備路

nameserver 是主要解析通道。每個網域進來,預設先交給它。fallback 是備用解析通道,只有當 nameserver 的結果被判定為不可信時,才會發起第二次解析,並以 fallback 的結果為準。

判定邏輯一句話:nameserver 回傳的 IP 屬於中國大陸,代表網域沒被污染,直接用;回傳境外位址,就懷疑是污染產物,交給 fallback 重查一次。所以兩個清單的選型有明確分工——nameserver 放中國大陸 DNS 求快,fallback 放境外可信 DNS 求準。

  nameserver:
    - 223.5.5.5
    - 119.29.29.29

  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  • nameserver 建議用一般 UDP 查詢的中國大陸 DNS,延遲個位數毫秒,對中國大陸 CDN 網域回傳就近節點。
  • fallback 建議用 DoH,結果可信且抗污染;1.1.1.18.8.8.8 都是 IP 直寫,不依賴額外解析。
  • 不要反過來:把 nameserver 填境外、fallback 填中國大陸。所有查詢都走慢速境外解析,真正需要糾錯時 fallback 給的還是中國大陸結果,機制失去意義。
  • fallback 清單裡也不要混入中國大陸 DNS,否則污染網域拿到的依然是錯誤 IP。

fallback 不是負載平衡,也不是並行查詢取最快答案。它只在 nameserver 結果可疑時觸發一次,平時不產生額外流量。

fallback-filter 的過濾邏輯:geoip、ipcidr 與 domain

fallback-filter 決定什麼時候觸發 fallback。它只看 nameserver 的解析結果,由三個條件組成:

  fallback-filter:
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4
      - 10.0.0.0/8
      - 172.16.0.0/12
      - 192.168.0.0/16
      - 127.0.0.0/8
    domain:
      - '+.google.com'
      - '+.youtube.com'

geoipgeoip-code 是主開關。geoip: true 表示對 nameserver 回傳的 IP 做地理位置判斷,geoip-code: CN 表示「中國大陸 IP 視為可信」。命中這個條件,直接用 nameserver 的結果。

ipcidr 追加可信 IP 網段。內網網域解析出來的私有位址沒有國家歸屬,會被 geoip 誤判成境外結果而反覆觸發 fallback,所以把 10.0.0.0/8172.16.0.0/12192.168.0.0/16127.0.0.0/8 列進來。240.0.0.0/4 是原版 Clash 文件範例裡的保留網段,保留無妨。

domain 是例外清單。寫在這裡的網域不經過濾,直接走 fallback。語法上 +.google.com 表示主網域加所有子網域,*.google.com 只表示子網域。常用境外網域放進來,可以省掉一次 geoip 判斷。

完整判定順序如下:

  1. 網域命中 domain 清單 → 直接使用 fallback 結果。
  2. nameserver 回傳的 IP 命中 geoip-code(CN)→ 使用 nameserver 結果。
  3. 回傳的 IP 命中 ipcidr → 使用 nameserver 結果。
  4. 以上都不滿足(IP 為境外)→ 用 fallback 重新解析,以 fallback 結果為準。

這套判定的代價是境外網域每次解析都可能多一次 fallback 查詢,DoH 的 TLS 握手會拉高首封包延遲。對延遲敏感的情境,可以用 nameserver-policy 為個別網域直接指定解析器,繞開整套判定:

  nameserver-policy:
    '+.baidu.com': 223.5.5.5
    '+.taobao.com': 223.5.5.5
    '+.google.com': https://8.8.8.8/dns-query

TUN 模式下的 DNS 劫持:為什麼必須搭配 Fake-IP

TUN 模式把全部 IP 流量收進虛擬網卡,看似 DNS 查詢也會被接管。但系統解析器可能把查詢發給任意 DNS 伺服器——路由器位址、電信業者 DNS、應用程式自帶的 DoH——這些流量雖然進了 TUN,卻未必經過內建 DNS。

dns-hijack 就是補這個缺口:在虛擬網卡上攔截所有發往 53 連接埠的 UDP 與 TCP 流量,強制重新導向到內建 DNS。

tun:
  enable: true
  stack: system
  dns-hijack:
    - any:53

劫持解決「DNS 查詢進核心」的問題,接下來還要解決「網域資訊能不能帶到連線階段」的問題,這就是 enhanced-mode 的事。

fake-ip 模式下,內建 DNS 對查詢回傳 198.18.0.0/16 保留網段的假位址,同時在核心記錄網域與假位址的對應。應用程式拿著假位址發起連線,流量進 TUN 後,核心按對應還原出原始網域,再交給規則區比對。DOMAIN-SUFFIXDOMAIN-KEYWORD 這類規則因此繼續有效。

redir-host 模式下,內建 DNS 回傳真實位址。應用程式直接連線真實 IP,流量進 TUN 時只剩 IP 封包,規則區沒有網域可比對,只能靠 GEOIPIP-CIDR 兜底。CDN 網域與需要精確分流的場景,規則會大面積失效。這個模式在系統代理下沒問題——網域由 HTTP CONNECT 請求攜帶——問題只出在 TUN 模式。

結論:劫持保證查詢進核心,fake-ip 保證網域不丟。兩者缺一,就會出現「規則全走直連」或「規則全走代理」的兩極現象,而且日誌裡很難看出原因。

只開 dns-hijackenhanced-mode 保持 redir-host,是 TUN 模式下最隱蔽的設定錯誤:網頁能開,但所有網域規則都不命中。

fake-ip 還有一個配套欄位 fake-ip-filter:需要真實位址的網域要排除在外。區網裝置、.lan.local 後綴、本地服務的網域寫進這裡,否則拿到假位址後無法存取。

一套可直接上線的完整設定

把前面的欄位合成一份可用的設定,取值邏輯如下:nameserver 用中國大陸一般 DNS 保證速度;fallback 用境外 DoH 保證污染網域能糾正;fake-ip 讓網域規則在 TUN 模式下繼續生效;dns-hijackany:53 覆蓋所有 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
    - 1.1.1.1
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  fallback-filter:
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4
      - 10.0.0.0/8
      - 172.16.0.0/12
      - 192.168.0.0/16
      - 127.0.0.0/8
    domain:
      - '+.google.com'
      - '+.youtube.com'
      - '+.github.com'

tun:
  enable: true
  stack: system
  dns-hijack:
    - any:53

上線後逐條核對這六個位置,是排查 DNS 問題的標準動作:

  • default-nameserver 不能省。它負責解析 DoH 伺服器自身的網域,缺失時 doh.pub 這類網域形式的 DoH 無法建立連線;IP 直寫的 1.1.1.1 不受影響,但保留總是穩妥。
  • dns-hijackany:53,不要寫 8.8.8.8:53。後者只劫持發往該位址的查詢,系統 DNS 一變就失效。
  • fake-ip-filter 務必排除內網網域,否則區網裝置存取異常。
  • TUN 模式不要用 redir-host。網域規則失效是「能上網但分流全錯」最常見的根源。
  • 53 連接埠被占用時,listen127.0.0.1:5353,系統 DNS 同步改,不要只改一半。
  • 改完設定先看除錯日誌裡的 dns 輸出,再用 dignslookup 查詢內建 DNS,確認回傳的是假位址還是真實位址。

DNS 設定沒有萬能模板,只有一套自洽邏輯:nameserver 負責快,fallback 負責準,fallback-filter 決定何時切換,fake-ip 負責把網域資訊送到規則區。照著這個順序核對,大多數解析異常都能定位到具體欄位。

下載 Clash Verge