先決定部署方式:桌面客戶端還是獨立核心
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:7890 與 127.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_PROXY、HTTPS_PROXY 與 ALL_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 rule 與 ip route show table all。
DNS 是 TUN 排錯的重點。請求可以連線至 IP、卻無法存取網域時,先執行 resolvectl status 與 resolvectl 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/16、10.0.0.0/8 與 172.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 後重新啟動。升級完成後還應檢查日誌、連接埠、代理群組選擇與一項實際網路請求。只看到版本號變更,不能取代完整的運作驗證。