部署範圍:核心執行、流量接管與設備閘道

在 OpenWrt 上啟動 mihomo,只代表路由器中有代理核心程序。若要讓手機、電視和電腦的流量經過它,還得處理流量入口、路由與 DNS。設定檔能載入、控制面板能開啟,都不能單獨證明區域網路流量已被接管。

mihomo 沿用 Clash Meta 的設定架構,負責代理協定、規則比對與連線處理;OpenWrt 則負責介面、路由、防火牆和服務管理。LuCI 外掛可將這些操作整合在介面中,但外掛、核心與訂閱設定仍是需要分別更新的三個項目。

  • 手動設定代理:在設備或應用程式中填入代理伺服器位址與連接埠,適合先測試設定;不支援代理設定的應用程式不會自動經過核心。
  • 透明代理:由路由器透過防火牆與策略路由接管經過的流量,終端通常不必逐一設定 HTTP 代理。
  • TUN:核心透過虛擬網路介面處理 IP 流量,仍須搭配系統路由、防火牆轉送及排除回環流量等設定。

主路由與旁路由:先確認實際流量路徑

主路由部署

主路由直接負責連外,區域網路設備的預設閘道通常就是主路由。流量自然會經過這台設備,因此較容易統一接管;但核心重新啟動、規則重新載入或 DNS 設定錯誤,影響範圍也更大。保留直連出口與管理位址的例外,比一次接管所有連線更重要。

同網段旁路由部署

以下位址僅供說明網路拓樸,並非實際測試數據:主路由為 192.168.10.1,旁路由為 192.168.10.2,測試電腦為 192.168.10.100/24。旁路由的上游預設路由指向主路由,測試電腦的預設閘道則指向旁路由。

設備範例設定確認事項
主路由192.168.10.1負責上游出口;初期保留原有 DHCP 服務
旁路由192.168.10.2/24上游閘道為 192.168.10.1,並允許所需的轉送流量
測試電腦192.168.10.100/24預設閘道為 192.168.10.2,DNS 指向已設定的解析入口

旁路由與終端位於同一網段時,直連連線的回程流量可能由主路由直接送回終端,造成非對稱路徑。是否需要來源位址轉換、如何處理 ICMP 重新導向,應依連線追蹤與實際路由判斷;不能把「啟用 NAT」當成所有拓樸都適用的標準答案。採用雙網卡、獨立下游網段的旁路由則更接近一般路由器,流量路徑通常較清楚。

  • 只將終端的 DNS 改指向旁路由,不代表網路連線也會經過旁路由。
  • 透過 DHCP 下發閘道與 DNS 時,對應的 IPv4 選項通常是 3 和 6;修改後需讓用戶端重新取得租約。
  • 同一個廣播網域內,不要未經規劃就啟用第二台 DHCP 伺服器,否則不同設備可能取得不同的閘道。
  • IPv6 預設路由通常由路由通告提供;只修改 IPv4 閘道,不會自動改變 IPv6 流量路徑。

架構與系統檢查:選擇可執行的 mihomo 檔案

下載前先確認 OpenWrt 版本、CPU 架構與可用儲存空間。OpenWrt 23.05、24.10 的常見官方映像使用 firewall4 與 nftables;第三方韌體可能修改相關元件,因此應檢查實際環境,不要只憑韌體名稱選擇安裝指令碼。

ubus call system board
uname -m
opkg print-architecture
df -h /overlay /tmp
free -m
command -v fw4
command -v nft
test -c /dev/net/tun && echo "TUN device available"

上方的 opkg 指令適用於使用 opkg 的韌體;若系統採用其他套件管理工具,請依該韌體的說明查詢。uname -m 顯示的是執行環境架構,不能取代 CPU 指令集與發行檔說明的確認。

  • x86_64:屬於 amd64 架構;不同最佳化版本可能要求不同的 CPU 指令集,較舊的軟路由應確認發行檔標示。
  • aarch64:通常對應 arm64;若硬體支援 64 位元,但韌體執行於 32 位元環境,請以實際系統為準。
  • ARM、MIPS:還要確認 ARM 世代、浮點運算需求,以及 MIPS 的位元組順序,不能只看產品宣傳的晶片系列。
  • 儲存空間與記憶體:核心、規則集和地理資料庫都會佔用空間;/tmp 通常位於記憶體中,重新啟動後內容不會保留。

出現 Exec format error 時,先檢查架構;出現 Illegal instruction 時,確認指令集需求。檔案存在卻無法執行,也可能是載入器或權限問題,不應直接判定為訂閱失效。

部署方式:LuCI 外掛、獨立程序與容器

方式一:透過 LuCI 外掛統一管理

