平台部署 預計閱讀 16 分鐘

Linux 部署 Clash 核心與桌面客戶端:systemd 常駐、終端機代理變數與圖形介面選擇

涵蓋 Linux 桌面與純命令列環境:核心二進位檔與 systemd 服務設定、終端機代理環境變數、GUI 客戶端選擇及權限注意事項。

先決定部署方式:桌面客戶端還是獨立核心

Linux 上的 Clash 部署通常分成兩種方式。桌面環境可使用具備設定管理、代理群組切換與日誌檢視功能的圖形客戶端;伺服器、開發機或長時間運作的小型主機,則更適合直接執行 Clash Meta(mihomo) 核心,再交由 systemd 管理程序。兩種方式底層都需要讀取 YAML 設定,但啟動方式、權限範圍與系統代理接入方法各不相同。

使用環境 建議方式 主要優點 需要注意
GNOME、KDE Plasma 桌面 GUI 客戶端 匯入訂閱、切換節點與檢視日誌更直觀 桌面代理設定、系統匣支援、核心權限
無桌面的雲端主機 mihomo + systemd 資源使用量明確,可自動重新啟動 設定檔路徑、執行使用者、監聽位址
開發工作站 GUI 或獨立核心 可為 Git、套件管理器與容器個別設定代理 環境變數作用範圍與 DNS 行為
閘道或旁路由器 mihomo TUN 或透明代理 可接管更多應用程式流量 路由表、nftables、DNS 與網路權限

如果需求只是讓瀏覽器、Git 與終端機指令透過代理,建議先從 HTTP、SOCKS 或 mixed 連接埠開始。TUN 模式會建立虛擬網卡並調整路由,涵蓋範圍更廣,但也會引入 CAP_NET_ADMIN、DNS 接管與防火牆相容性問題。先確認一般連接埠運作穩定,再啟用 TUN,排錯路徑會更短。

安裝 mihomo 二進位檔並規劃目錄

安裝前先確認處理器架構。常見的 x86_64 對應 amd64,樹莓派 4、部分雲端主機與新款開發板通常是 arm64。不要只依發行版名稱判斷架構,直接讀取系統結果更可靠。

uname -m
getconf LONG_BIT
cat /etc/os-release

uname -m 回傳 x86_64 時選擇 amd64 建置版本;回傳 aarch64 時選擇 arm64 建置版本。下載並解壓縮對應檔案後,將實際二進位檔安裝到固定路徑。以下範例假設解壓縮後的檔名為 mihomo-linux-amd64

sudo install -m 0755 ./mihomo-linux-amd64 /usr/local/bin/mihomo
/usr/local/bin/mihomo -v

建議將程式、唯讀設定與執行資料分開。二進位檔放在 /usr/local/bin,主要設定放在 /etc/mihomo,快取、Geo 資料、代理提供者檔案與執行狀態放在 /var/lib/mihomo。這樣既方便 systemd 限制寫入範圍,也能避免更新二進位檔時覆蓋設定。

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
sudo install -d -m 0750 -o mihomo -g mihomo /var/lib/mihomo/providers
sudo install -m 0640 -o root -g mihomo ./config.yaml /etc/mihomo/config.yaml

先準備可驗證的基礎設定

一份方便本機使用的基礎設定可以監聽 mixed 連接埠 7890,並將外部控制介面限制在迴圈位址。mixed 連接埠同時接受 HTTP 與 SOCKS 連線,適合終端機工具、瀏覽器與桌面代理設定共同使用。

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

external-controller: 127.0.0.1:9090
secret: "linux-local-controller-2026"

profile:
  store-selected: true
  store-fake-ip: true

這裡沒有列出代理節點、代理群組與 rules,因為這些內容應來自實際可用的設定或訂閱。匯入後要確認最終規則包含備援策略,例如 MATCH,PROXY,或名稱與實際代理群組一致的規則。代理群組名稱區分大小寫;規則引用不存在的群組時,設定測試會直接報錯。

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

測試成功時會看到設定載入完成的相關資訊;出現 YAML 解析錯誤時,應先檢查縮排、冒號後的空格以及代理群組名稱。YAML 不允許使用 Tab 取代階層縮排。在設定測試通過前不要建立自動重新啟動迴圈,否則日誌會被重複啟動訊息淹沒。

撰寫 systemd 服務並設定開機常駐

systemd 單元應明確指定執行使用者、工作目錄、重新啟動策略與允許寫入的路徑。一般 HTTP、SOCKS 代理不需要 root 權限,也不需要網路管理能力。以下單元適用於不啟用 TUN 的基礎部署。

[Unit]
Description=mihomo proxy service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=mihomo
Group=mihomo
WorkingDirectory=/var/lib/mihomo
ExecStartPre=/usr/local/bin/mihomo -t -f /etc/mihomo/config.yaml -d /var/lib/mihomo
ExecStart=/usr/local/bin/mihomo -f /etc/mihomo/config.yaml -d /var/lib/mihomo
Restart=on-failure
RestartSec=5s
LimitNOFILE=1048576

NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/mihomo
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

[Install]
WantedBy=multi-user.target

將內容儲存為 /etc/systemd/system/mihomo.service,然後重新載入單元並啟動。enable --now 會同時設定開機啟動並立即啟動,不需要再另外執行一次 start

sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl status mihomo --no-pager
journalctl -u mihomo -n 80 --no-pager

檢查連接埠與控制介面

服務顯示 active 只代表程序仍在執行,還應確認 7890 與 9090 的監聽位址。預期結果應為 127.0.0.1:7890127.0.0.1:9090,而不是對所有網卡開放的 0.0.0.0

ss -lntp | grep -E '7890|9090'
curl --max-time 5 \
  --proxy http://127.0.0.1:7890 \
  -I https://www.gstatic.com/generate_204

連線正常時,測試請求通常會在 0.4 至 2 秒內回傳 204,或回傳代理鏈可解釋的 HTTP 狀態。若逾時 5 秒,先查看 mihomo 日誌中是否已選取代理群組,再檢查節點連線錯誤;若立即出現 Connection refused,問題通常出在本機連接埠監聽,而不是遠端代理。

終端機代理變數:目前工作階段、長期設定與單一指令

Linux 終端機程式不會因為 mihomo 已在執行就自動使用代理。curl、wget、Git、語言套件管理器是否讀取系統桌面代理,取決於各自的實作。最通用的方法是在目前 Shell 設定 HTTP_PROXYHTTPS_PROXYALL_PROXY

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,.local

export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"
export all_proxy="$ALL_PROXY"
export no_proxy="$NO_PROXY"

socks5h 中的 h 表示將網域交由 SOCKS 代理端解析,可減少本機 DNS 解析與代理路徑不一致的情況。同時設定大小寫變數,是因為不同工具讀取的變數名稱並不統一。變數只對目前 Shell 及其子程序生效,已開啟的終端機分頁不會自動套用後續修改。

依作用範圍選擇寫法

  • 只代理一個指令:HTTPS_PROXY=http://127.0.0.1:7890 curl https://example.com
  • 只代理目前終端機:直接執行 export,關閉工作階段後即失效。
  • Bash 長期生效:寫入 ~/.bashrc,再執行 source ~/.bashrc
  • Zsh 長期生效:寫入 ~/.zshrc,重新開啟終端機或執行 source ~/.zshrc
  • Git 個別設定:使用 git config --global http.proxy http://127.0.0.1:7890

需要取消目前工作階段的代理時,應同時刪除大小寫變數,避免某個工具繼續讀取殘留值。

unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
unset http_proxy https_proxy all_proxy no_proxy

git config --global --unset http.proxy
git config --global --unset https.proxy

sudo 預設可能會過濾代理環境變數,systemd 服務也不會繼承互動式 Shell 的 ~/.bashrc。如果某個背景服務確實需要代理,應為該服務建立獨立的 drop-in,並在 [Service] 下設定 Environment=,而不是修改全域系統環境。這樣可以將代理影響限制在目標服務內。

Linux 桌面客戶端與系統代理接入

圖形客戶端適合需要頻繁匯入訂閱、切換代理群組與檢視連線紀錄的桌面使用者。選擇時應確認客戶端提供 Linux 建置版本、能識別核心路徑、設定儲存位置明確,並支援目前的桌面環境。常見發行格式包括 AppImage、Deb、RPM 與壓縮檔。

不同安裝格式的處理重點

  • AppImage:先執行 chmod +x,再以一般桌面使用者啟動。部分精簡系統需要安裝 FUSE 相容元件。
  • Deb:適用於 Debian、Ubuntu 及其衍生發行版,可使用 sudo apt install ./客戶端檔案.deb 安裝並處理相依套件。
  • RPM:適用於 Fedora、Rocky Linux、openSUSE 等環境,具體使用 dnf 或 zypper。
  • 壓縮檔:需要自行維護桌面捷徑、更新路徑與可執行權限,適合希望固定版本的環境。

桌面客戶端通常包含「系統代理」「TUN 模式」「開機啟動」等開關。只需要瀏覽器與遵循桌面代理設定的軟體時,開啟系統代理即可。以 GNOME 為例,對應設定位於「設定」→「網路」→「網路代理」;KDE Plasma 6 通常位於「系統設定」→「網路」→「代理」。手動設定時,HTTP、HTTPS 與 SOCKS 主機均可填寫 127.0.0.1,連接埠填寫客戶端顯示的實際 mixed 連接埠,例如 7890。

不要同時啟動 GUI 客戶端核心與前文的 systemd 核心,並讓兩者都監聽 7890。發生連接埠衝突時,後啟動的實例通常會回報 address already in use。如果需要保留兩套環境,應將其中一套改用 17890、17891 等不同連接埠,並分別檢查外部控制連接埠。

