mihomo 旁路由設定教學:OpenWrt 透明代理與部署重點

不必安裝圖形介面用戶端,直接在路由器或旁路由執行 mihomo,讓全屋裝置共用分流設定。本文整理架構選擇、TProxy 與 redir 差異,以及閘道設定。

一、先確認旁路由負責哪些流量

mihomo 是代理核心,不會自動完成 OpenWrt 的所有網路設定。訂閱提供節點與規則,核心負責選擇出口;裝置流量能否進入核心,仍取決於預設閘道、路由表、防火牆與 DNS 流程。只把 YAML 放到路由器上執行,不代表區域網路裝置已接上透明代理。

本文以明確的 IPv4 網路為例:主路由器為 192.168.10.1/24,負責寬頻連線與 DHCP;旁路由為 192.168.10.2/24,預設閘道指向主路由器;測試電腦為 192.168.10.100/24。這些位址僅供說明,實際部署前請替換成目前網路使用的位址,並確認沒有與 DHCP 位址池衝突。

連線方式流量入口適用情境
手動代理應用程式手動連線至旁路由的 7890 連接埠先驗證節點、訂閱與規則
單網卡旁路由將終端裝置的預設閘道改為 192.168.10.2逐步讓少數裝置接入
雙網卡下游路由器終端裝置位於獨立的下游網段需要明確劃分轉送邊界
由主路由器依策略導流主路由器依來源位址或策略轉送需要集中管理接入裝置

二、部署 OpenWrt 前的檢查項目

確認系統架構與防火牆後端

透過 SSH 記下系統版本、CPU 架構與可用儲存空間。OpenWrt 22.03 起預設使用 firewall4 與 nftables,但升級、客製韌體或第三方外掛可能改變實際環境。請勿將舊版 iptables 規則直接貼到 nftables 環境,也不要同時執行兩套會接管相同流量的透明代理外掛。

ubus call system board
uname -m
df -h /overlay
free -m
command -v fw4
command -v nft
ip route show
ip -6 route show

uname -m 的輸出只能協助辨識架構,仍須依裝置的 CPU 特性選擇 mihomo 版本。有些舊裝置不支援較新的指令集。若啟動後立即結束或出現非法指令錯誤,應先確認執行檔版本是否符合架構,而不是一再修改訂閱內容。

分開管理核心、設定檔與服務

建議分開管理執行檔、工作目錄與服務指令碼。例如將核心放在 /usr/bin/mihomo,設定檔放在 /etc/mihomo/config.yaml,並交由 OpenWrt 的 procd 服務管理執行狀態。以下路徑是部署慣例,不代表系統已預先安裝相關檔案。

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

第二個指令用來檢查設定檔能否載入,並非完整的網路連線測試。使用規則集、GeoIP 或 GeoSite 資料的設定,還需要相應的資源;請確認外部資源能否下載、目錄是否可寫入,以及首次啟動是否依賴尚未建立的代理連線。服務指令碼應設定啟動順序、異常重啟與記錄檔輸出,避免 SSH 工作階段結束後,程序也跟著退出。

三、先用手動代理驗證訂閱與規則

建議依序部署:「核心啟動 → 手動代理可用 → DNS 可用 → 透明代理接管」。如此可區分節點無法使用與路由設定錯誤。以下片段僅供基本連線測試,沒有代理節點,最後一條規則會讓所有流量直連;它不能取代訂閱,也無法用來判斷代理出口是否可用。

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

rules:
  - MATCH,DIRECT

將片段合併到實際設定時,每個頂層欄位只能保留一份。啟用區域網路監聽後,請在 OpenWrt 防火牆中只允許可信任的 LAN 存取 7890,不要對 WAN 開放,也不要設定公網連接埠轉送。監聽位址必須是旁路由實際持有的位址。

  1. 先在測試電腦將 HTTP 代理設為 192.168.10.2:7890,確認要求能送達核心。
  2. 接著載入有效的 Clash 格式訂閱,確認代理群組中有可用節點,並選取目標節點。
  3. 查看連線記錄中的命中規則與出口。規則模式的結果取決於規則順序,與代理群組名稱是否包含「自動」無關。
  4. 關閉電腦上的手動代理,再測試透明代理,避免兩種連線方式同時啟用而造成誤判。

在已安裝 curl 的測試電腦上,可執行 curl -I --proxy http://192.168.10.2:7890 https://example.com。此指令用來驗證 HTTP 代理的要求流程;若要確認流量是否經過節點,還需查看命中規則、出口記錄,以及可信任的出口查詢結果。

四、TProxy、redir 與 TUN 的適用範圍

方式主要功能必要的系統設定
redir-port接收重新導向後的 TCP 連線NAT 重新導向、位址排除與迴圈排除
tproxy-port接收透明代理的 TCP、UDP 流量TPROXY 規則、標記與策略路由
tun透過虛擬網路介面接收 IP 流量TUN 支援、路由接管與防火牆轉送

redir 主要處理 TCP

設定 redir-port: 7892 只會建立監聽連接埠,還需要透過防火牆將符合條件的 TCP 流量重新導向該連接埠。UDP 無法透過此入口以相同方式進行透明接管。若網頁可正常開啟,但遊戲、語音或 QUIC 異常,請先檢查 UDP 的實際流向,而不是直接調高逾時時間。

TProxy 需要搭配標記與策略路由

tproxy-port: 7893 可作為 TCP 與 UDP 的透明代理入口,但必須備妥對應的核心模組、防火牆規則與路由表。系統會透過 fwmark 與 ip rule,將標記過的封包送往本機接收路徑。標記值與路由表編號必須避開現有的 VPN、多 WAN 與其他外掛,不能假設某個固定數字在所有裝置上都未被使用。

