平台部署 預計閱讀時間 12 分鐘

OpenWrt 旁路由部署 mihomo 教學:架構與設定指南

了解主路由與旁路由的分工,以及 mihomo 核心、設定檔、透明代理和閘道設定,快速找到適合自己的 OpenWrt 部署方式。

先選好做法:從手動代理測試,再接手閘道

在 OpenWrt 上直接執行 mihomo,指的是由系統啟動核心程序、讀取 YAML 設定檔,再依需求整合路由與防火牆。mihomo 就是一般所稱的 Clash Meta 核心;它不是 LuCI 外掛,也不會只因為複製到路由器,就自動接管全家的網路流量。圖形介面、訂閱更新、透明代理規則和開機啟動,都需要分別設定。

新手建議分三個階段進行:先確認核心能通過設定檔檢查,再讓一台電腦使用旁路由的手動代理,最後才調整這台電腦的預設閘道與 DNS。每個階段都有明確的檢查項目,遇到問題也能迅速回復到前一步。

方式用戶端如何連線需要設定的項目
手動代理手動輸入旁路由 IP 和 7890 連接埠核心、設定檔、區域網路存取權限
TUN 接管將用戶端閘道設為旁路由TUN 裝置、路由、DNS、防火牆與 IPv6
防火牆透明代理將用戶端閘道設為旁路由REDIRECT 或 TPROXY、策略路由、排除回送流量

如果只想讓瀏覽器使用代理,第一種方式就足夠。若要讓電視、遊戲裝置或不支援手動代理的應用程式統一連線,才需要研究後兩種方式。已安裝 OpenWrt 管理外掛的裝置,應先確認外掛是否已啟動 mihomo,避免兩個管理介面同時控制連接埠和路由。

主路由與旁路由:先釐清流量方向

本文以一個 IPv4 區域網路範例說明兩者分工。主路由負責撥接、網際網路出口和 DHCP;旁路由使用固定 IP,先讓指定的測試裝置經過它。以下 IP 僅供示範,實際設定前請先確認現有網段及 IP 是否已被使用。

  • 主路由:192.168.10.1/24,連接網際網路。
  • OpenWrt 旁路由:192.168.10.2/24,上游閘道為 192.168.10.1。
  • 測試電腦:192.168.10.100/24,初始時仍以主路由作為閘道。
  • DHCP 位址池範例:192.168.10.100–192.168.10.200,旁路由 IP 不應納入動態位址池。

固定旁路由 IP,DHCP 先維持單一來源

在標準 LuCI 介面中,依序前往「網路」→「介面」→「LAN」→「編輯」,確認靜態 IPv4 位址和上游閘道;不同主題的選項名稱可能略有差異。在旁路由 LAN 介面的「DHCP 伺服器」設定中,通常應勾選「忽略此介面」,避免主路由和旁路由同時派發 IP。變更管理 IP 前,請保留有線連線並記下新位址。

單網卡、同網段的旁路由,收發流量可能都經過同一個 LAN 介面。這與 LAN、WAN 分開的雙網卡路由器不同,回程路徑也可能不對稱。是否需要來源位址轉換、如何處理 ICMP 重新導向,必須依現有防火牆和透明代理方案判斷;不要直接貼上其他裝置的幾條防火牆指令。

旁路由的上游閘道應固定指向主路由,絕不可指向自己。正式切換前,先保持主路由的 DHCP 設定不變,只調整一台測試裝置。

核心與目錄:先確認架構、權限和設定檔路徑

先透過 SSH 檢查硬體和韌體。使用 uname -m 查看核心架構、ubus call system board 查看裝置型號與系統資訊,再用 df -h 檢查儲存空間。選擇 mihomo 發行檔時,也要確認 CPU 指令集需求;即使裝置同為 x86_64,也不代表能執行所有需要較新指令集的版本。

uname -m
ubus call system board
df -h
free -m
ls -l /dev/net/tun

若沒有 /dev/net/tun,仍可先測試手動代理;啟用 TUN 前再處理所需的核心模組。OpenWrt 核心模組必須符合韌體的核心版本,不要強行安裝其他版本的模組。套件管理工具可能是 opkg 或 apk,請以目前使用的韌體為準。

建議固定以下三個路徑

  • /usr/bin/mihomo:解壓縮後的核心執行檔,不是壓縮檔。
  • /etc/mihomo/config.yaml:實際使用的設定檔。
  • /etc/mihomo/:工作目錄,存放設定檔引用的規則、資料庫和執行資料。