適合需要訂閱更新、開機啟動及透明代理規則整合的環境。請選擇明確支援目前 OpenWrt 防火牆架構與 mihomo 的外掛,並閱讀對應版本的文件。不同外掛的選單、覆寫機制和核心更新來源各不相同,不能直接套用其他外掛的設定步驟。

外掛執行時通常會產生最終設定檔。若手動編輯產生的檔案,下次更新訂閱或重新啟動服務時,修改可能會被覆蓋。請使用外掛提供的持久覆寫功能,並避免再啟動第二個獨立核心,以免搶用相同連接埠。

方式二:獨立二進位檔與 procd 服務

適合希望明確控制執行參數與防火牆規則的使用者。以下範例將核心放在 /usr/bin/mihomo,資料目錄設為 /etc/mihomo;這是本文使用的範例路徑,不代表所有外掛的預設路徑。先放入確認過的設定檔,再以前景模式執行並查看錯誤訊息。

/usr/bin/mihomo -v
/usr/bin/mihomo -t -d /etc/mihomo -f /etc/mihomo/config.yaml
/usr/bin/mihomo -d /etc/mihomo -f /etc/mihomo/config.yaml

-t 用於測試設定;即使測試通過,仍須確認 DNS、出口與轉送狀況。以前景模式確認執行穩定後,再建立位於 /etc/init.d/ 的 procd 服務,設定啟動指令、標準輸出、異常重新啟動與停止時的清理程序。不要反覆執行背景指令來取代服務管理,否則容易留下多個程序與舊規則。

方式三:在容器中執行

容器適合已有容器管理環境的軟路由,但會額外引入網路命名空間、資料卷與權限隔離。TUN 需要容器能存取對應裝置,並取得必要的網路管理權限;透明代理也必須釐清規則是在主機端還是容器內安裝。只映射 7890 連接埠,通常只能提供手動設定的代理,無法自動接管整個區域網路。

透明代理與 TUN:選擇一套流量接管規則

透明代理是要達成的流量接管方式,TUN 則是其中一種實作途徑。另一種常見作法是 REDIRECT 或 TPROXY:REDIRECT 常用於重新導向 TCP;TPROXY 可處理 TCP、UDP,但需要策略路由、封包標記及相應的核心模組。採用哪種方式,應依外掛支援、韌體元件與網路拓樸決定。

流量入口方案系統配合項目檢查重點
手動設定 HTTP / SOCKS 代理在應用程式中設定代理位址確認是否有應用程式繞過代理;另須確認是否支援 UDP
REDIRECT / TPROXY防火牆規則,並視需要設定策略路由TCP、UDP 接管範圍、mark 衝突與回環排除
TUNTUN 裝置、路由與轉送規則確認介面是否建立、流量是否進入介面,以及 DNS 是否被接管

使用 TUN 前,可在 LuCI 的「系統」→「軟體套件」中確認是否已安裝與目前核心相符的 kmod-tun,並檢查 /dev/net/tun。模組不能任意安裝到不同韌體核心版本上。裝置檔案存在只代表具備基本條件,不表示後續路由設定正確。

  • 確認路由由哪一方負責:若外掛會產生流量接管規則,就不要再照搬另一份會啟用自動路由的獨立設定。
  • 排除核心本身的代理出口連線、路由器管理位址、上游閘道及必要的區域網路網段,避免連線反覆進入核心。
  • 在 LuCI「網路」→「防火牆」中確認區域與轉送關係,不要用全域放行來掩蓋規則錯誤。
  • 排查時可暫時關閉軟體或硬體流量卸載,再重新測試;卸載功能可能改變後續封包的處理路徑。

DNS 接管:監聽連接埠、上游解析與 Fake-IP

OpenWrt 通常由 dnsmasq 提供區域網路 DNS。較容易理解的查詢流程是:終端向路由器的 53 連接埠發出請求,再由 dnsmasq 將需要交給核心的請求轉送至本機 127.0.0.1:1053。這樣可保留 dnsmasq 對本地主機名稱的處理,但須依實際設定避免核心的查詢又被轉回自身。

以下僅展示 mihomo 的 DNS 設定片段,並非可直接執行的完整路由器設定。範例使用一般上游解析服務,以說明連接埠的關係;正式部署時,還須依網路可達性、隱私需求及代理伺服器網域名稱的解析方式選擇上游。

dns:
  enable: true
  listen: 127.0.0.1:1053
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  1. 指定唯一的 53 連接埠入口。若 dnsmasq 已監聽區域網路的 53 連接埠,mihomo 就不應再繫結相同的位址與連接埠。
  2. 設定轉送。LuCI「網路」→「DHCP/DNS」中的 DNS 轉送可使用 127.0.0.1#1053 這種 dnsmasq 位址格式;也要確認是否仍使用上游下發的解析伺服器。
  3. 避免形成循環。mihomo 的上游解析伺服器不能再指回這個 dnsmasq 入口。代理伺服器網域名稱也必須有可用的初始解析路徑。
  4. 涵蓋實際的 DNS 查詢。傳統 DNS 使用 UDP 與 TCP 的 53 連接埠;應用程式內建的 DoH 使用 HTTPS,不會只因重新導向 53 連接埠就自動採用相同的解析流程。

