Linux 安裝 Clash 核心:mihomo 命令列部署與 systemd 背景執行

涵蓋 Linux 桌面版圖形用戶端與無介面伺服器,說明 mihomo 安裝、設定目錄、systemd 服務及終端機代理設定。

先選部署方式:桌面用戶端或獨立核心

有桌面環境時,建議使用圖形用戶端管理訂閱、策略組與連線記錄;只有 SSH 終端機時,則使用 mihomo 命令列搭配 systemd。mihomo 是常稱為 Clash Meta 的核心專案,負責讀取設定、監聽代理連接埠及執行分流。圖形用戶端是在核心之外提供操作介面,兩者位於不同層級。

執行環境建議方式主要管理介面
Ubuntu、Fedora 等桌面環境支援 Linux 的圖形用戶端用戶端中的設定、代理、連線等頁面
Debian、Ubuntu 等伺服器mihomo 與 systemd 系統服務設定檔、systemctl、journalctl
OpenRC 或精簡容器環境依現有的程序管理方式執行不要直接套用本文的 systemd 單元

桌面版可前往用戶端下載頁選擇 Linux 安裝套件。Debian、Ubuntu 通常使用 DEB,Fedora 通常使用 RPM,並請確認處理器架構。匯入設定後,啟用用戶端提供的系統代理,再用瀏覽器測試。桌面系統代理不一定涵蓋終端機工具、遊戲或所有背景服務;終端機仍須依下文另行設定。

確認架構並安裝 mihomo 執行檔

先檢查系統架構與初始化程序。以下命令適用於常見 GNU/Linux 發行版;如果 PID 1 不是 systemd,後續的服務管理命令就不能直接使用。

uname -m
ps -p 1 -o comm=
getconf GNU_LIBC_VERSION
  • x86_64 對應 amd64。較舊的處理器建議選用專案發佈頁標示為相容的版本;不確定指令集時,請勿直接選擇最佳化程度更高的版本。
  • aarch64 通常對應 arm64。32 位元 ARM 還須確認 CPU 與系統位元數,不能只憑裝置外觀判斷。
  • Alpine 通常使用 musl,且預設不是 systemd 環境。請另選相容的版本與服務管理方式,不能直接套用 glibc 系統的安裝假設。

從 mihomo 專案的官方發佈管道取得適用於目前系統的壓縮檔,解壓縮後將執行檔放在目前目錄,並命名為 mihomo。以下命令從已解壓縮的檔案開始,不依賴會隨發佈版本變動的壓縮檔名稱。

file ./mihomo
chmod 0755 ./mihomo
./mihomo -v
sudo install -m 0755 ./mihomo /usr/local/bin/mihomo
/usr/local/bin/mihomo -v

file 用來確認檔案的處理器類型,-v 則用來確認核心能否在目前的機器上啟動。請記下實際輸出,方便排錯時對照設定欄位。如果出現 Exec format error,先檢查架構,或確認是否誤將壓縮檔當成程式執行;若出現 Illegal instruction,優先檢查版本所需的 CPU 指令集。

分開存放設定檔與執行資料

將設定檔放在 /etc/mihomo/config.yaml,可寫入的執行資料則放在 /var/lib/mihomo。請使用專用帳號執行服務;監聽 7890 這類高位連接埠不需要 root 權限。以下帳號建立命令適用於提供 useradd 的 Debian、Ubuntu、Fedora 等系統。

getent group mihomo >/dev/null || sudo groupadd --system mihomo
id mihomo >/dev/null 2>&1 || sudo useradd \
  --system --gid mihomo --home-dir /var/lib/mihomo \
  --shell /usr/sbin/nologin mihomo

sudo install -d -o root -g mihomo -m 0750 /etc/mihomo
sudo install -d -o mihomo -g mihomo -m 0750 /var/lib/mihomo

如果已存在名為 mihomo 的帳號,請先確認該帳號屬於對應群組。部分發行版的 nologin 路徑不同,可先執行 command -v nologin 檢查,再視需要調整。專用帳號僅供執行服務,不用於互動式登入。

先用最精簡的設定檢查啟動流程

以下是完整的本機代理入口設定,所有請求都會直連。這份設定用於確認檔案權限、連接埠監聽與服務啟動,不含代理節點,也不會改變對外網路出口。首次部署時可先用它排除安裝問題,再換成實際訂閱設定。