將符合架構的核心上傳至指定路徑後,設定執行權限並查看版本。設定檔可能包含訂閱網址、節點密碼或權杖,請限制檔案讀取權限,勿直接貼到公開討論區。

mkdir -p /etc/mihomo
chmod 755 /usr/bin/mihomo
/usr/bin/mihomo -v
chmod 600 /etc/mihomo/config.yaml
/usr/bin/mihomo -t -d /etc/mihomo -f /etc/mihomo/config.yaml

最後一行用來檢查設定檔。若出現欄位錯誤,請依據日誌修正 YAML 縮排或不相容的參數;若提示缺少規則檔或地理資料庫,請檢查對應路徑及下載連線。設定檢查通過,只代表設定檔可以載入,不表示節點連線、DNS 和透明代理都已正常運作。

先開啟 7890:測試手動代理與訂閱內容

以下提供一份用來測試監聽和直連出口的最簡設定。這份設定沒有代理節點,所有連線都會以 DIRECT 處理,因此無法用來確認訂閱節點是否可用。先用它排除部署問題,再換成已確認支援 mihomo 的完整訂閱設定。

mixed-port: 7890
allow-lan: true
bind-address: "192.168.10.2"
mode: rule
log-level: info
ipv6: false

rules:
  - MATCH,DIRECT

mixed-port 會在同一個連接埠接受 HTTP 和 SOCKS5 代理連線;allow-lan 則允許其他裝置存取。監聽位址必須是旁路由實際持有的 IP。請確認防火牆只對可信任的區域網路開放 TCP 7890,也不要在主路由上設定對外連接埠轉送。

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

以前景模式執行,方便查看錯誤訊息。保持 SSH 工作階段開啟,並在測試電腦執行下列請求;若沒有 curl,可在系統或瀏覽器的代理設定中,輸入 HTTP 代理位址 192.168.10.2 和連接埠 7890。

curl -I --proxy http://192.168.10.2:7890 https://example.com

若看到目標網站的 HTTP 回應標頭,表示電腦已能連上旁路由代理,核心也能對外建立連線。接著匯入實際使用的設定檔,確認代理群組引用的名稱和規則目標一致,再檢查目標連線實際套用的策略。只下載到內含訂閱連結的文字檔,不代表已取得可直接執行的 YAML 設定檔。

管理 API 和代理連接埠是不同的入口。這個階段不需要開放 external-controller。日後若要連接管理面板,請設定 secret,並限制管理連接埠的存取範圍。

透明代理:一併檢查閘道、TUN 和 DNS

手動代理測試成功後,先取消測試電腦的手動代理,再將預設閘道改為 192.168.10.2。這只會讓封包經過旁路由;若沒有 TUN 路由或防火牆轉送規則,流量不會自動進入 mihomo。不能只憑「已經修改閘道」就判定透明代理成功。

TUN 方式的適用範圍

mihomo 的 tun.enable 用來啟用虛擬網路裝置,auto-route 用來自動設定相關路由,auto-detect-interface 則用來自動偵測出口介面。這些設定不能取代 OpenWrt 的所有防火牆設定。尤其在 LAN 同一介面收發流量的旁路由環境中,還要確認轉送許可、核心的流量路徑、排除目標及回程路徑。

另一種方式是搭配防火牆使用 redir-port 或 tproxy-port。REDIRECT 常用於 TCP 重新導向;TPROXY 可處理 TCP 和 UDP,但必須搭配策略路由。新款 OpenWrt 常見 firewall4 和 nftables,舊教學則可能使用 firewall3 和 iptables,兩套規則不能不加區分地混用。兩種方式也不應同時攔截同一批連線。

DNS 監聽設定須與 DHCP 派發內容一致

常見做法是保留 dnsmasq,讓它在 LAN 的 53 連接埠提供 DNS 服務;mihomo DNS 則監聽本機的 127.0.0.1:1053,再將 dnsmasq 的上游轉送至這個位址。1053 是內部轉送用連接埠,不是要讓手機直接填入的 DNS 位址;一般終端裝置的 DNS 設定通常不支援指定自訂連接埠。

  • 若終端裝置的 DNS 指向旁路由,請確認旁路由的 53 連接埠確實能回應查詢。
  • dnsmasq 將查詢轉給 mihomo 後,mihomo 的上游 DNS 不可再指回同一條 dnsmasq 解析路徑,否則會形成解析迴圈。
  • 啟用 fake-ip 時,DNS 回應與後續連線必須經過同一套流量接管路徑,避免取得虛擬 IP 後,連線卻沒有進入核心。
  • 瀏覽器的安全 DNS、應用程式內建的 DoH 和寫死的 DNS 位址,都可能繞過系統的解析設定,請分別檢查。

