先選擇部署方式:伺服器使用核心,桌面環境視需求選用客戶端

在 Linux 上執行 Clash,不一定要安裝圖形介面。mihomo 是相容於 Clash 設定格式,並持續擴充協定與規則功能的核心,早期常見名稱為 Clash Meta。它負責讀取設定、監聽代理連接埠及處理連線;訂閱管理視窗、系統匣圖示與控制面板則通常由圖形化客戶端提供。

本文採用「獨立 mihomo 二進位檔 + 系統層級 systemd 服務」的方式,適用於透過 SSH 登入的伺服器、開發機,以及需要長時間執行代理的桌面版 Linux。設定檔放在 /etc/mihomo/config.yaml,執行資料放在 /var/lib/mihomo,本機 HTTP/SOCKS 混合連接埠使用 7890。

  • 無桌面環境的伺服器:建議優先採用本文的方式,透過命令與日誌管理,無須安裝桌面環境。
  • 日常使用的桌面電腦:若需要頻繁切換節點或編輯規則,可選用圖形化客戶端,交由客戶端管理自己的核心。
  • 已安裝客戶端:先確認是否已在監聽 7890;兩個核心不能同時繫結相同的位址與連接埠。

確認系統架構並安裝 mihomo 二進位檔

1. 檢查 systemd 與 CPU 架構

ps -p 1 -o comm=
uname -m
command -v curl
command -v gzip

第一個命令的輸出應為 systemd。如果執行環境是容器、精簡系統,或尚未啟用 systemd,後續的 systemctl 命令便無法直接使用,須改採該環境的程序管理方式。

架構輸出發行檔選擇注意事項
x86_64Linux amd64,優先選擇 v1 相容等級v1、v2、v3 是 CPU 指令集相容等級,不是客戶端版本號。
aarch64Linux arm64常見於 ARM 雲端伺服器與執行 64 位元系統的開發板。
armv7l選擇符合裝置架構的 Linux armv7 發行檔須依據硬體與發行說明確認,不能以 arm64 檔案替代。

Debian、Ubuntu 若缺少所需工具,可執行 sudo apt update && sudo apt install curl gzip ca-certificates;Fedora 可執行 sudo dnf install curl gzip ca-certificates。以下下載命令使用 Bash。

2. 下載與安裝

前往 mihomo 官方發行頁面,選擇穩定版中符合架構的 .gz 二進位檔,並複製該檔案的完整 HTTPS 下載連結。請勿將發行頁面網址或原始碼壓縮檔當成二進位檔連結。以下提示會讀取連結,避免將範例版本號寫死。

mkdir -p "$HOME/mihomo-install"
cd "$HOME/mihomo-install"

read -r -p '請貼上官方 Linux .gz 檔案的 HTTPS 連結:' download_url
curl --fail --location --proto '=https' \
  --output mihomo.gz "$download_url"
unset download_url

gzip -t mihomo.gz
gzip -dc mihomo.gz > mihomo
chmod 0755 mihomo
./mihomo -v

sudo install -m 0755 mihomo /usr/local/bin/mihomo
/usr/local/bin/mihomo -v

逐一執行命令,確認成功後再繼續。-v 的輸出可用來確認核心版本與架構。若出現 Exec format error,通常是架構選錯;若出現 Illegal instruction,請檢查 CPU 指令集需求。amd64 裝置可改選相容等級較低的檔案。

若伺服器無法連線至發行網站,可先在工作電腦下載檔案,命名為 mihomo.gz,再透過 SFTP 上傳到伺服器的安裝目錄,接著從 gzip -t 這一步繼續。請勿為了下載而暫時停用 TLS 憑證驗證。

建立專用執行帳號,先以最精簡設定確認監聽

核心執行一般的 7890 代理連接埠時,不需要使用 root 身分。建立專用系統帳號,並將設定檔與可寫入資料分開,可降低操作失誤造成的影響。以下以提供 useradd 的常見 Linux 發行版為例;若帳號已存在,請先用 id mihomo 確認,避免重複建立。

sudo useradd --system --user-group \
  --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

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 則指定核心的執行資料目錄。請依此目錄檢查相對路徑的資料檔、快取與 provider 檔案;不要假設核心一定會從目前的終端機目錄讀取設定。設定測試能找出許多語法與引用問題,但不能取代實際的節點連線測試。

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

服務檔一律使用絕對路徑,並指定固定的執行帳號。以下安全性選項適用於本機明確代理方案:允許核心寫入資料目錄,但不允許服務任意修改系統目錄。