sudo tee /etc/mihomo/config.yaml >/dev/null <<'YAML'
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
ipv6: false

rules:
  - MATCH,DIRECT
YAML

sudo chown root:mihomo /etc/mihomo/config.yaml
sudo chmod 0640 /etc/mihomo/config.yaml
sudo -u mihomo /usr/local/bin/mihomo \
  -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml

-f 用來指定設定檔,-d 用來指定核心資料目錄;兩者可以不同。規則集、代理集合與地理資料若涉及本機檔案,請確認檔案路徑及專用帳號的存取權限。不要將檔案放在一般使用者的私人家目錄,再期待系統服務能自動讀取。

替換為實際訂閱設定

取得完整的 Clash YAML 後再替換檔案。只有節點清單的 Base64 文字或單一 URI 並非完整的執行設定,不能直接存成 config.yaml。完整設定還需要對應的策略組與規則;規則中引用的策略名稱必須確實存在。

  1. 保留一份可用的設定,避免修改失敗後無法復原。
  2. 將實際設定存到 /etc/mihomo/config.yaml,並維持 root:mihomo 擁有者與 0640 權限。
  3. 確認混合連接埠仍為 7890,並關閉區域網路存取;若變更連接埠,下文所有測試命令也都要一併修改。
  4. 再次執行上方的 -t 命令。若設定使用 GEOIP、GEOSITE 或遠端集合,請依設定準備所需資源,並確認首次取得資源時網路可用。

建立 systemd 服務並設定開機啟動

新增 /etc/systemd/system/mihomo.service。此服務以一般使用者身分執行,只提供明確設定的 HTTP/SOCKS 代理,不負責建立 TUN 網卡。單元中的絕對路徑與前述安裝位置一致。

sudo tee /etc/systemd/system/mihomo.service >/dev/null <<'UNIT'
[Unit]
Description=mihomo proxy core
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=mihomo
Group=mihomo
StateDirectory=mihomo
StateDirectoryMode=0750
WorkingDirectory=/var/lib/mihomo
ExecStart=/usr/local/bin/mihomo -d /var/lib/mihomo -f /etc/mihomo/config.yaml
Restart=on-failure
RestartSec=5s
UMask=0027
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict

[Install]
WantedBy=multi-user.target
UNIT

sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl is-active mihomo
sudo systemctl status mihomo --no-pager

StateDirectory 會為執行資料目錄提供可寫入空間;ProtectSystem=strict 則會限制寫入其他檔案系統位置。設定檔由 root 管理,核心僅以唯讀方式存取;遠端規則集等需要寫入的內容應放在資料目錄。network-online.target 只代表系統的網路就緒流程已完成,不保證任何訂閱伺服器都能連線。

分清楚修改設定檔與服務單元

  • 只修改 YAML:先執行設定測試,再執行 sudo systemctl restart mihomo。
  • 修改服務單元:先執行 sudo systemctl daemon-reload,再重新啟動服務。
  • 暫停執行:執行 sudo systemctl stop mihomo。
  • 取消開機啟動並立即停止:執行 sudo systemctl disable --now mihomo。

本文未定義 ExecReload,因此不要將 systemctl reload mihomo 當成通用重新載入方式。重新啟動會中斷現有連線,請避開長時間下載或遠端工作正在傳輸的時段。

設定終端機代理並確認請求結果

服務狀態顯示 active,只能表示程序仍在執行。請先確認 7890 正在監聽,再透過該入口送出實際請求。混合連接埠可接受 HTTP 代理與 SOCKS5 連線,以下分別測試。

sudo ss -lntp 'sport = :7890'

curl --noproxy "" --proxy http://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 20 -I https://example.com/

curl --noproxy "" --proxy socks5h://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 20 -I https://example.com/

socks5h 表示將目標網域交由代理伺服器解析;socks5 通常由用戶端先解析網域。使用 HTTP 代理存取 HTTPS 網站時,一般會透過 CONNECT 建立通道,因此代理位址寫成 http://127.0.0.1:7890 是正常用法,不代表目標網站使用未加密的 HTTP。

先套用於目前的終端機

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 --connect-timeout 10 --max-time 20 -I https://example.com/

