Linux 執行 Clash

說明如何在 Linux 桌面安裝圖形用戶端,以及如何在無圖形介面的伺服器上設定 mihomo,並透過 systemd 長時間執行。

一、先選擇桌面用戶端或命令列服務

在 Linux 上使用 Clash,主要有兩種方式。桌面用戶端可匯入訂閱、選擇策略群組、設定系統代理並查看記錄;mihomo 則是代理核心,負責讀取 YAML 設定、監聽連接埠、比對規則並建立連線。安裝核心不代表桌面系統代理也已設定完成。

使用環境建議方式需自行處理
Ubuntu、Fedora 等桌面系統Clash Verge Rev 或 FlClash 等圖形用戶端匯入訂閱、啟用設定、確認本機連接埠
透過 SSH 管理的伺服器mihomo 搭配 systemd 系統服務設定檔、執行帳號、權限、記錄與更新
只讓終端機工具使用代理任一方式都會提供本機 HTTP 代理明確指定代理參數或環境變數

本文以已啟用 systemd 的一般 Linux 發行版為前提。容器、WSL 與精簡系統可能沒有可用的系統級 systemd;請先執行下列命令確認環境,再選擇安裝套件。核心版本以實際執行結果為準,不要根據用戶端介面上的版本號推斷。

uname -m
cat /etc/os-release
ps -p 1 -o comm=
  • x86_64 通常對應 amd64 或 x64 套件。
  • aarch64 通常對應 arm64 套件,不能使用 x64 執行檔。
  • Debian、Ubuntu 通常使用 DEB;Fedora 等發行版通常使用 RPM。套件格式與 CPU 架構都必須相符。

二、在 Linux 桌面安裝並匯入訂閱

安裝圖形用戶端

前往下載頁面並選擇 Linux 平台,再依發行版與架構挑選用戶端。以下安裝命令假設您已將下載的 DEB 套件重新命名為 clash-client.deb,或將 RPM 套件重新命名為 clash-client.rpm,然後在檔案所在目錄執行對應的一行命令。

# Debian / Ubuntu:執行這一行即可
sudo apt install ./clash-client.deb

# Fedora:執行這一行即可
sudo dnf install ./clash-client.rpm

套件管理員會檢查相依性。若提示缺少圖形元件,請先確認系統確實安裝了桌面環境,不要在純 SSH 工作階段中反覆啟動視窗程式。安裝完成後,從應用程式選單開啟用戶端即可,通常不需要用 sudo 啟動整個圖形介面。

匯入設定後,再啟用系統代理

  1. 以下以 Clash Verge Rev 為例:在「訂閱」頁面新增訂閱網址,下載完成後選取該設定檔。不同版本的按鈕文字可能略有差異。
  2. 在「代理」頁面檢視策略群組,並選擇可用節點。使用「規則」模式時,連線仍會依設定規則分流;選取節點不代表所有連線都會自動走代理。
  3. 在「設定」中確認「系統代理」與連接埠設定,並記下實際使用的混合連接埠。本文以下以 7890 為例;若介面上的設定不同,請一併替換命令中的連接埠。
  4. 先啟用系統代理並測試瀏覽器,再另外測試終端機。不要同時啟用另一個用戶端的系統代理,以免設定互相覆蓋。

桌面環境通常有自己的代理設定入口,例如 GNOME 的「設定」→「網路」→「網路代理」。您可以在此確認用戶端是否寫入預期的位址,但並非所有應用程式都會讀取桌面代理設定。終端機中的 curl、Git 與套件管理員都需要分別測試,不能只因瀏覽器能開啟網頁,就認定整個系統都已使用代理。

三、安裝 mihomo 並建立服務帳號

無圖形介面的伺服器不需要安裝圖形用戶端。下載符合架構的 mihomo 核心,依下載檔案格式解壓縮,再將解壓後的執行檔命名為 mihomo。以下假設目前目錄中已有這個檔案,而非要將壓縮檔直接複製到系統路徑。

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

若出現 Exec format error,請優先確認架構是否相符,以及檔案是否已正確解壓縮;若出現 Permission denied,請檢查執行權限,以及所在檔案系統是否使用 noexec 掛載選項。請勿透過開放任意寫入權限來解決執行問題。