sudo tee /etc/systemd/system/mihomo.service > /dev/null <<'UNIT'
[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
ExecStartPre=/usr/local/bin/mihomo -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
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
ReadWritePaths=/var/lib/mihomo

[Install]
WantedBy=multi-user.target
UNIT

sudo systemctl daemon-reload
sudo systemctl enable --now mihomo.service
systemctl status mihomo.service --no-pager
sudo journalctl -u mihomo.service -n 80 --no-pager
sudo ss -lntp 'sport = :7890'

正常情況下,服務狀態會顯示為 active (running),且 7890 會監聽在 127.0.0.1。enable 用於設定開機啟動,--now 則會立即啟動服務。network-online.target 實際等待效果取決於 Linux 發行版的網路管理器與 wait-online 服務,無法保證一定連得上外部網站。

  • 修改設定後:先執行前面的 mihomo -t,確認通過後再執行 sudo systemctl restart mihomo。
  • 修改服務檔後:先執行 sudo systemctl daemon-reload,再重新啟動服務。
  • 即時查看日誌:執行 sudo journalctl -u mihomo -f;按 Ctrl+C 只會結束日誌檢視,不會停止服務。
  • 停止服務並取消開機啟動:執行 sudo systemctl disable --now mihomo。

本文未設定 ExecReload,因此請勿將 systemctl reload mihomo 當成通用更新命令。重新啟動服務會短暫中斷經過該程序的既有連線,遠端作業請避開更新時段。

匯入訂閱:先分清完整設定與節點清單

「訂閱網址」不一定會傳回相同格式。完整的 Clash/mihomo 設定通常包含 proxies 或 proxy-providers、proxy-groups 與 rules。只有節點的 provider YAML、Base64 節點集合及單一分享連結,都不能直接當成本文使用的主要設定檔。

安全替換完整設定

如果服務提供的是完整 mihomo 設定,請先下載至暫存檔,再檢查並測試。以下作法適用於互動式 Bash,會隱藏訂閱網址的輸入,避免含有權杖的網址直接寫入命令歷史;離開時也會清除暫存檔。伺服器端存取日誌與本機高權限使用者仍可能看見相關資訊,請勿將訂閱網址當成公開連結。

(
  umask 077
  tmp=$(mktemp) || exit 1
  trap 'rm -f "$tmp"' EXIT

  read -r -s -p '請貼上完整設定訂閱的 HTTPS 網址:' sub_url
  printf '\n'
  curl --fail --location --proto '=https' \
    --output "$tmp" "$sub_url" || exit 1
  unset sub_url

  sudo install -o root -g mihomo -m 0640 \
    "$tmp" /etc/mihomo/config.next.yaml || exit 1
  sudoedit /etc/mihomo/config.next.yaml

  sudo -u mihomo /usr/local/bin/mihomo -t \
    -d /var/lib/mihomo \
    -f /etc/mihomo/config.next.yaml || exit 1

  sudo cp -p /etc/mihomo/config.yaml /etc/mihomo/config.previous.yaml || exit 1
  sudo mv /etc/mihomo/config.next.yaml /etc/mihomo/config.yaml || exit 1
  sudo systemctl restart mihomo
)

在編輯器中確認 mixed-port: 7890、allow-lan: false 與 bind-address: 127.0.0.1。檢查設定中的外部控制介面、DNS 監聽、TUN 開關與本機檔案路徑;本方案不需要對外開放控制介面或 DNS 監聽,也不會啟用 TUN。請先移除或停用這些非必要設定,再進行測試。

規則引用的策略群組名稱必須確實存在,群組中的節點也必須可用。若規則資料庫或 provider 檔案下載失敗,請查看日誌中的實際 URL 與錯誤訊息;不能只因 YAML 可解析,就認定訂閱已可正常使用。若設定要求從使用者家目錄讀取檔案,本文服務的 ProtectHome=true 會阻止存取,請將所需檔案移至資料目錄並調整路徑。

節點 provider 與自動更新的限制

proxy-providers 可透過自己的 url、path 與 interval 更新節點,例如 interval: 3600 代表每隔 3600 秒更新一次。更新範圍僅限對應的 provider,不會自動替換主設定中的所有規則與策略群組。provider 的相對儲存路徑應位於可寫入的資料目錄中。

若要定期更新完整主設定,請另外規劃下載、語法測試、備份、替換與失敗復原流程,再使用 systemd timer 排程。請勿用單一排程下載命令直接覆寫正在使用的 config.yaml。訂閱下載失敗時,保留上一份可用設定,通常比重新啟動並載入空檔更穩妥。

設定終端機代理環境變數,分別測試 HTTP 與 SOCKS

systemd 服務成功啟動,只代表核心正在執行,不會自動讓所有終端機程式都使用代理。請先透過明確參數測試,排除環境變數造成的影響。以下以公開網站示範連線測試,並非實際測試結果;實際耗時與出口位置會受到你的網路、規則和節點影響。

curl --noproxy "" --proxy http://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 30 \
  -I https://www.kernel.org/

curl --noproxy "" --proxy socks5h://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 30 \
  -I https://www.kernel.org/

socks5h 會讓 curl 將目標網域交由 SOCKS 代理解析;socks5 通常會先由應用程式解析。使用 HTTP 代理連線 HTTPS 網站時,通常會透過 CONNECT 建立通道,因此代理位址仍應寫成 http://127.0.0.1:7890,而非將代理入口改為 HTTPS。

僅在目前的終端機工作階段啟用

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 30 -I https://www.kernel.org/

環境變數只會傳給目前 shell 之後啟動的子程序,不會影響已執行中的應用程式,也不會自動套用到其他 systemd 服務。不同程式支援的變數大小寫與優先順序各有不同,curl 的 HTTP 代理應使用小寫 http_proxy。若要長期生效,可將上述設定寫入目前使用者的 ~/.bashrc 或對應的 shell 設定檔,但代理服務停止時,相關命令也可能因此無法使用。

sudo 通常會過濾代理環境變數,請勿將一般使用者的測試成功,視為所有管理命令都已設定代理。若其他 systemd 服務需要代理,請透過該服務自己的 drop-in 設定 Environment=,並確認應用程式確實支援這些變數。

還原直連設定

unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

git config --global --get http.proxy

Git 也可能另有獨立的全域代理設定。最後一個命令用來檢查;確認不再需要舊設定後,再執行 git config --global --unset http.proxy。只清除環境變數,不會移除應用程式自行儲存的代理設定。

服務正在執行卻無法連線:分四層排查

  1. 程序層:執行 systemctl status mihomo。若服務不斷重新啟動,請優先檢查 journalctl 中首次結束前的錯誤,不要只看最後一行「重新啟動次數過多」。
  2. 監聽層:執行 sudo ss -lntp 'sport = :7890'。沒有監聽通常表示啟動失敗或連接埠設定不同;若出現 address already in use,請檢查是否有其他客戶端或手動啟動的核心正在使用該連接埠。
  3. 代理層:使用帶有 --proxy 的 curl 命令測試。若連線遭拒,先檢查本機連接埠;若交握逾時,再檢查節點、伺服器的對外連線限制與協定相容性。
  4. 規則層:檢查日誌中的比對規則與選用策略。HTTP 回應成功只代表請求已完成;若使用的仍是 MATCH,DIRECT,就不能證明代理節點正在運作。

設定測試出現 permission denied 時,請檢查 /etc/mihomo 目錄的執行權限、檔案所屬群組,以及 provider 是否寫入唯讀路徑。若 systemd 顯示 start-limit-hit,請先修正根本原因,再執行 sudo systemctl reset-failed mihomo 與 sudo systemctl start mihomo。

在遠端 SSH 工作階段中,127.0.0.1 指的是伺服器本身,不是你的工作電腦。本文不需要在雲端安全性群組開放 7890。若只想讓工作電腦暫時使用伺服器代理,可在工作電腦執行 ssh -N -L 17890:127.0.0.1:7890 伺服器登入目標,並將最後一項替換為平常使用的 SSH 登入目標;接著將電腦應用程式的代理設為 127.0.0.1:17890。

桌面版 Linux 與 TUN:勿混用兩種流量接管方式

在 GNOME 桌面中,可前往「設定」→「網路」→「網路代理」,選擇手動設定,將 HTTP 與 HTTPS 代理主機設為 127.0.0.1、連接埠設為 7890。不同 Linux 發行版的選單名稱可能略有差異。桌面代理設定只會影響遵循該設定的應用程式,無法保證終端機、遊戲和背景服務都使用代理。

若改用圖形化客戶端管理訂閱與節點,建議先停用本文設定的獨立服務,再讓客戶端啟動自己的核心。如此一來,連接埠、設定來源與日誌入口各只有一套,排查問題會更容易。「圖形化客戶端的系統代理開關」和「啟動 systemd 核心服務」是兩件不同的事,不能互相取代。

何時再考慮使用 TUN

  • 目標應用程式不支援明確代理,或確實需要接管更多流量時,再評估使用 TUN。
  • 先確認 /dev/net/tun 是否存在,以及容器或主機是否允許建立虛擬網卡。
  • 本文設定的非特權服務未取得設定網卡與路由所需的權限,只新增 tun.enable 並不足夠。
  • 若要使用 Linux capabilities,請依實際功能評估 CAP_NET_ADMIN 等權限,並一併檢查 systemd 限制;請勿直接停用所有安全防護。
  • 自動路由、策略路由與 DNS 劫持必須一併驗證;修改遠端伺服器網路前,請保留第二個 SSH 工作階段與雲端主控台的登入方式。

部署驗收標準應包括:設定測試通過、服務可設為開機啟動、7890 僅監聽本機、明確代理請求成功,且日誌顯示連線確實套用預期策略。先完成整條流程,再新增自動更新或 TUN,會更容易找出問題。