連線疑難排解 · Clash 技術部落格

FlClash Android 網域解析失敗:系統 DNS 為空怎麼辦?

Android 網路暫時未回報 DNS 伺服器時,舊版 FlClash 可能無法解析網域。先比較關閉 VPN 後的直連結果與 DNS 記錄,再核對 v0.8.99 修復、驗證效果並保留復原方式。

  • FlClash
  • Android
  • 系統 DNS
  • 網域解析
  • v0.8.99
本文目錄

手機顯示 VPN 已連線,卻無法透過網域名稱存取網頁時,需要先確認一般網路是否可用。系統暫時未提供解析伺服器、訂閱設定錯誤和節點斷線的處理方式並不相同;使用同一網路與目標保存 VPN 開啟前後的結果,才能分辨版本修復與其他原因。

VPN 還連著,為什麼 Android 上的網域卻無法解析?

在 Android 上記錄 VPN 連線後網頁與節點網域解析失敗的情況,用同一網域對照直連與 FlClash 中的請求,再核對日誌。手機網路、系統 DNS 傳遞、設定中的上游或節點連線都可能造成失敗,符合空列表條件後才繼續。

FlClash v0.8.99 修復了 Android 網路暫時未回報 DNS 伺服器時的一種解析失敗。舊版日誌中的空 [DNS] updateDns 或 udp://: 可作為線索,但仍須配合直連結果判斷,不能認定所有 Android 斷網都由它造成。

這項修復針對 Android 網路暫時沒有報告 DNS 伺服器、FlClash 因這條路徑無法解析網域的情況。Windows、macOS、Linux 的一般 DNS 故障,或 Android 上設定錯誤、節點失效、私人 DNS 故障,不應直接套用這個版本修復。

關閉 VPN 的直連對照與空 DNS 線索

如果直連正常,重新啟用原本的 Profile 與節點,再觀察是否只有經過 FlClash 的網域查詢失敗。舊版記錄中空白的 [DNS] updateDns,或解析目標指向 udp://:,可對照官方提交的描述;但缺少這類記錄,也不能反過來排除此路徑。

Android 的 LinkProperties.getDnsServers() 會回傳目前網路連線所回報的 DNS 伺服器清單。清單暫時為空是本文要檢查的輸入條件,並不表示使用者主動清空了 dns.nameserver。

設定中手動填入的 nameserver、nameserver-policy 屬於代理設定,Android 私人 DNS 則是系統設定。只改這些選項,不一定能驗證系統向用戶端回報空 DNS 的問題。

保留可重現問題的最小對照

  1. 記錄設定和故障發生時的狀態

    記錄 FlClash 完整版本、Android 版本、網路類型、目前 Profile 與節點、首次失敗時間,以及問題發生在連線、換網還是網路恢復後。保留日誌和實際網域存取結果,不在記錄前同時換節點、改 DNS 和清快取。

  2. 關閉 VPN,測試直連

    在同一個 Wi-Fi 或行動網路上造訪真實的 HTTPS 網站,確認手機網路和系統解析是否正常。

  3. 使用原設定再次測試

    開啟 FlClash 後,固定使用同一個 Profile、節點與目標,查看記錄中的第一筆 DNS 錯誤和實際連線結果。

  4. 確認是否符合空 DNS 故障條件

    只有直連正常、FlClash 中的網域查詢失敗,且版本與空 DNS 線索吻合時,才依 v0.8.99 的修復路徑繼續處理。

觀察結果與下一步

觀察到的結果下一步
關閉 FlClash VPN 後,同一網路仍無法解析網域直連仍無法解析時,恢復手機網路、路由器或營運商 DNS;不要把升級 FlClash 當作唯一答案。
直連正常,舊版 FlClash 的 DNS 記錄出現空白的 updateDns 或 udp://:符合這次修復的線索;先備份,再核對官方 v0.8.99。
只有某個節點或單一網域失敗,其他請求正常檢查節點位址、DNS 上游、規則與目標服務,不要據此推斷整個系統 DNS 清單為空。
Android 私人 DNS 顯示無法連線,或另一個 VPN 正在接管先核對系統的私人 DNS 與 VPN 狀態,保留設定記錄後再逐一變更條件比對。
空 DNS 清單為什麼會阻止正常的備援處理
修復前,Android 服務傳給 Go 核心的空清單會變成空字串;程式再用 strings.Split 分割,產生一個空位址。Mihomo 會將其視為 udp://: 名稱伺服器,讓系統解析器誤以為已設定伺服器,因而無法使用預設的備援路徑。v0.8.99 改為傳入真正的空清單。

從官方 APK 更新 v0.8.99,並保留原設定