IPv6 也必須另外處理。主路由透過 RA 派發的 IPv6 預設路由,不會因為手動修改 IPv4 閘道而消失。設定檔中的 ipv6: false 無法停用整個區域網路的 IPv6。測試階段可暫時在測試裝置停用 IPv6,縮小問題範圍;正式部署時則須明確規劃 IPv6 的路由、DNS 和流量接管方式。

設定開機啟動:用 procd 管理程序,不靠背景指令

完成前景測試後,按 Ctrl+C 停止測試程序,再設定系統服務。OpenWrt 使用 procd 管理服務;只在 SSH 中加上 & 背景執行,無法取代開機啟動和程序監控。以下最簡服務只負責啟動核心,不會建立防火牆規則,也不會定時更新訂閱。

將以下內容存成 /etc/init.d/mihomo。若裝置已有同名服務,或核心由外掛管理,請先確認管理權限歸屬,勿直接覆寫。

#!/bin/sh /etc/rc.common

START=99
STOP=10
USE_PROCD=1

start_service() {
    procd_open_instance
    procd_set_param command /usr/bin/mihomo \
        -d /etc/mihomo \
        -f /etc/mihomo/config.yaml
    procd_set_param respawn
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_set_param file /etc/mihomo/config.yaml
    procd_close_instance
}
chmod 755 /etc/init.d/mihomo
/etc/init.d/mihomo enable
/etc/init.d/mihomo start
logread -e mihomo

更新訂閱前,請保留上一份可正常使用的設定檔。先將新內容存成暫存檔,執行 mihomo -t 檢查,再取代正式設定檔並重新啟動服務。即使設定語法正確,節點仍可能無法使用,因此仍須保留回復方案;不要讓自動更新工作反覆覆蓋人工修正過的版本。更新規則集、下載資料庫和快取也會占用快閃儲存空間,請定期檢查剩餘容量。

部署驗收與回復:先測試一台裝置,再擴大範圍

部署完成後,請依照以下順序檢查,不要只看管理面板上的連線狀態。每項確認正常後再進行下一項,才能把「網路斷線」的問題範圍縮小到特定環節。

  1. 本機網路出口:旁路由可連上主路由、解析網域名稱並建立 HTTPS 連線。
  2. 代理入口:測試電腦透過 192.168.10.2:7890 發出請求時,日誌中會出現對應連線。
  3. DNS 回應:執行 nslookup example.com 192.168.10.2,確認回應的 DNS 伺服器符合預期。
  4. 透明接管:取消手動代理後造訪目標網站,確認 mihomo 仍有連線紀錄,且符合預期規則。
  5. 排除區域網路流量:檢查主路由管理頁面、印表機、NAS 和本機服務,確認沒有被錯誤送往遠端代理。
  6. 重新啟動後恢復:重新啟動旁路由後再次測試,確認服務、DNS 和轉送路徑都已恢復,且不依賴先前手動執行的指令。

若整台裝置都無法連網,先將測試電腦的閘道和 DNS 還原為原本的主路由設定,並取消手動代理。接著停止 mihomo;若曾手動新增 nftables、策略路由或 DNS 轉送設定,也必須逐一撤銷。停止核心不代表外部流量接管規則會自動清除。

等單一裝置持續穩定後,再考慮透過 DHCP 派發旁路由閘道與 DNS。DHCP 閘道通常對應選項 3,DNS 則對應選項 6;設定後,終端裝置可能需要重新取得租約才會生效。旁路由成為全網裝置都必須經過的節點後,關機或升級都會影響其他裝置,因此請保留主路由的管理方式,並準備明確的復原步驟。

部署的重點不是一次填完所有參數,而是分別確認核心、手動代理、DNS 和流量轉送。想先了解規則與訂閱,可從訂閱匯入教學開始;核對設定欄位時,再參閱設定完整指南,避免同時修改多個層面的設定。

下載用戶端