Fake-IP 回傳的是對應位址,核心再透過位址對應網域名稱。若終端取得 198.18.0.0/16 範圍內的位址,卻將連線送往未接管該位址範圍的閘道,就會出現「DNS 查得到,但網頁打不開」的狀況。因此,Fake-IP、DNS 下發與流量入口應一起測試。

印表機、螢幕投放及依賴區域網路名稱探索的應用程式都需要額外測試;必要時可使用精確的 Fake-IP 過濾規則與本地域名解析規則。也應一併檢查 IPv6 的 DNS 下發、AAAA 回應與出口路徑;不能只因 IPv4 測試成功,就認定所有連線都已接管。更多欄位說明請參閱完整手冊的 DNS 章節與Fake-IP 術語說明。

驗證順序:從設定檔測試到區域網路實際連線

依固定順序逐步檢查,才能將問題限縮在單一層面,避免同時修改規則、DNS 與防火牆。以下連接埠皆為本文範例:混合代理為 7890,核心 DNS 為 1053;若需啟用控制介面,可限制在 127.0.0.1:9090。

  1. 核心層:執行設定檔測試並檢查執行記錄。獨立 procd 服務可搭配 logread 查看啟動錯誤;使用外掛時,優先查看外掛的記錄頁面。
  2. 監聽層:若已安裝 ss,請執行 ss -lntup;否則使用韌體提供的同等工具,確認 7890、1053 等連接埠的監聽位址與協定。
  3. 手動代理層:在允許區域網路存取,且防火牆已限制來源的前提下,讓測試電腦透過旁路由的 7890 連接埠要求載入網頁,先確認訂閱與出口可正常使用。
  4. DNS 層:從測試電腦向預期的 DNS 入口發出查詢,觀察核心記錄與回應結果,分辨解析逾時、映射正常或上游循環等狀況。
  5. 路由層:關閉測試電腦的手動代理,只保留測試閘道與 DNS,確認連線是否仍會進入核心。並在路由器上查看 ip route show、ip rule show 及相關路由表。
  6. 協定層:分別測試一般網頁、影片、UDP 應用程式與 IPv6 連線;TCP 成功不代表 UDP 或 IPv6 也採用相同路徑。

若要在終端執行手動代理測試,請先確認終端已安裝 curl,且旁路由確實依照上述範例開放區域網路代理入口。範例網址僅作為測試目標,不代表它一定會符合預期的代理規則。

curl --proxy http://192.168.10.2:7890 --connect-timeout 10 -I https://example.com/
nslookup example.com 192.168.10.2

不要只看公網 IP 是否改變:規則模式下,有些目標原本就會直連。應搭配連線記錄中的目標、命中規則、策略群組與最終出口判斷。軟路由沒有通用的「標準吞吐量」;加密協定、單核心效能、MTU、線路品質與記錄量都會影響結果,應在同一台設備、同一個目標間比較直連與代理。

長期維運:更新、權限與故障復原

  • 更新設定:更新訂閱後,先檢查語法與資源載入,再替換目前使用的設定。保留上一份可用設定,持久修改則放在外掛覆寫功能或自行維護的檔案中。
  • 更新核心:先確認新版核心支援目前使用的欄位、規則與啟動參數,更新後重新執行設定檔測試;更新訂閱並不會一併更新程式。
  • 管理介面:控制介面應優先繫結回環位址。若確實需要從區域網路存取,請設定存取憑證並限制來源;不應在 WAN 端開放代理或控制連接埠。
  • 儲存管理:避免長時間開啟大量偵錯記錄並寫入快閃記憶體;更新規則資源時也要考量下載失敗與剩餘空間,不要將唯一的設定檔放在暫存目錄。
  • 停止與清理:停止服務時,應撤除由該服務建立的接管規則、路由與 DNS 轉送,避免程序停止後仍將流量送往已失效的入口。

復原時,先將測試終端的閘道與 DNS 還原為原本設定,再撤除旁路由的流量接管;若部署在主路由,則應使用事先準備好的停止服務與還原規則流程。保留本機有線管理方式,比故障後依賴已中斷的遠端連線可靠。

若只需要讓一台電腦使用訂閱,可以先透過桌面用戶端完成設定測試,再考慮由路由器接管流量。路由器部署的重點不在複製核心檔案,而在於確保流量入口、網域名稱解析、代理出口與回程路徑彼此一致。