先选路线:桌面会话还是后台服务
mihomo 是 Clash Meta 项目沿用的内核名称。它负责读取配置、匹配规则和建立连接;图形客户端负责订阅管理、托盘菜单与系统集成。安装一个内核二进制,不会自动出现桌面窗口,也不会自动让所有 Linux 程序走代理。
有 GNOME、KDE 等桌面环境,且需要经常切换节点,优先使用带 mihomo 内核的客户端。通过 SSH 管理服务器、希望退出终端后继续运行,则适合部署独立内核并交给 systemd。两条路线可以使用相近的 YAML 配置,但不要同时占用相同监听端口。
| 项目 | 桌面客户端 | 独立内核与 systemd |
|---|---|---|
| 运行环境 | 图形桌面与用户会话 | 采用 systemd 的主机或虚拟机 |
| 配置入口 | 订阅、配置与连接界面 | YAML 文件、日志与控制 API |
| 启动方式 | 登录桌面后启动,或使用客户端服务 | 系统服务开机启动 |
| 本文接管范围 | 先使用系统代理 | 先提供本机 7890 代理端口 |
路线一:安装 Linux 桌面客户端
确认处理器架构与安装包格式
先在终端执行下面两条命令。x86_64 通常对应下载项中的 x64 或 amd64,aarch64 对应 arm64。CPU 架构与发行版包格式是两项独立条件:选对 DEB,并不代表包内一定是正确的 CPU 架构。
uname -m
cat /etc/os-release
- Debian、Ubuntu 系列:优先选择与发行版兼容的 DEB 包。
- Fedora 系列:选择适配该发行版的 RPM 包,并通过包管理器安装依赖。
- AppImage:需要执行权限;能否直接运行还取决于系统库和 FUSE 支持情况。
可在客户端下载页选择 Linux 安装包。以下命令假设已将本地 DEB 包重命名为 clash-client.deb,并进入其所在目录。它是操作示例,不代表实际发布文件名。
sudo apt install ./clash-client.deb
先验证订阅,再启用系统代理
- 启动客户端,在订阅或配置管理页面导入服务商提供的 Clash YAML 订阅。界面名称随客户端变化,不能把某一款软件的菜单路径套用到全部客户端。
- 选中导入的配置,检查内核启动日志。节点列表非空,并不代表规则、策略组和 DNS 配置全部有效。
- 选择规则模式,在策略组中选择可用节点,记录客户端显示的本地 HTTP 或混合端口。
- 打开客户端的系统代理开关,再用浏览器访问目标站点;同时查看连接列表,确认流量进入了预期策略组。
以 GNOME 桌面为例,也可在「设置」→「网络」→「网络代理」中选择手动方式,将 HTTP 和 HTTPS 代理指向 127.0.0.1 与客户端实际端口。这里配置的是到本地 HTTP 代理的连接,HTTPS 网站通常通过 CONNECT 隧道访问,不需要把代理地址擅自改成 HTTPS。
系统代理主要服务于愿意读取桌面代理设置的应用。终端程序、容器和部分游戏可能不采用这些设置。遇到这类程序,应先显式设置代理或按应用配置,不要把“系统代理已开启”等同于“全机流量已接管”。
路线二:准备 mihomo 二进制与配置目录
从项目发布渠道取得适合 CPU 架构与指令集的 Linux 内核,解压后将可执行文件命名为 mihomo。以下命令在该文件所在目录执行。旧款 x86 处理器还要注意构建的指令集要求,不能仅凭“64 位”判断兼容。
chmod +x ./mihomo
./mihomo -v
sudo install -m 0755 ./mihomo /usr/local/bin/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
如果 mihomo 系统账户已经存在,跳过创建账户这一步,并检查其所属组。发行版的 nologin 路径可能不同,可先运行 command -v nologin 确认。配置目录由 root 管理,运行目录交给服务账户写入,避免让网络服务直接修改自己的完整配置。
先用最小配置确认启动链路
下面是可以用于启动检查的直连配置。它没有代理节点,所有请求都会按最后一条规则直连,不能用它验证远端代理效果。先跑通进程、目录权限和端口监听,再替换成可信来源的完整配置,排错范围更清楚。
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
mixed-port: 7890 在同一个端口接受 HTTP 和 SOCKS 代理连接;-d 指定工作目录,缓存等运行文件通常放在这里;-f 明确指定主配置位置。配置检查通过表示内核能够解析和加载当前配置,不代表所有节点都能连接。
替换为完整订阅配置后,再执行一次 -t。部分配置会引用 GeoIP、GeoSite 或远程规则集,首次检查可能需要获取额外文件。若服务器尚不能访问相应地址,应按该配置要求预置资源,或先使用不依赖这些资源的配置排除启动问题。
编写 systemd 服务:启动、日志与自动恢复
将下面内容保存为 /etc/systemd/system/mihomo.service。该服务以专用账户运行,仅提供普通代理端口,不具备创建 TUN 网卡所需的网络管理权限。不要在尚未理解权限边界时直接改成 root 运行。
[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
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
StateDirectory 管理运行数据目录,ProtectSystem=strict 限制服务修改系统文件,ReadWritePaths 保留运行目录写入权限。配置中若引用家目录下的证书或规则文件,会受到 ProtectHome=true 限制;应将必要文件放入专用目录并授予只读权限,而不是直接取消所有保护。
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl status mihomo --no-pager
sudo journalctl -u mihomo -b -n 80 --no-pager
sudo ss -lntp 'sport = :7890'
正常情况下,服务状态应为 active (running),并能看到本机 7890 端口监听。network-online.target 是启动顺序约束,不保证订阅服务器在那一刻可达;网络故障仍应结合日志判断。若连续启动失败触发频率限制,修复后可执行 sudo systemctl reset-failed mihomo 再启动。
修改配置后的固定操作顺序
- 保留旧配置备份,编辑
/etc/mihomo/config.yaml,避免把含凭据的文件放入公开目录。 - 使用与服务一致的账户、工作目录和
-f参数执行配置检查。 - 检查成功后运行
sudo systemctl restart mihomo,再查看日志与监听端口。
仅修改 YAML 不需要 daemon-reload;修改服务单元才需要。本文没有配置 ExecReload,因此不要依赖 systemctl reload mihomo 完成更新。
验证代理范围:终端、规则与 TUN
服务启动不会替当前 Shell 设置环境变量。先对单个请求显式指定代理,便于把“应用没有使用代理”和“内核转发失败”分开检查。下面请求用于观察连接与 HTTP 响应,不是延迟或速度基准测试。
curl -I --connect-timeout 10 \
--proxy http://127.0.0.1:7890 https://example.com
curl -I --connect-timeout 10 \
--proxy socks5h://127.0.0.1:7890 https://example.com
socks5h 让 curl 将目标域名交给代理端处理,而 socks5 通常先在客户端解析域名。两者可能产生不同的 DNS 路径。最小配置下请求仍然直连;换成包含节点和策略组的配置后,应结合连接记录确认命中的规则与实际出口。
需要给当前终端中支持这些变量的程序使用代理时,可临时设置:
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
# 仅撤销当前 Shell 的这些代理变量
unset http_proxy https_proxy all_proxy no_proxy
并非所有程序都读取相同变量,systemd 服务也不会自动继承交互终端里的 export。若另一项后台服务需要代理,应单独配置该服务的环境,并评估其访问本地资源的排除规则。
接入 Web 面板:控制端口只监听回环地址
Web 面板是控制 API 的前端,不是代理内核。7890 用来转发代理流量,9090 在下面示例中用来管理内核。二者职责不同,不应将 9090 填进浏览器的 HTTP 代理设置。
生成控制密钥并启用 API
以下命令需要系统已安装 OpenSSL,并且当前配置没有同名的 external-controller 或 secret 字段。它会将监听地址和随机生成的密钥追加到配置末尾。若已有这些字段,应编辑原字段,避免重复键。
sudo sh -c '
set -eu
key=$(openssl rand -hex 24)
printf "\nexternal-controller: 127.0.0.1:9090\nsecret: \"%s\"\n" "$key" >> /etc/mihomo/config.yaml
'
sudo -u mihomo /usr/local/bin/mihomo -t \
-d /var/lib/mihomo -f /etc/mihomo/config.yaml
sudo systemctl restart mihomo
sudo ss -lntp 'sport = :9090'
密钥属于管理凭据,不应贴到公开日志或截图中。面板连接参数填写 http://127.0.0.1:9090 与刚生成的密钥。仅绑定回环地址仍应保留认证,因为主机上其他本地进程也可能访问这个端口。
托管本地静态面板
取得与当前内核 API 兼容的面板静态构建产物,解压到 /var/lib/mihomo/ui,确保该目录下直接存在 index.html,并让 mihomo 账户能够读取。随后在 YAML 顶层加入以下配置,检查通过后重启:
external-ui: /var/lib/mihomo/ui
本机浏览器访问 http://127.0.0.1:9090/ui/。面板如果还要求填写后端地址与密钥,使用前述控制 API 参数。只下载面板源代码而没有构建产物,或将文件多套了一层目录,都可能导致页面无法加载。
远程服务器应优先用 SSH 本地端口转发。以下命令中的 proxy-host 表示已经在本机 SSH 配置中建立的服务器别名,需要先将该别名配置为实际主机:
ssh -N -L 19090:127.0.0.1:9090 proxy-host
隧道建立后,本机访问 http://127.0.0.1:19090/ui/,面板后端也填写本机的 19090 地址。服务器端继续保持回环监听,不需要将控制端口开放到公网。隧道并不代替 API 密钥认证,两层保护分别生效。
常见故障:按架构、端口、权限和配置定位
| 现象 | 检查项 | 处理方向 |
|---|---|---|
| Exec format error | uname -m 与 file /usr/local/bin/mihomo | 重新选择匹配架构的二进制,并确认已正确解压。 |
| Illegal instruction | CPU 指令集与发布构建要求 | 选择适配旧 CPU 的兼容构建,不反复重启同一文件。 |
| address already in use | sudo ss -lntp | 检查桌面客户端或旧进程是否占用 7890、9090。 |
| permission denied | 配置可读权限、目录执行权限与服务沙箱 | 按运行账户排查,不将所有目录权限改为 777。 |
| 面板显示 401 | 面板密钥是否与 YAML 一致 | 更新连接凭据,检查是否连到了另一内核实例。 |
| 浏览器正常,命令行失败 | 终端是否显式使用代理 | 用 curl 的 --proxy 单独验证,再配置应用环境。 |
桌面客户端与独立服务同时运行时,还要检查“连接了哪一个内核”。两个实例使用不同端口虽可共存,但客户端显示的节点选择不会自动改变另一个服务的策略。日常使用尽量明确一个主实例,避免在错误的面板里调整配置。
完成部署的判断标准应分四层:进程持续运行、端口按预期监听、应用确实使用该端口、连接命中预期规则与节点。按这个顺序检查,比直接切换 TUN、关闭防火墙或反复重装更容易定位问题。有关配置结构和规则顺序,可继续阅读Clash 配置说明。