TUN 不只是開啟一個選項

mihomo 的 TUN 可搭配 auto-route 等欄位建立路由,但仍須確認 OpenWrt 的轉送策略、介面辨識與 IPv6 路由。較新版本的 mihomo 也在 Linux 上提供 auto-redirect 相關功能,實際行為請以已安裝核心版本的文件為準。不要同時啟用不同教學中的自動重新導向功能與手動設定的 TProxy 規則。

五、閘道、回程與防火牆轉送

使用單網卡旁路由時,測試電腦的預設閘道應指向 192.168.10.2,旁路由本身的預設路由則仍應指向 192.168.10.1。請勿讓主路由器與旁路由的預設路由互相指向對方。若 DHCP 仍由主路由器提供,可先手動修改電腦;確認可用後,再透過 DHCP 選項 3 派發閘道、選項 6 派發 DNS。

部分單網卡方案會使用受控的來源位址轉換,讓直連流量的回程重新經過旁路由。代價是上游看到的來源位址可能都變成旁路由位址,影響裝置用量統計與策略設定。請勿將「啟用所有區域的位址偽裝」視為通用解法;雙網卡、獨立下游網段與不同防火牆策略都需要分別規劃。

六、DNS:先釐清 53 與 1053 連接埠的用途

OpenWrt 通常由 dnsmasq 監聽 53 連接埠,提供 DHCP 與區域網路網域名稱解析。若讓 mihomo 同時監聽相同位址的 53 連接埠,就會產生衝突。較容易排查的架構是:終端向旁路由的 53 連接埠查詢,由 dnsmasq 轉送至 mihomo 本機的 1053 連接埠,再由 mihomo 查詢上游。

dns:
  enable: true
  listen: 127.0.0.1:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://1.1.1.1/dns-query

這只是 DNS 設定範例。上游位址必須能從目前網路連線,且連線路徑須符合實際代理策略。在 LuCI「網路」→「DHCP/DNS」→「一般設定」的 DNS 轉送欄位中,可依目前版本支援的語法設定 127.0.0.1#1053;也要確認 resolv 檔案的來源,避免 dnsmasq 又將要求送回自身。

fake-ip 回傳的是用於連線映射的位址,並非目標網站的真實位址。只有當終端接著連線至該位址的流量也能由 mihomo 接收時,映射才有作用。若 DNS 已經經過旁路由,但閘道仍指向主路由器,就可能出現「網域解析成功,但所有網頁都逾時」的情況。

建議先完成 IPv4 測試,再另外規劃 IPv6 的 RA、DNS 公告、預設路由與代理路徑。若要接管雙協定流量,應同時測試 AAAA 查詢與實際 IPv6 連線,不能只查看 IPv4 出口。

七、分層驗收與故障排查

每次只調整一個環節,並記錄調整前後的結果。依照以下順序檢查,可分辨「流量未到旁路由」、「已進入核心但規則不正確」與「節點本身故障」。

  1. 基本網路:確認測試電腦可連線至主路由器與旁路由的管理位址;旁路由的預設路由正確,系統時間也準確。
  2. 手動代理:透過 7890 連接埠存取測試網站,檢查連線記錄、代理群組選擇與出口錯誤。
  3. DNS:執行 nslookup example.com 192.168.10.2,確認查詢進入預定的解析流程;若已啟用 fake-ip,也要確認映射結果。
  4. 透明接管:關閉應用程式代理後建立新連線,確認 mihomo 仍可看到連線,且命中預期規則。
  5. UDP 與 IPv6:分別測試需要 UDP 的應用程式與 IPv6 目標。TCP 測試成功,無法證明另外兩種流量路徑也正常。
  6. 重新啟動後的狀態:重新啟動旁路由,檢查服務是否啟動、DNS 是否可用、防火牆規則是否恢復,以及節點網域是否能解析。
現象優先檢查項目
手動代理正常,但透明代理沒有連線記錄終端閘道、轉送路徑、規則計數與 TUN 路由
網域可解析,但連線一直逾時fake-ip 流量是否進入核心、代理迴圈、節點是否可連線
網頁正常,但部分即時應用程式無法使用UDP 入口、節點的 UDP 支援、MTU 與防火牆
修改規則後,舊連線仍使用原本的出口關閉測試連線並重新建立,避免沿用現有工作階段
重新啟動後,整個網路都無法解析網域dnsmasq 上游、mihomo 啟動順序與資源下載依賴

需要封包擷取時,可在已安裝 tcpdump 的裝置上執行 tcpdump -ni br-lan host 192.168.10.100,觀察測試電腦的流量;其中 br-lan 必須替換為實際的 LAN 介面。記錄檔若含訂閱網址、節點憑證或瀏覽網域,分享前請先移除敏感資訊。

八、設定維護與復原

訂閱更新、核心升級與防火牆修改應分開進行。請將裝置專用的 DNS、監聽位址、入口連接埠與路由策略保留在本機管理層,避免遠端訂閱更新覆蓋旁路由設定。若使用覆寫或設定合併功能,請檢查最後產生的 YAML,而不只是原始訂閱。

旁路由部署的關鍵,是讓流量入口、DNS 解析與對外連線三條路徑保持一致。先在單一裝置完成手動代理測試,再選擇一種透明接管方案,最後擴大 DHCP 派發範圍。若想了解規則模式、匯入訂閱與用戶端操作,請參閱Clash 使用教學;欄位說明請參閱完整文件。