本文目錄
確認是不是這次 IPv6 DNS 劫持
本文處理的是一個條件明確的 OpenClash 故障:啟用 IPv6、路由器本機代理、本機 DNS 劫持和 Fake-IP 後,路由器上的 SmartDNS 等解析器存取公用網路 IPv6 DNS,卻收到 198.18.x 位址;隨後使用網域作為伺服器位址的代理節點無法連線。
一般終端打不開網頁、LAN 裝置拿不到 IPv6、訂閱下載失敗或 DNS 連接埠被 AdGuard Home 佔用,並不能直接證明是同一問題。先確認故障發生在路由器本機發往公用網路 IPv6 DNS 的查詢,不要一看到 IPv6 就關閉整個網路功能。
只有同時滿足這些條件才繼續
- OpenClash 版本低於已收錄修復的 v0.47.156,或升級後尚未重啟服務
- 系統使用 fw4/nftables 或 legacy ip6tables,並開啟路由器本機代理
- 本機 DNS 劫持和 Fake-IP 已啟用,路由器本機還有 SmartDNS 等解析器
- 該解析器設定了公用網路 IPv6 DNS 上游,節點伺服器位址使用網域
動設定前儲存可還原版本
先在 OpenClash 裡備份外掛程式設定和目前設定,再儲存目前可安裝的 IPK 或 APK。記錄外掛程式版本、核心版本、執行模式、IPv6、路由器本機代理、本機 DNS 劫持和 SmartDNS 上游;這樣即使升級或調整後網路更差,也能回到原狀態。
測試期間不要同時改訂閱、規則、DNS 上游和執行模式。一次只動一項,並保留修改前後的查詢結果;否則節點恢復後也無法判斷是哪一步起作用。
準備還原材料
匯出外掛程式設定
在設定檔管理中備份設定和目前設定,下載到路由器之外的裝置儲存。
保留原安裝套件
儲存目前版本對應的官方 IPK 或 APK,並記下系統使用 opkg 還是 apk。
記錄觸發開關
抄下 IPv6、路由器本機代理、本機 DNS 劫持、Fake-IP 與 SmartDNS IPv6 上游狀態。
準備直連入口
確認能透過 LAN 管理路由器;遠端維護時不要在沒有備用連線的情況下修改 DNS 和防火牆。
用指定伺服器查詢和規則計數定位
在路由器終端直接指定一個目前可達的公用網路 IPv6 DNS 查詢實際網域。正常結果應是網域的公開 A 或 AAAA 記錄;如果回傳 198.18.0.0/16,並且執行前後對應的 IPv6 OUTPUT DNS Hijack 規則計數增加,查詢就被錯誤送回了本機 Clash DNS。
OpenClash issue #5251 的復現使用 2400:3200::1。這個位址是否適合你的網路仍要先確認;若 IPv6 路由本身不可達,超時只能說明上游不可用,不能證明發生了劫持。查詢網域也可換成你明確知道有公開記錄的普通網域。
nslookup www.nic.ad.jp 2400:3200::1按結果決定下一步
| 查詢結果 | 規則計數 | 結論 |
|---|---|---|
| 回傳 198.18.x | IPv6 OUTPUT 計數增加 | 符合已確認的路由本機 IPv6 DNS 劫持 |
| 回傳實際 A 或 AAAA | 計數不增加 | 該路徑正常,轉查訂閱中的節點解析 DNS |
| 查詢超時 | 計數不增加 | 先檢查 IPv6 路由和所選 DNS 是否可達 |
| LAN 裝置異常但路由器查詢正常 | 無對應變化 | 轉查 RA、DHCPv6、RDNSS 或瀏覽器安全 DNS |
只有 SmartDNS 查詢異常,Mihomo 上游正常
核對處理程式身分與路徑;Mihomo 通常以被排除的 GID 執行,而其他本機解析器可能命中 OUTPUT 規則。
所有 DNS 都回傳 connection refused
檢查本機監聽連接埠和上游設定,不要套用本文的 IPv6 規則修復。
指定 IPv4 DNS 正常,指定 IPv6 DNS 回傳 198.18.x
保留這組對照和計數變化,進入版本升級。
- SmartDNS 等本機解析器向公用網路 IPv6 位址傳送 53 連接埠查詢
- OpenClash OUTPUT 規則舊版用 ::/0 誤匹配所有 IPv6 DNS 目的位址
- 本機 Clash DNS被重新導向的查詢在 Fake-IP 模式下回傳 198.18.x
- 代理節點網域錯誤結果使使用網域的節點無法完成撥號
修復把路由本機的 IPv6 DNS 劫持範圍從所有位址收窄到回環位址 ::1;LAN 裝置的 DNS 接管規則沒有被這次修改移除。
為什麼公用網路 IPv6 DNS 會被當成本機查詢
舊規則原本只應接管路由器本機發往回環位址的 DNS,卻把 IPv6 目的範圍寫成 ::/0。這個範圍包含全部 IPv6 位址,所以 SmartDNS 存取公用網路 IPv6 DNS 的 TCP 或 UDP 53 連接埠時,也會被重新導向到本機 DNS。
問題不是 PR #5209 新增了 ::/0。該提交分開識別 IPv4 與 IPv6 規則後,讓原本被提前跳過的舊分支穩定執行,才使缺陷從 v0.47.117 起更容易暴露。PR #5252 把 nftables 兩處和 legacy ip6tables 四處都改為 ::1,並保留 LAN 側 DNS 接管。
升級到包含修復的 v0.47.156
OpenClash v0.47.156 是目前能由官方發布記錄確認包含 #5252 的穩定版。先使用官方 Release 的系統對應安裝套件,按 opkg 或 apk 的實際套件管理員升級;不要把開發分支檔案、IPK 和 APK 混用,也不要在升級時順手更換核心和設定。
安裝完成後必須重啟 OpenClash。舊的 ::/0 規則可能仍留在執行態,只有重新產生防火牆規則後,原始碼中的 ::1 才會真正生效。啟動失敗時立即恢復已儲存的原安裝套件和設定,不要繼續疊加修改。
一次可還原的升級
核對系統套件格式
opkg 系統選擇官方 IPK,apk 系統選擇官方 APK,並確認下載來源是 v0.47.156 Release。
暫停額外改動
保留原核心、訂閱、執行模式和 DNS 設定,只升級 OpenClash 外掛程式。
安裝並重啟服務
完成安裝後重啟 OpenClash,等待防火牆與 DNS 規則重新產生。
先查日誌再聯網
確認設定測試、核心啟動和 DNS 監聽成功;失敗時恢復原包與備份。
重啟後做三組驗證
用升級前同一台路由器、同一個網域和同一個公用網路 IPv6 DNS 再查一次。修復生效後應回傳實際 A 或 AAAA,公用網路查詢不再增加 IPv6 OUTPUT DNS Hijack 計數;向本機回環 ::1 發出的查詢仍可被 OpenClash 接管。
DNS 對照透過後再測試原來使用網域的節點,觀察解析、撥號和實際網頁請求。只看延遲數字不夠;至少確認一個節點連線記錄和一個實際頁面都恢復。
修復驗收清單
- OpenClash 顯示 v0.47.156,服務已在安裝後重新啟動
- 指定公用網路 IPv6 DNS 回傳實際 A 或 AAAA,不再回傳 198.18.x
- 公用網路 IPv6 DNS 查詢不再增加路由本機 IPv6 劫持規則計數
- 查詢 ::1 時本機 DNS 接管仍正常,LAN 裝置解析沒有被破壞
- 原節點完成網域解析、撥號和一次實際存取
暫時不能升級時怎麼規避和還原
暫時無法升級時,可先從 SmartDNS 移除公用網路 IPv6 DNS 上游,改用已經驗證可達的 IPv4 上游;也可以臨時關閉路由器本機代理或本機 DNS 劫持中的一個觸發項。每種方式都會改變路由器自身流量或 DNS 接管,必須逐項測試,不能當成長期修復。
如果升級後異常擴大,關閉系統代理和 TUN 依賴,恢復原外掛程式包與設定備份,重啟 OpenClash,再用升級前的 IPv4/IPv6 查詢對照確認回到原狀態。
公用網路 IPv6 DNS 已回傳實際結果但節點仍失敗時,轉查 proxy-server-nameserver、訂閱內容、TLS 和節點伺服器,不再繼續改 OUTPUT 規則。
臨時方案的影響
| 操作 | 適合情況 | 必須復查 |
|---|---|---|
| SmartDNS 改用可達的 IPv4 上游 | 無法立即升級但需要恢復節點解析 | 本機網域、快取和節點網域都能正常解析 |
| 暫時關閉路由器本機代理 | 只有路由器自身 DNS 受影響 | 路由器更新、訂閱與外掛程式下載的出站路徑 |
| 暫時關閉本機 DNS 劫持 | 可接受終端按 DHCP 傳送 DNS | LAN 裝置是否繞過預期分流和 DNS 策略 |
| 恢復原包與設定 | 升級後服務無法啟動或 LAN 斷網 | 版本、DNS 監聽、防火牆規則和實際存取 |