區分程式、設定檔與執行資料

使用專用系統帳號執行服務。設定檔存放於 /etc/mihomo,快取與規則資料寫入 /var/lib/mihomo,執行檔則放在 /usr/local/bin。以下建立帳號的命令只需執行一次;若系統已有同名帳號,請先確認其用途與權限。

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

此處讓一般使用者監聽 7890,不需要低連接埠繫結權限。本文的服務設定也不啟用 TUN,因此不需授予網路管理權限。若日後確實要啟用 TUN,必須重新評估裝置存取、能力集與路由行為,而不是讓整個服務長期以 root 身分執行。

四、準備設定檔並在啟動前檢查

先用最精簡的設定檔確認程式、權限與監聽連接埠正常,再套用實際訂閱。以下提供完整的本機直連測試設定:它不會建立代理節點,所有請求最後都會直接連線,只用來確認 HTTP 與 SOCKS 混合入口可正常運作。

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

proxies: []
proxy-groups: []

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

-t 用於測試設定,-d 指定工作目錄,-f 指定設定檔。測試通過只代表核心能讀取設定,不代表節點可連線,也不代表目標網站可連線。若設定使用 GeoIP、GeoSite 或遠端規則集,也可能需要準備對應資料檔並確認下載連線正常。

換成實際訂閱設定

準備一份已儲存至本機、且與 mihomo 相容的 YAML 檔案,例如目前目錄中的 profile.yaml。請確認檔案內容確實是設定檔,而非訂閱錯誤頁、登入頁面或只有節點清單的編碼文字,再將它複製到固定路徑:

sudo install -o root -g mihomo -m 0640 \
  ./profile.yaml /etc/mihomo/config.yaml

sudo -u mihomo /usr/local/bin/mihomo \
  -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
  • 保留服務所需的 mixed-port: 7890 與本機監聽限制;若設定檔已有同名欄位,請修改原有值,不要新增重複的鍵。
  • 確認 proxy-groups 中引用的節點名稱,以及規則引用的策略群組名稱,兩者都必須相符。
  • 使用 proxy-providers、rule-providers 時,建議將本機快取路徑放在工作目錄下,例如 ./providers,不要指向服務帳號無法寫入的設定目錄。
  • 確認沒有意外啟用 tun、區域網路監聽或遠端控制介面。也請檢查訂閱中的執行參數。

五、使用 systemd 持續執行

建立系統級服務單元。服務會以專用帳號執行、啟動前測試設定,並在程序意外結束後等待 5 秒再重新啟動。安全性強化選項會將系統目錄設為唯讀,只允許寫入執行資料目錄;因此,設定中的快取檔案也應存放在該目錄內。

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=5
UMask=0077
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

enable --now 會同時設定開機啟動並立即啟動服務。network-online.target 只會設定啟動順序;實際效果也取決於發行版的網路等待服務,無法保證訂閱伺服器或代理節點此時一定可連線。

修改後如何套用

若只修改 YAML,先執行前述 -t 測試,通過後再執行 sudo systemctl restart mihomo.service。若修改服務單元,請先執行 sudo systemctl daemon-reload,再重新啟動服務。本文未設定 ExecReload,因此不要將 systemctl reload 當成可用的設定重新載入命令。

六、分別確認監聽、請求與規則

第一步:確認連接埠確實在監聽

sudo ss -lntp 'sport = :7890'
curl --proxy http://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 30 \
  -I https://example.com/

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

預期的監聽位址應為迴路位址,不能是對外開放的 0.0.0.0:7890。兩個 curl 命令會分別測試混合連接埠的 HTTP 與 SOCKS 入口;socks5h 會將目標網域交由代理解析,可用來排除 curl 在本機預先解析網域的影響。但這不會自動決定 mihomo 最後使用哪一個 DNS 上游。

使用最精簡的設定時,請求成功只能證明直連路徑正常。換成實際設定後,還要查看記錄中的規則比對與策略選擇,確認測試網域確實經由預期節點連線。HTTP 連線成功、目標網站回傳狀態碼,以及出口符合預期,是三項不同的檢查。

