部署方式:背景服務或桌面用戶端
mihomo 是從 Clash Meta 演進而來的代理核心,負責讀取設定、建立代理連線並套用分流規則。核心本身沒有桌面視窗,也不會因為啟動程序就自動讓所有 Linux 應用程式走代理。應用程式必須使用本機代理連接埠,或由設定完成的 TUN 接管流量。
伺服器、無圖形介面的裝置,以及需要開機後持續執行的主機,適合採用二進位檔搭配 systemd。日常桌面使用、經常切換節點或更新訂閱,則可選擇 Clash Verge Rev、FlClashs 等圖形介面用戶端。兩種方式可以分開測試,但請勿讓兩個核心同時監聽相同連接埠。
| 項目 | 二進位檔搭配 systemd | 桌面用戶端 |
|---|---|---|
| 適用環境 | 伺服器、遠端終端機、長時間在背景執行 | 有圖形介面的 Linux 桌面 |
| 設定管理 | 自行維護 YAML 檔案與更新流程 | 透過設定檔清單匯入、更新與切換 |
| 啟動方式 | 系統服務,可不依賴使用者登入而執行 | 啟動應用程式,或設定桌面登入時自動啟動 |
| 權限範圍 | 一般代理連接埠可由專用低權限使用者執行 | TUN 通常需要用戶端服務或授權提升權限 |
準備二進位檔:架構、權限與工作目錄
確認系統架構與初始化系統
uname -m
ps -p 1 -o comm=
systemctl --version
x86_64 通常對應 amd64 版本,aarch64 則對應 arm64。ARM 32 位元版本還需確認建置需求,不能只看裝置品牌就選檔案。第二個指令應顯示 systemd;容器、WSL 環境或其他初始化系統可能需要不同的啟動方式。
請從可信任的專案發布管道取得符合系統架構的 mihomo 二進位檔,解壓縮後將檔案命名為 mihomo,並放在目前目錄。壓縮檔本身無法直接執行。若出現 Exec format error,請先確認架構是否正確、檔案是否已解壓縮,而不是一再新增執行權限。
chmod +x ./mihomo
./mihomo -v
sudo install -m 0755 ./mihomo /usr/local/bin/mihomo
-v 可用來確認實際核心版本。之後排查設定欄位是否受支援時,請以這項輸出為準,不要以桌面用戶端版本代替核心版本。
分開存放程式、設定與執行資料
此處固定使用三個位置:程式放在 /usr/local/bin/mihomo,設定放在 /etc/mihomo/config.yaml,執行資料放在 /var/lib/mihomo。核心下載規則集、資料庫或儲存快取時,需要可寫入的資料目錄;設定檔則可維持唯讀。
sudo useradd --system --home-dir /var/lib/mihomo --shell /usr/sbin/nologin mihomo
sudo install -d -m 0750 -o root -g mihomo /etc/mihomo
sudo install -d -m 0750 -o mihomo -g mihomo /var/lib/mihomo
若專用使用者已存在,請略過 useradd,執行 id mihomo 確認即可。有些發行版的 nologin 路徑不同,可先用 command -v nologin 查詢。請勿為了處理目錄權限,就把整個設定目錄改成所有人都能寫入。
設定檔:先確認本機連接埠,再匯入訂閱
以最精簡的設定確認執行環境
先在目前目錄建立 config.yaml,內容如下。這份設定只含直連規則,用來確認程式、連接埠與權限是否正常;其中沒有代理節點,也不能取代服務商提供的完整設定。
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
ipv6: false
rules:
- MATCH,DIRECT
mixed-port: 7890 會在同一個 TCP 連接埠接受 HTTP 代理與 SOCKS5 請求。allow-lan: false 搭配回送位址限制,適合僅供本機使用的部署方式。本例未設定 external-controller,因此不會開放控制介面。
sudo install -m 0640 -o root -g mihomo ./config.yaml /etc/mihomo/config.yaml
sudo -u mihomo /usr/local/bin/mihomo -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
sudo -u mihomo /usr/local/bin/mihomo -d /var/lib/mihomo -f /etc/mihomo/config.yaml
-t 用來檢查設定能否載入;-d 明確指定執行資料目錄;-f 明確指定設定檔路徑。以前景模式執行並留意錯誤訊息,再開啟另一個終端機檢查連接埠:
ss -lntp 'sport = :7890'
curl -I --connect-timeout 10 --max-time 20 --proxy http://127.0.0.1:7890 https://example.com/
本例的請求經過本機 mihomo 後會直接連線至目標。收到 HTTP 回應只能證明這條連線路徑可用,不能證明流量已透過遠端代理。確認完畢後,請在執行核心的終端機按下 Ctrl+C 停止前景程序,避免之後由 systemd 啟動時發生連接埠衝突。
換成可用的訂閱設定
- 請取得服務商明確提供給 Clash 或 mihomo 使用的 YAML 設定。節點分享連結、網頁上的訂閱說明,以及其他用戶端的設定格式,都不能直接當作 YAML 使用。
- 保留一份可用的本機副本,再將新檔案安裝至
/etc/mihomo/config.yaml;權限維持0640,擁有者設為root:mihomo。 - 確認監聽連接埠、
proxy-groups、rules,以及規則所引用的策略名稱彼此一致。 - 再次執行
-t,確認通過後再啟動服務;若使用遠端規則集或資料庫,也要確認網路連線正常,且資料目錄具有寫入權限。
systemd 常駐服務:開機啟動、日誌與設定更新
建立 /etc/systemd/system/mihomo.service,並寫入以下內容。此服務僅提供一般本機代理,不包含 TUN 所需的權限設定。
[Unit]
Description=mihomo local proxy service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=mihomo
Group=mihomo
WorkingDirectory=/var/lib/mihomo
ExecStart=/usr/local/bin/mihomo -d /var/lib/mihomo -f /etc/mihomo/config.yaml
Restart=on-failure
RestartSec=5
UMask=0027
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/mihomo
[Install]
WantedBy=multi-user.target
Restart=on-failure 會在程序異常結束後嘗試重新啟動,但無法修復無效設定。ProtectSystem=strict 會限制檔案系統寫入,只對資料目錄開放寫入權限;若設定引用其他路徑,必須確認該使用者可以讀取,且下載檔案的目的地位於允許寫入的位置。
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl status mihomo --no-pager
sudo journalctl -u mihomo -b -n 80 --no-pager
enable --now 會同時設定開機啟動並立即執行。network-online.target 是啟動順序的限制;是否真的等待網路就緒,取決於系統對應的 wait-online 服務,不能據此認定網際網路一定可用。訂閱、規則集與節點連線仍須分別確認。
修改設定後的操作順序
sudo cp -p /etc/mihomo/config.yaml /etc/mihomo/config.yaml.bak
sudoedit /etc/mihomo/config.yaml
sudo -u mihomo /usr/local/bin/mihomo -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
sudo systemctl restart mihomo
sudo journalctl -u mihomo -n 40 --no-pager
設定檢查成功後才重新啟動服務。修改 service 檔案後,必須先執行 daemon-reload;只修改 YAML 則不需要。這裡透過重新啟動套用設定,並未定義 ExecReload,因此不要假設執行 systemctl reload mihomo 就會生效。重新啟動會中斷現有代理連線,請預先安排下載工作與遠端連線。
Linux 代理環境變數:終端機、Git 與 APT
核心開始監聽後,終端機程式仍須知道代理位址。以下變數只會影響目前的 shell,以及之後從該 shell 啟動的子程序,不會修改已執行的瀏覽器、其他終端機或系統服務。
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5h://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,::1
curl -I --connect-timeout 10 --max-time 20 https://example.com/
https_proxy 的值仍可設為 http://,代表透過 HTTP 代理的 CONNECT 通道存取 HTTPS 目標,並非將目標連線改為明文。socks5h 表示由 SOCKS 代理端解析目標網域名稱;本機核心後續如何解析,則取決於其 DNS 設定。
- 不同程式支援的變數可能不同。基於安全考量,curl 不接受大寫的
HTTP_PROXY,請優先使用上方的小寫格式。 - 若希望每次開啟互動式終端機時都套用,可依使用的 shell 將變數寫入
~/.bashrc或~/.zshrc;服務停止後,也要記得停用這些變數。 sudo通常會清除代理環境變數。systemd 服務也不會自動讀取使用者的 shell 啟動檔,必須另外設定環境。- 容器中的
127.0.0.1指向容器本身,而非主機。請勿為了讓容器連線,就貿然開放整個區域網路使用代理。
為個別指令指定代理
git -c http.proxy=http://127.0.0.1:7890 ls-remote https://github.com/MetaCubeX/mihomo.git HEAD
sudo apt \
-o Acquire::http::Proxy="http://127.0.0.1:7890" \
-o Acquire::https::Proxy="http://127.0.0.1:7890" \
update
這些設定只會套用至本次執行的指令,適合用於測試,不會永久變更 Git 或 APT 的設定。若要清除目前 shell 的代理變數,可執行:
unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
若某個應用程式不讀取代理環境變數,也沒有內建代理設定,一般的 mixed-port 就無法自動接管其流量。這種情況才需要考慮 TUN,而不是重複匯出變數。
桌面用戶端設定:匯入設定、系統代理與 TUN
使用圖形桌面時,可從下載中心選擇 Linux 用戶端。Debian、Ubuntu 通常選擇 DEB 套件;Fedora 等採用 RPM 的發行版則選擇 RPM 套件,並確認處理器架構相符。以下指令使用的檔案,是已下載並重新命名的本機安裝套件:
# Debian / Ubuntu
sudo apt install ./client.deb
# Fedora
sudo dnf install ./client.rpm
用戶端介面與選單名稱會隨版本變動,操作時可依序尋找「匯入設定、選擇代理、接管網路」等功能區。請勿混淆應用程式版本與核心版本。
- 匯入設定:在設定或訂閱頁面新增訂閱 URL,也可以匯入本機 YAML 檔。確認下載完成並選取該設定;清單中出現項目,不代表它已啟用。
- 選擇策略:前往代理群組頁面,依規則引用的策略群組選擇可用節點。使用規則模式時,並非所有請求都會經過所選節點;符合 DIRECT 的請求仍會直接連線。
- 查看連接埠:在設定中的網路或連接埠區確認混合連接埠。桌面用戶端可能使用
7897等其他連接埠,不能直接沿用本文的7890。 - 啟用系統代理:這項功能主要設定桌面環境提供的代理入口,能涵蓋哪些應用程式取決於它們是否遵循系統設定。確認瀏覽器正常後,也要另外測試終端機程式。
- 視需要啟用 TUN:請使用用戶端提供的服務安裝與授權流程,接著檢查虛擬網卡、路由與 DNS;不要一開始就讓用戶端永久以 root 身分執行。
TUN 不是「加速」按鈕。它會透過虛擬網路裝置接管符合條件的流量,涉及 /dev/net/tun、網路管理權限與路由設定。啟用後若遠端 SSH、區域網路存取或容器網路異常,請先關閉 TUN 恢復連線,再檢查路由排除設定與 DNS。本文中低權限 service 的限制,必須依實際 TUN 部署方式重新評估;只新增 tun.enable: true 並不能確保正常運作。
啟動失敗或代理無效:分層檢查
| 狀況 | 檢查項目 | 處理方式 |
|---|---|---|
| 執行時出現架構錯誤 | uname -m、file /usr/local/bin/mihomo | 改用符合架構且已解壓縮的二進位檔 |
| 服務不斷重新啟動 | journalctl -u mihomo 與 mihomo -t | 修正 YAML、引用名稱或檔案權限 |
| 連接埠已被占用 | sudo ss -lntp 'sport = :7890' | 停止重複執行的核心,或統一調整連接埠與應用程式設定 |
| 規則集下載失敗 | 下載日誌、目標位址、資料目錄權限 | 確認問題屬於網路連線失敗、路徑無法寫入,還是內容格式錯誤 |
| 瀏覽器正常,終端機無法使用 | 環境變數與個別程式的代理設定 | 讓終端機明確使用正確的本機代理連接埠 |
| 請求仍直接連線 | 目前模式、符合的規則與策略群組 | 確認不是 MATCH,DIRECT,或群組內選中了 DIRECT |
建議依照「程序、監聽連接埠、應用程式連線、規則策略、遠端節點」的順序排查。先以明確指定代理的 curl --proxy 排除應用程式設定問題,再從日誌查看規則與策略結果。節點逾時與本機連線遭拒屬於不同層次,不應一概歸為「Linux 代理無法使用」。
完成部署後,至少保留核心版本、有效設定副本、service 檔案與復原指令。升級二進位檔前,先停止服務並保留舊程式,再替換檔案並測試設定。若需要進一步了解規則與 DNS,可參閱術語表;若持續出現錯誤,可依照疑難排解的步驟繼續排查。