啟用 TUN 模式時的權限與 DNS 設定

TUN 模式可以接管不讀取 HTTP 代理變數的應用程式,例如部分遊戲啟動器、封閉式桌面程式以及使用自訂網路堆疊的軟體。mihomo 會建立虛擬網路裝置並調整路由,因此至少需要 CAP_NET_ADMIN。某些網路操作還會使用 CAP_NET_RAW。應只為服務授予所需能力,不必將整個程序改為 root 使用者。

可透過 sudo systemctl edit mihomo 建立覆寫設定:

[Service]
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW
PrivateDevices=false
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK

儲存後執行以下指令,讓覆寫設定生效:

sudo systemctl daemon-reload
sudo systemctl restart mihomo
systemctl show mihomo -p AmbientCapabilities
ip address show
ip route show table all

TUN 設定的關鍵欄位

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-redirect: true
  strict-route: true
  dns-hijack:
    - any:53

auto-route 用於自動寫入路由,auto-redirect 可在支援的 Linux 環境中利用 nftables 改善流量接管,strict-route 用於減少流量繞過。具體欄位是否適合目前系統,須配合 NetworkManager、systemd-networkd、Docker 與現有防火牆規則判斷。容器網路、公司 VPN 與 TUN 都可能寫入策略路由,發生衝突時應比較啟用前後的 ip ruleip route show table all

DNS 是 TUN 排錯的重點。請求可以連線至 IP、卻無法存取網域時,先執行 resolvectl statusresolvectl query example.com。如果系統已有 systemd-resolved 佔用本機 53 連接埠,不要再讓 mihomo 的一般 DNS 監聽直接繫結相同位址與連接埠。可以使用高位連接埠,例如 127.0.0.1:1053,再由明確的系統設定轉送;也可以讓 TUN 的 DNS 劫持處理經由虛擬網卡的 53 連接埠請求。

高頻故障排查:從程序、連接埠到規則結果

服務反覆重新啟動

先讀取目前啟動週期的日誌,不要連續重新啟動:

systemctl status mihomo --no-pager
journalctl -u mihomo -b -n 120 --no-pager
sudo -u mihomo /usr/local/bin/mihomo \
  -t \
  -f /etc/mihomo/config.yaml \
  -d /var/lib/mihomo

常見原因包括 YAML 縮排錯誤、代理群組引用不存在、設定檔權限不足、Geo 資料目錄不可寫入,以及監聽連接埠已被另一個客戶端佔用。

7890 已在監聽,但終端機仍直接連線

檢查目前程序實際取得的變數,而不是只查看設定檔:

env | grep -i proxy
curl --max-time 5 -I https://example.com
curl --max-time 5 --proxy http://127.0.0.1:7890 -I https://example.com

如果第二條失敗而第三條成功,表示 mihomo 運作正常,問題出在終端機代理變數或應用程式本身的設定。如果兩條都失敗,再查看日誌中的 DNS、握手或節點逾時資訊。

訂閱已更新,但節點清單沒有變化

代理提供者檔案應放在 mihomo 使用者可寫入的目錄,例如 /var/lib/mihomo/providers。檢查檔案更新時間、provider 的健康檢查結果與訂閱回傳內容。systemd 的 ProtectSystem=strict 會阻止服務寫入未列入 ReadWritePaths 的目錄,因此不要將動態 provider 檔案放在唯讀的 /etc/mihomo

TUN 啟用後區域網路或容器失去連線

先關閉 TUN,確認 mixed 連接埠仍能運作,再比較啟用 TUN 前後的路由與規則。區域網路網段通常需要直連規則,例如 192.168.0.0/1610.0.0.0/8172.16.0.0/12。Docker 常使用 172.17.0.0/16,但實際網段應以 docker network inspect 輸出為準,不能假設所有主機都相同。

更新與回滾:保持設定與程式相互獨立

更新核心前先記錄目前版本,並保留正在運作的二進位檔。由於設定與程式已經分離,回滾只需要恢復舊版二進位檔並重新啟動服務,不必覆蓋 /etc/mihomo/config.yaml 或 provider 資料。

/usr/local/bin/mihomo -v
sudo cp /usr/local/bin/mihomo /usr/local/bin/mihomo.previous
sudo systemctl stop mihomo
sudo install -m 0755 ./mihomo-linux-amd64 /usr/local/bin/mihomo
sudo -u mihomo /usr/local/bin/mihomo \
  -t \
  -f /etc/mihomo/config.yaml \
  -d /var/lib/mihomo
sudo systemctl start mihomo

如果新版本無法啟動,可執行 sudo install -m 0755 /usr/local/bin/mihomo.previous /usr/local/bin/mihomo 後重新啟動。升級完成後還應檢查日誌、連接埠、代理群組選擇與一項實際網路請求。只看到版本號變更,不能取代完整的運作驗證。

下載 Clash 客戶端