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 启动整个图形界面。
导入配置,再开启系统代理
- 以 Clash Verge Rev 为例,在「订阅」页面添加订阅地址,下载完成后选中该配置。不同版本的按钮文字可能略有变化。
- 在「代理」页面查看策略组,选择一个可用节点。使用「规则」模式时,请求仍按配置规则分流;选中节点不会自动让所有连接都走代理。
- 在「设置」中检查「系统代理」及端口设置,记录实际的混合端口。本文后续统一以
7890为例,若界面不同,需要同步替换命令中的端口。 - 先启用系统代理测试浏览器,再单独测试终端。不要同时打开另一个客户端的系统代理,以免设置相互覆盖。
桌面环境通常有自己的代理设置入口,例如 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,维护成本更容易控制。