先使用 FlClash 的本機備份功能儲存目前設定,確認找得到備份檔案,並記下訂閱來源與選用的 Profile。訂閱權杖、節點密碼和個人位址可能一併存入備份;不要把原始檔案上傳至公開 issue 或線上轉換網站。

專案 README 列有 arm64-v8a、armeabi-v7a 和 x86_64 安裝包。不要依別人的手機型號猜測架構,也不要從未經核實的鏡像站取得安裝包。

更新前先停止 FlClash VPN,確認一般網路連線正常。升級時保留應用程式資料及事前備份,不清空資料庫、不刪除所有 Profile,也不要為這項修復任意替換訂閱 DNS 或填入陌生的公共伺服器。

v0.8.99 的程式碼變更是讓空的系統 DNS 清單維持為空,再由解析器依正常流程使用備援機制;它不會強制替每台裝置指定某個 DNS 位址。如果真正的問題是上游伺服器無法連線或設定錯誤,升級無法取代相應的檢查。

只變更用戶端版本來驗證

  1. 記錄升級前的設定與結果

    儲存本機備份和失敗記錄,記下同一個網路、Profile、節點與目標網站,避免把設定變更誤認為版本修復的效果。

  2. 核對來源與架構

    開啟 chen08209/FlClash 專案的 v0.8.99 正式 Release,依裝置 ABI 選擇 Android APK,透過裝置正常的應用程式更新流程安裝。

  3. 重新開啟 FlClash VPN

    確認 Profile 與設定仍在,重新啟用 FlClash VPN,繼續使用升級前相同的節點和網站。

  4. 比對 DNS 與實際請求

    檢查網域查詢記錄、連線記錄及完整的 HTTPS 網頁載入結果,不要只憑 VPN 圖示或節點延遲數字判斷。

穩定聯網與換網後的 DNS 檢查

確認應用程式顯示 v0.8.99,且目前的 Profile、節點與網路類型和升級前的記錄一致。先在一般穩定網路下造訪同一個真實的 HTTPS 網站,並從 FlClash 的 DNS 查詢、請求或記錄頁面核對該網域的解析及出站結果。

之後在日常使用中,Wi-Fi 與行動網路自然切換或斷線重連時,再檢查同一個目標。官方提交處理的是網路回報空 DNS 伺服器的瞬間;正常網路一直有 DNS 伺服器時,單次成功只能證明目前連線可用,不能單獨證明上述空清單故障已修復。

如果更新後記錄不再出現這次的無效伺服器線索,網域與實際 HTTPS 請求也都恢復,可記為本機複測通過。如果網域已能解析,卻只有網頁仍打不開,應檢查規則、節點、連線記錄或目標服務,不要繼續將所有逾時歸因於空的系統 DNS。

驗證清單

  • 用戶端來自專案正式的 v0.8.99 Release,Android APK 架構符合裝置
  • 升級前的備份仍在,原有 Profile、節點與覆寫設定都能核對
  • 同一網路和同一目標下,關閉 VPN 直連與開啟 VPN 後的結果都有記錄
  • FlClash 能解析網域,真實的 HTTPS 網頁完整載入,連線記錄顯示預期的出站路徑
  • 日常切換網路或重新連線後,再檢查 DNS 與請求;記錄中沒有這次空位址導致的失敗

v0.8.99 仍無法解析時,如何復原並提交證據?

先在 FlClash 中停止 VPN,確認 Android 已回到一般網路,且可以解析真實網域並完成 HTTPS 請求。如果一般網路也失敗,暫時不要反覆重裝用戶端;請依目前的 Wi-Fi、行動網路或私人 DNS 狀態修復系統連線。

如果檢查問題時修改過 Profile、覆寫設定或其他設定,只恢復這次變更的內容,並根據事前備份核對原值。不要刪除所有用戶端資料、覆蓋唯一一份備份,或強行將系統 DNS 指向陌生伺服器。回裝舊版本可能重現這次缺陷,只能在保留備份後暫時使用。

如果 v0.8.99 上仍出現空白的 [DNS] updateDns 或 udp://:,請向專案 issue 回報 Android 與 FlClash 版本、網路類型、關閉 VPN 的直連對照、同一個 Profile 的最小重現步驟,以及第一筆相關記錄。

也請記錄網路切換前後的結果。提交前遮蔽訂閱權杖、節點密碼、個人網域與裝置識別資訊;原始備份和完整記錄留在本機。

如果只有命中 nameserver-policy: system 的網域失敗,不要直接將其併入這次空清單故障。專案舊 issue #1393 曾記錄 v0.8.88 預發布版出現類似的 udp://: 記錄,但當時的設定觸發條件與版本不同;應單獨列出自己目前的證據。

參考資料