第二步:明確讓終端機程式使用代理

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,::1

curl -I --connect-timeout 10 --max-time 30 https://example.com/

# 只清除目前終端機中的上述設定
unset http_proxy https_proxy no_proxy

https_proxy 的值仍可使用 http://,代表透過 HTTP 代理的 CONNECT 通道存取 HTTPS 網站,並不是將目標網站改成 HTTP。環境變數只會影響目前程序及其子程序;其他終端機、桌面應用程式和已啟動的 systemd 服務都不會自動繼承。

若只有某個程式無法使用,請檢查該程式本身是否支援代理。sudo 預設也可能會清除環境變數。為 curl 設定成功,不代表 APT、容器建置或背景服務也已使用相同代理。

七、遠端使用與 TUN 權限範圍

伺服器上的 127.0.0.1 指向伺服器本身,而不是您的本機電腦。若要暫時透過伺服器代理進行測試,可以在本機使用 SSH 連接埠轉送,不必直接將混合連接埠暴露於公網。以下的 192.0.2.10 是文件範例位址,執行前請換成實際伺服器位址,並將 ops 換成實際的 SSH 帳號。

# 在本機電腦執行,並保持此工作階段開啟
ssh -N -o ExitOnForwardFailure=yes \
  -L 127.0.0.1:17890:127.0.0.1:7890 [email protected]

# 在本機電腦的另一個終端機測試
curl --proxy http://127.0.0.1:17890 \
  --connect-timeout 10 --max-time 30 \
  -I https://example.com/

本機使用 17890 是為了避開常見的本機用戶端連接埠。若確實要向區域網路提供代理,請一併規劃 allow-lan、監聽位址、驗證機制與防火牆,並限制允許連線的來源網段。控制介面與代理入口是不同類型的連接埠,不能把控制介面當成代理位址。

部署成功不以 TUN 為必要條件

TUN 會透過虛擬網卡與路由接管符合條件的 IP 流量,適合不讀取系統代理設定的應用程式。在 Linux 上通常會涉及 /dev/net/tun、網路管理權限與 DNS 路由。本文服務使用的一般帳號與安全限制並未為 TUN 做好準備,直接在 YAML 中設定 tun.enable: true 可能會因權限不足而失敗。

八、排除問題與日常更新

狀況優先檢查項目處理方式
服務退出,連接埠未監聽journalctl 與設定測試輸出修正 YAML、檔案權限或規則資源問題後再啟動
記錄中出現 address already in use使用 ss 查出佔用 7890 的程序停止重複執行的核心,或統一修改監聽連接埠與應用程式的代理位址
瀏覽器正常,終端機仍直接連線終端機代理參數與環境變數先使用 curl 的 --proxy 明確測試
代理已連線,但請求仍直接連線規則順序、策略群組選擇,以及記錄中的出口確認是否符合 DIRECT 規則,或選到了直連策略
規則集下載失敗工作目錄權限、下載網址與目前網路狀態確認快取路徑可寫入,並排除更新連線依賴尚不可用的代理

更新時保留可還原的程式與設定檔

更新核心前,先記下 mihomo -v 的輸出並保留舊執行檔。將新執行檔放到暫存路徑,先執行版本命令與設定測試,確認支援現有通訊協定與欄位後,再停止服務、替換執行檔並重新啟動。不要直接覆蓋正在執行的檔案,也不要在同一次疑難排解中同時更新程式並大幅改寫規則。

更新訂閱設定前,先備份 /etc/mihomo/config.yaml,並比對連接埠、監聽位址、控制介面、TUN 與 provider 路徑。設定測試通過後再重新啟動,並再次檢查連接埠與明確指定代理的請求。依序處理可將問題範圍縮小到程式、設定或網路其中一項,避免同時修改多個變數而無從判斷。

桌面使用方式的重點是目前的設定、策略群組與系統代理是否一致;伺服器使用方式則應著重帳號權限、固定設定路徑與 systemd 記錄。先確保一般本機代理運作穩定,再視需求加入自動更新、遠端管理或 TUN,較容易控制維護成本。

下載Clash查看平台與用戶端