Clash Linux 無圖形環境部署:Meta 內核、systemd 常駐與訂閱自動更新
如果你要在沒有桌面的 Debian、Ubuntu、Arch 或任意一臺遠程 VPS 上長期跑 Clash,圖形客戶端幫不上忙。本文以社區廣泛使用的 Clash Meta 內核實現(發佈名常見為
mihomo)為主線,說明如何安裝二進制、組織配置目錄、用 proxy-providers 讓訂閱按間隔自動拉取、用 systemd 做進程守護與開機自啟,以及怎樣讓
curl、apt、CI 腳本等命令行工具穩定走本地混合端口或環境變量代理。步驟與 Windows、Android 教程差異很大,更適合自建網關、旁路由或遠端開發機場景。
為什麼在無圖形 Linux 上要選 Clash Meta
無頭服務器沒有托盤圖標,也沒有「一鍵導入」界面,一切依賴配置文件與進程管理。Clash Meta 系內核在規則特性、協議支持與生態工具鏈上較貼近當前機場與規則集實踐,適合在服務器側與桌面側共用同一套 YAML 思路。你可以把它理解成:一個常駐用戶空間進程,監聽本地端口(常見為混合端口或 HTTP/SOCKS),根據規則把流量送到不同節點;再通過外部控制器(REST API)做熱更新與健康檢查。
與桌面版相比,Linux 無頭部署多出來的工作主要集中在三塊:其一,用包管理器或官方發佈頁取得與 CPU 架構匹配的可執行文件,並放到統一路徑;其二,把配置、訂閱緩存、GeoIP 數據等目錄權限收緊,避免以 root 長期運行;其三,用 systemd 處理崩潰重啟、開機順序(建議在網絡就緒後再拉起),以及可選的定時任務配合 API 觸發完整配置重載。把這三塊做對,後面無論是旁路由轉發還是本機出站,都會省心很多。
開始前:架構、用戶與網絡前提
檢查清單
- CPU 架構:確認是
amd64、arm64等,下載對應發行包,避免在 ARM 小主機上誤裝 x86 二進制。 - 專用系統用戶:建議創建
clash或mihomo用戶,配置目錄歸其所有,服務以該用戶運行。 - 端口規劃:為 mixed-port(或分別的 HTTP/SOCKS)、external-controller(REST)選定未佔用端口,防火牆僅對本機或管理網段開放管理口。
- 訂閱可達性:若訂閱域名在牆外,首次拉取可能需從中轉或已聯通的環境拷貝生成的
providers緩存文件,再改為定時更新。
家用旁路由場景下,往往還會涉及 IPv4 轉發、iptables/nftables 或透明代理插件,這已經超出單篇入門篇幅;本文默認讀者目標是「本機或 VPS 上有一個可靠的上游 SOCKS/HTTP 出口」,先把無頭服務跑穩,再與網關轉發方案拼接。
安裝 mihomo(Clash Meta)二進制
以官方 GitHub Release 為例(項目名常寫作 mihomo),在服務器上下載與你架構匹配的壓縮包或單文件,解壓後將可執行文件放到 /usr/local/bin/mihomo,並賦予可執行權限。若你更習慣發行版自帶的
AUR、第三方包,也可以,但要確認版本是否滿足訂閱裡用到的協議與規則特性,過舊的內核可能在解析新字段時直接報錯退出。
- 使用
uname -m核對架構,與 Release 資產文件名對照。 - 下載後校驗校驗和(若發佈頁提供),避免供應鏈風險。
sudo install -m 0755 mihomo /usr/local/bin/mihomo或等價方式安裝到 PATH。- 以普通用戶執行
mihomo -v驗證能正常輸出版本信息。
提示
不要把整個配置目錄放在全局可寫路徑;systemd 的 ReadWritePaths 與專用用戶組合,比
root 運行後再 chmod 777 更安全。
配置目錄與主配置骨架
約定配置根目錄為 /etc/mihomo(亦可選用 /var/lib/mihomo,關鍵是權限與 systemd 中路徑一致)。主文件通常命名為
config.yaml,其中聲明監聽端口、模式、外部控制器密鑰、引用哪些 proxy-providers 與 rule-providers。無頭環境下建議顯式打開
external-controller 並設置 secret,這樣後續可以用 curl 調用 API 做健康檢查或觸發重載,而無需登錄桌面。
下面是一段極度精簡的骨架,僅用於說明字段關係;真實環境請在此基礎上補全規則、策略組與節點引用。佔位 URL 需替換為你的訂閱地址。
port: 7890
socks-port: 7891
mixed-port: 7893
mode: rule
log-level: info
external-controller: 127.0.0.1:9090
secret: "change-me"
proxy-providers:
airport:
type: http
url: "https://example.com/subscription"
path: ./providers/airport.yaml
interval: 3600
health-check:
enable: true
interval: 600
url: https://www.gstatic.com/generate_204
proxies: []
proxy-groups:
- name: PROXY
type: select
use:
- airport
rules:
- MATCH,PROXY
interval 以秒為單位,表示內核週期性重新下載訂閱併合並;配合 health-check 可對節點做主動探測,減少手工在命令行裡換節點的次數。若訂閱返回的是完整
proxies 列表而非 provider 片段,需按你所用版本的文檔調整字段(部分場景會用 proxy-providers 的 parser 或單獨維護靜態文件)。
編寫 systemd 服務單元
在 /etc/systemd/system/mihomo.service 創建單元文件。核心思路是:Type=simple,工作目錄指向配置根,啟動命令帶
-d 指定目錄;失敗時自動退避重啟;限制文件句柄數以應對大量連接。若你希望服務在 WAN 撥號完成後再啟動,可把 After= 調整為運營商提供的網絡目標或使用
network-online.target(需確保系統啟用了相應等待邏輯)。
[Unit]
Description=mihomo (Clash Meta) daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=mihomo
Group=mihomo
WorkingDirectory=/etc/mihomo
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reloadsudo systemctl enable --now mihomo.servicesystemctl status mihomo確認 active (running)- 異常時查看
journalctl -u mihomo -e日誌中的 YAML 解析錯誤或端口占用信息
安全注意
external-controller 若監聽在非迴環地址,必須配合防火牆與強
secret,否則等價於在網絡上暴露一臺可切換出口的代理控制檯。默認建議僅綁定 127.0.0.1,通過 SSH 端口轉發管理。
命令行與腳本如何使用代理
無頭服務器上最常見的需求是:apt、git、curl、容器拉鏡像、語言包管理器等都走 Clash。若主配置裡打開了
mixed-port,可以在 shell 中導出標準環境變量,讓支持這些變量的工具自動使用 HTTP 或 SOCKS 代理。示例(端口請與本地配置一致):
export http_proxy="http://127.0.0.1:7893/"
export https_proxy="http://127.0.0.1:7893/"
export all_proxy="socks5://127.0.0.1:7893/"
部分工具只認小寫變量,部分則認大寫;CI 環境裡可在 job 級別注入。若你希望「僅對某些命令走代理」,可在命令前加前綴 env,而不是把變量寫進全局
~/.bashrc,避免影響本機維護流量。對於不走環境變量的程序,可考慮 redsocks、proxychains 或 TUN 級方案,但複雜度會明顯上升。
提示
把 DNS 查詢也納入規劃:若使用 fake-ip 等模式,請閱讀你所用內核版本文檔,避免在服務器上出現「解析到了假地址導致本機服務異常」的耦合問題。
訂閱熱更新與配置重載
當 proxy-providers 的 interval 到期時,內核會嘗試重新下載訂閱並更新內存中的節點列表,這一過程通常不需要重啟整個進程。若你修改了主配置
config.yaml 本身(例如新增了一個 provider 或改了規則文件路徑),則需要觸發一次完整配置加載。常見做法有兩種:其一是通過外部控制器調用重載接口(具體路徑以當前版本文檔為準,常見模式為向
/configs 發送 PUT 並帶 Authorization: Bearer <secret>);其二是
systemctl restart mihomo,簡單粗暴但有短暫斷流。
你也可以額外定義 systemd timer,每小時執行一次調用 API 的腳本,用於在 interval 之外強制刷新;這在訂閱端突發變更、而本地 interval 設得較長時有用。編寫腳本時注意不要把
secret 寫進世界可讀的文件,可用 systemd EnvironmentFile 配合權限 600 存放。
常見問題
服務啟動後立即退出,日誌提示端口被佔用?
用 ss -lntp 或 lsof -i :7893 查看是否已有舊進程或其他代理佔用 mixed-port 或 controller 端口。若曾手動前臺運行過
mihomo,可能重複啟動導致衝突。統一改為僅由 systemd 管理,並關閉重複實例。
訂閱一直下載失敗?
先在服務器上用 curl -v 直連訂閱 URL,確認是 DNS、TLS 還是出口被攔。若訂閱必須翻牆才能拉取,屬於「冷啟動」問題:需要先用其他方式拿到首份
providers 緩存,或臨時在可達網絡生成配置後同步到服務器,再依賴節點在線後的週期性更新。部分機場提供多線路訂閱域名,換一個直連更友好的域名往往比盲目加大
interval 更有效。
提示無法寫入 providers 目錄?
檢查配置目錄所有者是否與 systemd 裡的 User= 一致,並確認 path: ./providers/... 相對目錄存在且可寫。不要把整個倉庫克隆到
root 目錄卻用低權限用戶運行,否則下載訂閱時無法落盤。
流程小結
- 準備架構匹配的二進制與專用系統用戶,規劃端口與權限。
- 編寫
config.yaml,用proxy-providers聲明訂閱 URL、間隔與健康檢查。 - 配置 systemd 單元,啟用
Restart=on-failure與合理的網絡依賴。 - 用
mixed-port或環境變量讓命令行工具走本地代理;管理接口僅本機或 SSH 轉發訪問。 - 大改配置時用 API 重載或受控重啟;日常節點變更交給 provider 週期更新。
需要帶界面的整合版本?
在服務器上維護 YAML 與 systemd 是穩定方案;若你同時在桌面環境工作,也可以從 Clash 下載頁 獲取帶圖形界面、已整合常見規則與中文說明的客戶端,把無頭實例當作網關或上游,在電腦上專注業務本身。