先选部署路线:服务器用内核,桌面按需用客户端
在 Linux 上运行 Clash,不一定要安装图形界面。mihomo 是兼容 Clash 配置体系、继续扩展协议与规则能力的内核,早期常见名称是 Clash Meta。它负责读取配置、监听代理端口和处理连接;订阅管理窗口、托盘图标与开关面板通常由图形客户端提供。
本文采用“独立 mihomo 二进制 + 系统级 systemd 服务”的路线,适合 SSH 登录的服务器、开发机和需要常驻代理的桌面发行版。配置文件放在 /etc/mihomo/config.yaml,运行数据放在 /var/lib/mihomo,本机 HTTP/SOCKS 混合端口使用 7890。
- 无桌面服务器:优先采用本文方案,通过命令和日志维护,不必安装桌面环境。
- 日常桌面电脑:需要频繁切换节点、编辑规则时,可选择图形客户端,让客户端管理自己的内核。
- 已有客户端:先检查它是否正在监听 7890;两个内核不能同时绑定相同地址和端口。
确认系统架构,安装 mihomo 二进制
1. 检查 systemd 和 CPU 架构
ps -p 1 -o comm=
uname -m
command -v curl
command -v gzip
第一条命令应显示 systemd。如果运行在容器、精简系统或尚未启用 systemd 的环境中,后文的 systemctl 命令不能直接套用,需要改用该环境的进程管理方式。
| 架构输出 | 发布资产选择 | 注意事项 |
|---|---|---|
x86_64 | Linux amd64,优先选择 v1 兼容级别 | v1、v2、v3 属于 CPU 指令集兼容级别,不是客户端版本号。 |
aarch64 | Linux arm64 | 常见于 ARM 云服务器和运行 64 位系统的开发板。 |
armv7l | 匹配设备的 Linux armv7 资产 | 需结合硬件与发布说明确认,不能用 arm64 文件代替。 |
Debian、Ubuntu 缺少工具时,可执行 sudo apt update && sudo apt install curl gzip ca-certificates;Fedora 可执行 sudo dnf install curl gzip ca-certificates。以下下载命令使用 Bash。
2. 下载与安装
打开 mihomo 官方发布页,选择稳定发布中的对应架构 .gz 二进制资产,复制该资产的完整 HTTPS 下载链接。不要把发布页地址或源代码压缩包当成二进制链接。下面的提示会读取链接,避免将示例版本号写死。
mkdir -p "$HOME/mihomo-install"
cd "$HOME/mihomo-install"
read -r -p '粘贴官方 Linux .gz 资产的 HTTPS 链接:' download_url
curl --fail --location --proto '=https' \
--output mihomo.gz "$download_url"
unset download_url
gzip -t mihomo.gz
gzip -dc mihomo.gz > mihomo
chmod 0755 mihomo
./mihomo -v
sudo install -m 0755 mihomo /usr/local/bin/mihomo
/usr/local/bin/mihomo -v
逐条执行并确认成功后再继续。-v 输出可以确认内核版本和架构。若出现 Exec format error,通常是架构选错;若出现 Illegal instruction,应检查 CPU 指令集要求,amd64 设备可重新选择兼容级别较低的资产。
服务器无法访问发布站点时,可以先在工作电脑下载,把文件命名为 mihomo.gz,通过 SFTP 上传到服务器的安装目录,再从 gzip -t 这一步继续。不要为了下载而临时关闭 TLS 证书验证。
建立运行账户,先用最小配置验证监听
内核不需要以 root 身份运行普通的 7890 代理端口。创建专用系统账户,把配置与可写数据分开,能减少误操作的影响。以下以提供 useradd 的常见发行版为例;若账户已存在,先用 id mihomo 确认,不要重复创建。
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
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
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
-f 明确指定读取哪个文件,-d 指定内核运行数据目录。相对路径的数据文件、缓存与 provider 文件应结合该目录检查;不要假设内核始终从当前终端目录读取配置。配置测试能发现大量语法和引用问题,但不能替代实际的节点连接测试。
编写 systemd 服务,设置开机启动
服务文件统一使用绝对路径,并固定运行账户。下面的保护选项适用于本机显式代理方案;它允许内核写入数据目录,但不允许服务随意改写系统目录。
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=5s
UMask=0027
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
sudo ss -lntp 'sport = :7890'
正常情况下,服务状态为 active (running),7890 监听在 127.0.0.1。enable 设置开机启动,--now 同时立即启动。network-online.target 的实际等待效果取决于发行版网络管理器和 wait-online 服务,并不保证外部站点一定可达。
- 修改配置后:先运行前面的
mihomo -t,通过后执行sudo systemctl restart mihomo。 - 修改服务文件后:先执行
sudo systemctl daemon-reload,再重启服务。 - 实时看日志:执行
sudo journalctl -u mihomo -f,按 Ctrl+C 只会退出日志查看,不会停止服务。 - 停止并取消开机启动:执行
sudo systemctl disable --now mihomo。
本文没有配置 ExecReload,因此不要把 systemctl reload mihomo 当作通用更新命令。采用重启会短暂中断经过该进程的现有连接,远程任务应避开更新窗口。
导入订阅:先区分完整配置和节点列表
“订阅地址”不一定返回相同格式。完整 Clash/mihomo 配置通常包含 proxies 或 proxy-providers、proxy-groups 与 rules。仅包含节点的 provider YAML、Base64 节点集合和单条分享链接,不能直接当作本文的主配置文件。
安全替换完整配置
如果服务提供的是完整 mihomo 配置,先下载到临时文件,再检查和测试。下面在交互式 Bash 中隐藏订阅输入,避免把带令牌的 URL 直接写入命令历史;临时文件退出时会清理。服务端访问日志和本机高权限用户仍可能看到相关信息,不要把订阅当成公开链接。
(
umask 077
tmp=$(mktemp) || exit 1
trap 'rm -f "$tmp"' EXIT
read -r -s -p '粘贴完整配置订阅的 HTTPS 地址:' sub_url
printf '\n'
curl --fail --location --proto '=https' \
--output "$tmp" "$sub_url" || exit 1
unset sub_url
sudo install -o root -g mihomo -m 0640 \
"$tmp" /etc/mihomo/config.next.yaml || exit 1
sudoedit /etc/mihomo/config.next.yaml
sudo -u mihomo /usr/local/bin/mihomo -t \
-d /var/lib/mihomo \
-f /etc/mihomo/config.next.yaml || exit 1
sudo cp -p /etc/mihomo/config.yaml /etc/mihomo/config.previous.yaml || exit 1
sudo mv /etc/mihomo/config.next.yaml /etc/mihomo/config.yaml || exit 1
sudo systemctl restart mihomo
)
在编辑器中确认 mixed-port: 7890、allow-lan: false 与 bind-address: 127.0.0.1。检查配置中的外部控制接口、DNS 监听、TUN 开关和本地文件路径;本方案不需要对外控制接口或 DNS 监听,也不启用 TUN。删除或关闭这些非必要设置后再测试。
规则引用的策略组名称必须真实存在,组内节点也必须能找到。遇到规则数据库或 provider 文件下载失败,应查看日志中的具体 URL 和错误;不要只因为 YAML 可以解析,就判断订阅已可用。若配置要求从用户家目录读取文件,本文服务的 ProtectHome=true 会阻止访问,应把所需文件迁到数据目录并调整路径。
节点 provider 与自动更新的边界
proxy-providers 可以通过自己的 url、path 和 interval 更新节点,例如 interval: 3600 表示间隔 3600 秒。它更新的是对应 provider,不会自动替换主配置中的全部规则与策略组。provider 的相对保存路径应落在可写数据目录内。
如果希望周期性更新完整主配置,应另行设计下载、语法测试、备份、替换和失败回退流程,再用 systemd timer 调度。不要用一条定时下载命令直接覆盖正在使用的 config.yaml。订阅拉取失败时,保留上一份可用配置通常比重启到空文件更稳妥。
设置终端代理变量,分别测试 HTTP 与 SOCKS
systemd 服务启动成功,只说明内核在运行,不会自动让所有终端程序走代理。先用显式参数测试,排除环境变量干扰。以下请求使用公开站点作为连通性示例,并非实测结果;具体耗时和出口取决于你的网络、规则与节点。
curl --noproxy "" --proxy http://127.0.0.1:7890 \
--connect-timeout 10 --max-time 30 \
-I https://www.kernel.org/
curl --noproxy "" --proxy socks5h://127.0.0.1:7890 \
--connect-timeout 10 --max-time 30 \
-I https://www.kernel.org/
socks5h 让 curl 把目标域名交给 SOCKS 代理解析;socks5 通常先在应用端解析。HTTP 代理访问 HTTPS 站点时通常使用 CONNECT 隧道,因此代理地址仍写 http://127.0.0.1:7890,不是把代理入口改成 HTTPS。
仅为当前终端启用
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5h://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,::1
curl --connect-timeout 10 --max-time 30 -I https://www.kernel.org/
环境变量只传给当前 shell 后续启动的子进程,不会改变已经运行的应用,也不会自动进入其他 systemd 服务。不同程序对变量大小写和优先级的支持不同,curl 的 HTTP 代理应使用小写 http_proxy。需要长期生效时,可将上述设置写入当前用户的 ~/.bashrc 或对应 shell 配置,但要接受“代理服务停止后相关命令也可能失败”的结果。
sudo 默认经常会过滤代理变量,不要把普通用户下的测试成功等同于所有管理命令都已配置。另一个 systemd 服务若需要代理,应通过它自己的 drop-in 设置 Environment=,并确认该应用确实支持这些变量。
恢复直连环境
unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
git config --global --get http.proxy
Git 还可能存在独立的全局代理配置。最后一条命令用于检查;确认旧配置不再需要后,再执行 git config --global --unset http.proxy。仅清除环境变量不会删除应用自己保存的代理设置。
服务运行却不能联网:按四层排查
- 进程层:运行
systemctl status mihomo。若不断重启,优先看journalctl中首次退出前的错误,不要只看最后一行“重启次数过多”。 - 监听层:运行
sudo ss -lntp 'sport = :7890'。没有监听通常是启动失败或端口配置不同;出现address already in use时,检查是否另有客户端或手工启动的内核。 - 代理层:用带
--proxy的 curl 请求测试。连接被拒绝先查本机端口;握手超时再查节点、服务器出站限制和协议兼容性。 - 规则层:检查日志中的匹配规则与选中策略。HTTP 返回成功只代表请求完成;若仍是
MATCH,DIRECT,并不能证明代理节点正在工作。
配置测试报 permission denied 时,检查 /etc/mihomo 的目录执行权限、文件所属组,以及 provider 是否写入了只读路径。若 systemd 报 start-limit-hit,先修正根因,再执行 sudo systemctl reset-failed mihomo 和 sudo systemctl start mihomo。
远程 SSH 会话内的 127.0.0.1 指服务器自身,不是你的工作电脑。本文不需要在云安全组放行 7890。若只想临时让工作电脑使用服务器代理,可在工作电脑运行 ssh -N -L 17890:127.0.0.1:7890 服务器登录目标,其中最后一项替换为日常使用的 SSH 登录目标;随后把电脑应用的代理设置为 127.0.0.1:17890。
桌面发行版与 TUN:不要混用两套接管方式
GNOME 桌面可在「设置」→「网络」→「网络代理」中选择手动配置,将 HTTP 与 HTTPS 代理主机设为 127.0.0.1、端口设为 7890。不同发行版的菜单译名可能略有差异。桌面代理设置只影响遵循该设置的应用,不能保证终端、游戏和后台服务都使用代理。
如果改用图形客户端管理订阅与节点,建议先停用本文的独立服务,再让客户端启动自己的内核。这样端口、配置来源和日志入口各只有一套,更容易排查。“图形客户端的系统代理开关”与“systemd 内核服务启动”是两件事,不能相互替代。
何时再考虑 TUN
- 目标应用不支持显式代理,或确实需要接管更广泛的流量时,再评估 TUN。
- 先检查
/dev/net/tun是否存在,以及容器或宿主机是否允许创建虚拟网卡。 - 本文非特权服务没有授予配置网卡与路由所需的权限,直接增加
tun.enable并不够。 - 如需使用 Linux capabilities,应按实际功能评估
CAP_NET_ADMIN等权限,并同步审查 systemd 限制,不要直接取消所有保护。 - 自动路由、策略路由与 DNS 劫持必须一起验证;保留第二条 SSH 会话和云控制台入口,再修改远程服务器网络。
至此,部署的验收标准应是:配置测试通过、服务可随开机启动、7890 仅在本机监听、显式代理请求成功,并且日志显示连接确实命中了预期策略。先完成这条链路,再增加自动更新或 TUN,问题会更容易定位。