這些變數只會影響目前的 shell,以及之後啟動且支援相應變數的程式。確認要長期使用後,Bash 可將設定寫入 ~/.bashrc,Zsh 則可寫入 ~/.zshrc,再重新開啟終端機。不同工具支援的變數大小寫可能不同,curl 的 HTTP 代理變數尤其建議使用小寫 http_proxy。

sudo 經常會清除環境變數,systemd 服務也不會自動讀取互動式 shell 的設定。因此,「終端機中的 curl 可用」不代表套件管理器和背景工作也已透過代理連線。替這些工具個別設定前,請先確認確有需要,避免為所有系統服務統一注入代理環境。

取消環境變數設定

unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

如果已將設定寫入 shell 設定檔,也請刪除對應的行。使用前述最小直連設定時,測試成功只能證明本機代理入口可用;換成實際設定後,還應從日誌確認命中的規則與出口策略,不能只憑 HTTP 回應判斷是否使用了代理節點。

依日誌、連接埠與權限排查問題

先保留錯誤發生時的資訊,再一次只修改一個變數。請勿同時變更 DNS、規則與權限,否則即使連線恢復,也難以確認原因。以下兩個命令分別用來查看近期日誌與即時日誌;按 Ctrl+C 可結束後者。

sudo journalctl -u mihomo -b -n 100 --no-pager
sudo journalctl -u mihomo -f
狀況或日誌優先檢查項目處理方式
status=203/EXEC程式路徑、執行權限與架構檢查 ExecStart,並重新執行 mihomo -v
address already in use確認 7890 是否被其他用戶端占用使用 ss 查詢程序,停止重複執行的核心或統一修改連接埠
permission denied設定目錄與執行目錄的權限以 mihomo 使用者執行設定測試,並檢查檔案路徑上的每一層父目錄
YAML 解析錯誤或策略不存在縮排、設定格式與策略名稱使用空格縮排,並確認 rules 與 proxy-groups 中引用的項目
服務正常執行,但請求逾時目標解析、策略出口與遠端資源先測試最小直連設定,再測試實際節點與規則
Start request repeated too quickly先前反覆啟動失敗的原因修正後執行 reset-failed,再啟動服務

需要檢查路徑權限時,可執行 namei -l /etc/mihomo/config.yaml。修正連續啟動失敗的問題後,執行 sudo systemctl reset-failed mihomo 和 sudo systemctl start mihomo。請勿透過放寬權限、讓所有使用者都能寫入的方式規避問題。

釐清 TUN 使用範圍並保留升級回復方式

若要接管不支援明確代理設定的程式,再評估使用 TUN。TUN 涉及虛擬網卡、路由、DNS 與權限,不是將 allow-lan 改為 true 就能啟用。本文的服務以一般使用者身分執行,並設定了 NoNewPrivileges=true,不能直接作為 TUN 服務使用。

Linux TUN 通常需要 /dev/net/tun、CAP_NET_ADMIN 等權限;自動路由、DNS 劫持及不同網路堆疊也可能需要額外設定。變更遠端主機的路由前,請保留第二個 SSH 工作階段與可從主控台復原的管道。容器環境還須確認主機允許存取裝置及使用網路能力,不能只在容器內修改 YAML。

依可回復的步驟升級核心

  1. 記錄目前 mihomo -v 的輸出,並保留設定檔備份。
  2. 先在暫存位置執行新版核心的 -v,再以服務使用者身分測試現有設定。
  3. 停止服務,備份舊程式後再替換,接著啟動服務。
  4. 檢查日誌與 7890 連接埠,並再次執行 HTTP、SOCKS5 請求測試。
sudo systemctl stop mihomo
sudo cp -p /usr/local/bin/mihomo /usr/local/bin/mihomo.previous
sudo install -m 0755 ./mihomo /usr/local/bin/mihomo
sudo systemctl start mihomo
sudo journalctl -u mihomo -b -n 50 --no-pager

此處的 ./mihomo 是已完成測試的新程式。需要回復時,先停止服務,將 /usr/local/bin/mihomo.previous 重新安裝為 /usr/local/bin/mihomo,再啟動服務。核心與設定語法可能同時變動,因此程式與設定檔的備份都應保留。

部署完成後,請確認三項結果:服務在重新啟動後會自動執行、7890 只監聽預期的位址,以及指定應用程式的請求命中預期策略。如此可區分「程式已安裝」、「代理入口可用」與「實際流量已依規則轉送」,也方便日後排查問題。

下載最新版 Clash