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 端口转发管理。逐步加固步骤见 《Clash Meta Web 面板:bind-address 与 secret》。
命令行与脚本如何使用代理
无头服务器上最常见的需求是: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 下载页 获取带图形界面、已整合常见规则与中文说明的客户端,把无头实例当作网关或上游,在电脑上专注业务本身。