Linux 上部署 Clash:桌面图形客户端与 systemd 命令行两条路线
桌面发行版可以装图形客户端,服务器或无界面环境则用 mihomo 二进制加 systemd 守护。本文分两条路线讲清安装、配置目录、开机自启与终端环境变量设置。
先选部署路线:桌面用图形界面,服务器用独立内核
结论先说:有 GNOME、KDE 等桌面环境,需要经常切换订阅和策略组,优先选 Linux 图形客户端;通过 SSH 管理、没有桌面会话的机器,更适合 mihomo 配合 systemd。两条路线都能提供本地代理端口,但启动时机、配置位置与权限边界不同,不建议让两套内核同时接管相同端口。
Clash 是常被用来统称这一类客户端的名称。mihomo 是由 Clash Meta 延续发展的内核,图形客户端负责界面、订阅和服务管理,实际连接能力取决于它搭载的内核。不要把某个旧客户端的说明直接套到当前 mihomo,也不要默认所有 Clash 格式订阅都支持相同协议。
| 检查项 | 图形客户端 | mihomo 与 systemd |
|---|---|---|
| 使用环境 | 已登录的桌面会话 | 服务器、无界面主机 |
| 配置入口 | 订阅、配置与策略组界面 | 本地 YAML 文件 |
| 启动方式 | 桌面登录自启或客户端服务 | 系统服务开机启动 |
| 本文验证端口 | 以客户端实际显示为准 | 示例固定为 127.0.0.1:7890 |
安装前检查:架构、软件包与现有监听端口
先运行下面三条命令。第一条确认 CPU 架构,第二条确认是否存在 systemd,第三条检查准备使用的端口。输出中若已有进程监听 7890,先确定它是不是另一个代理内核,再决定停用或改端口。
uname -m
systemctl --version
sudo ss -lntup 'sport = :7890'
x86_64通常对应 amd64 或 x64 安装包;aarch64通常对应 arm64。32 位 ARM 不能直接运行 arm64 二进制。- Debian、Ubuntu 系列优先选择匹配架构的 DEB;Fedora 等 RPM 系列选择 RPM。软件包格式和 CPU 架构要分别核对。
- 旧 CPU 还要看发布说明中的指令集要求。出现
Illegal instruction,应先检查构建变体,不能只按文件名里的 amd64 判断。 - Alpine 常用 OpenRC,且用户空间通常采用 musl;本文的 systemd 单元不能原样照搬到这类环境。
客户端与内核请从项目的官方发布渠道获取。本文不锁定一个未经验证的版本号;部署时记录所装版本和架构,后续排查才有可比条件。内核安装后可用 mihomo -v 查看实际版本,图形客户端则同时记录界面版本与内核版本。
路线一:Linux 桌面图形客户端
先导入完整配置,再开启系统代理
Clash Verge Rev、FlClash 等提供 Linux 图形界面,但发行包与系统集成方式各不相同。可从本站下载中心比较平台入口与适用条件,再按对应项目说明安装。DEB 安装可使用 sudo apt install ./文件名.deb,这里的文件名必须换成下载目录中的实际文件,不要直接复制这个说明性名称。
- 在客户端的订阅或配置页面导入服务方提供的 Clash/mihomo 配置。订阅 URL 通常含访问凭据,不要发到公开截图或日志里。
- 更新配置,检查是否出现节点与策略组。只有节点列表并不代表 DNS、规则和策略组已完整配置。
- 先选规则模式,再在目标策略组中选择一个节点。记录界面显示的 HTTP、SOCKS 或混合端口。
- 开启系统代理,用浏览器访问一个明确会命中代理规则的目标,同时查看连接记录中的规则、策略组与出口。
不同客户端的菜单布局会调整,因此不要寻找一个所有软件都通用的固定菜单路径。应围绕“配置是否启用、内核是否启动、端口是多少、系统代理是否写入”四个状态核对。仅看到托盘图标,不能证明流量已经进入内核。
配置目录与桌面自启
图形客户端可能把数据放在 XDG 用户目录,例如 ~/.config 或 ~/.local/share 下的应用子目录,但具体名称由应用决定。优先使用客户端提供的配置目录入口;不要猜路径后批量删除。订阅缓存、覆写文件和内核最终使用的配置,可能是三份不同文件。
先确认手动启动正常,再打开客户端的登录自启选项,注销并重新登录验证。桌面自启一般意味着“用户登录后启动”,不是“无人登录时也运行”。若客户端提供独立服务模式,应按它自己的服务安装说明操作,不要再叠加本文的同端口 systemd 服务。
路线二:准备 mihomo 二进制与配置目录
以下步骤采用专用低权限用户运行普通代理服务,不授予 TUN 所需的网络管理能力。先获取与架构匹配的官方压缩包;如果下载的是 gzip 单文件,可将它在本地重命名为 mihomo.gz,再在该目录执行:
gzip -dk mihomo.gz
file ./mihomo
chmod u+x ./mihomo
./mihomo -v
sudo install -o root -g root -m 0755 ./mihomo /usr/local/bin/mihomo
Exec format error 常见于架构不匹配,或者把压缩包当作程序执行。此时先回到下载与解压步骤,不要通过反复增加执行权限处理。下面创建服务账户;若系统已存在同名账户,先检查用途,不要重复创建或直接改它的权限。
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
把已经准备好的完整配置保存为当前目录下的 config.yaml,再安装到服务配置目录。本文不提供公共节点,也不把只有 DNS 和端口的片段当作完整订阅。配置必须包含与你的服务相符的节点或提供器、策略组与规则。
sudo install -o root -g mihomo -m 0640 \
./config.yaml /etc/mihomo/config.yaml
编辑完整配置中已有的同名字段,不要在 YAML 末尾重复追加键。用于本机普通代理的关键字段如下;这是局部片段,不是可独立工作的完整配置:
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
tun:
enable: false
mixed-port 让同一个端口接受 HTTP 与 SOCKS 代理连接。示例只面向本机使用;如果完整配置还启用了其他入站端口、DNS 监听或控制接口,也必须分别检查监听地址。特别是 external-controller,没有管理需求可以不启用;需要启用时应绑定回环地址并设置独立的访问密钥。
本文把只读主配置放在 /etc/mihomo,把缓存、数据库和运行数据放在 /var/lib/mihomo。使用 proxy-providers 或 rule-providers 时,把可更新文件放在工作目录内,例如 ./providers/main.yaml,避免写向后续被设为只读的配置目录。
sudo -u mihomo /usr/local/bin/mihomo \
-t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
测试通过只说明配置加载检查通过,不等于节点可连接。若提示文件权限或缺少数据库,按报错修正路径、权限及所需资源,再继续创建服务。
systemd 守护:启动、开机自启与日志
用 sudoedit /etc/systemd/system/mihomo.service 新建下面的单元。它明确指定可执行文件、配置和工作目录,并限制服务写入系统其他位置。这里没有开放网络管理权限,因此不要同时把配置中的 TUN 开关改成启用。
[Unit]
Description=mihomo local proxy service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=mihomo
Group=mihomo
StateDirectory=mihomo
StateDirectoryMode=0750
WorkingDirectory=/var/lib/mihomo
ExecStart=/usr/local/bin/mihomo -d /var/lib/mihomo -f /etc/mihomo/config.yaml
Restart=on-failure
RestartSec=5s
UMask=0027
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/mihomo
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo.service
systemctl is-enabled mihomo.service
systemctl is-active mihomo.service
sudo journalctl -u mihomo.service -b -n 80 --no-pager
sudo ss -lntp 'sport = :7890'
enable --now 同时设置开机启动并立即启动;enabled 与 active 分别回答“以后会不会启动”和“现在有没有运行”。监听检查应与示例配置一致,看到 127.0.0.1:7890,而不是意外出现的公网监听地址。
- 修改 YAML 后:先执行配置测试,再运行
sudo systemctl restart mihomo。短暂重启会中断已有代理连接。 - 修改服务单元后:先执行
sudo systemctl daemon-reload,再重启服务。 - 服务持续失败:查看日志的第一条实际错误。修正后若遇到启动频率限制,可执行
sudo systemctl reset-failed mihomo再启动。
network-online.target 不保证互联网、DNS 或订阅服务器一定可达。远程规则和提供器更新失败时,应区分网络未就绪、URL 失效与文件写入权限问题。发布日志前移除订阅地址、密钥和其他敏感信息。
终端代理环境变量:只影响读取它们的进程
服务启动不会自动接管所有命令行工具。先在当前终端临时设置 HTTP 代理;HTTPS 目标通常也使用下面的 http:// 代理地址,由客户端通过 CONNECT 建立隧道,不要仅因目标网址是 HTTPS 就改代理地址的协议。
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 20 https://example.com
也可以不改环境,直接给一次请求指定代理。下面两条分别测试 HTTP 代理与 SOCKS5 代理;socks5h 中的 h 表示将目标域名交给代理端解析,但最终解析路径仍取决于内核配置与节点协议。
curl --noproxy "" -x http://127.0.0.1:7890 \
-I --connect-timeout 10 --max-time 20 https://example.com
curl --noproxy "" --proxy socks5h://127.0.0.1:7890 \
-I --connect-timeout 10 --max-time 20 https://example.com
需要持久化时,Bash 交互终端可写入 ~/.bashrc,Zsh 可写入 ~/.zshrc,重新打开终端后验证。登录 shell、桌面程序和 systemd 服务有各自的环境加载路径,不能假设它们都会读取 Bash 配置。部分工具只接受小写变量,另一些也支持大写,按工具文档设置即可。
sudo 通常会过滤代理环境变量,APT、容器和其他服务也可能需要单独配置。不要为图省事把所有进程的代理变量写进全局环境;先用单次命令验证,再决定持久化范围。需要恢复当前终端时执行:
unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
TUN、远程访问与常见故障边界
什么时候再考虑 TUN
浏览器和支持代理变量的工具都已验证正常,但某些应用不读取系统代理或环境变量时,再考虑 TUN。TUN 涉及虚拟网卡、路由与 DNS 接管,不是把 enable 改成 true 就能在任意机器上生效。
先检查 ls -l /dev/net/tun。容器还需要宿主机授予相应设备与网络能力,VPS 也可能有限制。本文低权限服务没有配置这些能力,不能直接用于 TUN。需要时应依照当前 mihomo 文档重新评估服务权限,尤其是网络管理能力、自动路由及 DNS 劫持配置;不要把整个服务改成 root 运行当作通用修复。
通过 SSH 修改远程主机路由时,保留第二个会话和服务商控制台,并准备回退方式。TUN 的自动路由或严格路由可能影响管理连接。连接面板中有记录也不保证 DNS 已接管,应用自带的加密 DNS 还需要单独检查。
远程机器如何安全使用本地监听
如果只是让自己的电脑使用服务器上的代理,不必直接把 7890 暴露到公网。可以建立 SSH 本地转发:使用 ssh -L 17890:127.0.0.1:7890,后面接平时登录服务器使用的目标。然后本机应用连接 127.0.0.1:17890。这仍需服务器上的节点、规则和网络本身正常。
按症状定位,不同时修改多个变量
- Connection refused:先查服务状态与监听端口。此时请求通常还没有进入规则判断。
- 服务运行但请求超时:检查提供器更新、所选节点、目标规则以及服务器出站网络,不要立刻重装客户端。
- 终端可用、浏览器不可用:检查浏览器与桌面代理设置;环境变量不会自动改变已启动浏览器的网络行为。
- 浏览器可用、终端不可用:检查当前 shell 的变量、工具代理支持以及 sudo 是否过滤环境。
- 重启后失效:区分桌面登录自启与系统开机服务,检查
systemctl is-enabled mihomo,并查看本次启动日志。
收尾时做三项确认:重启后服务能启动;7890 只在预期地址监听;一次明确命中代理规则的请求能在连接记录中找到对应节点。把这三项和实际内核版本一起记录,后续升级或迁移时就能按相同条件复查。更多配置基础可查看入门指南,DNS 与规则概念可对照使用手册。