先选路线:桌面客户端或独立内核

mihomo 是兼容 Clash 配置体系的代理内核,常见于标注 Clash Meta 的配置与客户端中。内核负责监听代理端口、匹配规则和建立连接;图形客户端另外提供订阅管理、节点选择和系统代理开关。安装内核本身,不会自动出现托盘图标,也不会替浏览器修改代理设置。

使用环境建议路线主要管理方式
GNOME、KDE 等日常桌面支持 Linux 的图形客户端在界面导入订阅、切换规则和节点
通过 SSH 管理的服务器mihomo 二进制配合 systemd编辑 YAML,查看服务日志
容器或精简发行版先确认初始化系统PID 1 不是 systemd 时改用对应进程管理方式

本文的服务方案面向使用 systemd 的常规 Linux 主机,先建立仅本机可用的显式代理。显式代理是指应用主动把请求发给指定端口;它不是透明代理,也不自动接管服务器上的全部连接。

桌面路线:安装 Linux 客户端并导入配置

确认发行版和处理器架构

打开终端,执行下面两条命令。第一条查看发行版,第二条查看内核报告的处理器架构。x86_64 通常对应安装包中的 x64 或 amd64;aarch64 通常对应 arm64。不要因为机器使用 Intel 或 AMD 品牌就下载 ARM 包。

cat /etc/os-release
uname -m
  1. 打开安装包页面,选择提供 Linux 发行包的客户端,例如 Clash Verge Rev 或 FlClash。下载前核对该发行项支持的平台与架构。
  2. Debian、Ubuntu 系列优先选择对应的 DEB 包;Fedora 等发行版选择对应的 RPM 包。AppImage 是否可用取决于发行方是否提供,以及本机的 FUSE 等运行依赖。
  3. 启动客户端,进入其订阅或配置管理页,添加订阅 URL,更新后选中该配置。不同客户端的菜单名称可能是“订阅”或“配置”,不要把节点分享字符串直接当作完整 YAML 文件导入。
  4. 先选择规则模式和可用节点,再打开系统代理。观察连接记录,确认请求确实进入当前客户端。

以已经下载到本机并重命名为 client.deb 的安装包为例,可在所在目录执行 sudo apt install ./client.deb。这里的文件名由用户主动重命名,不是本站安装包地址。RPM 包同理可重命名为 client.rpm,再执行 sudo dnf install ./client.rpm。

区分系统代理与终端代理

在 GNOME 桌面中,可到“设置”→“网络”→“网络代理”检查当前设置,具体入口随桌面版本略有变化。浏览器可能遵守这些设置,但终端里的命令行工具不一定读取它们。先查看客户端实际显示的混合端口;若端口是 7890,可用下文的 curl --proxy 单独验证,而不是反复切换系统开关。

桌面的“登录时启动”和服务器的“开机启动”也不同。前者通常依赖用户进入图形会话;后者可以在无人登录时运行。需要 SSH 连接后立即使用代理的主机,更适合下面的 systemd 方案。

服务器准备:安装二进制与隔离运行账户

先运行 ps -p 1 -o comm=,确认输出为 systemd。随后按 uname -m 的结果取得对应 mihomo Linux 二进制,解压并将文件重命名为 mihomo。x86 发行项还可能区分 CPU 指令集级别;出现 Illegal instruction 时,应回头核对构建要求,而不是给程序增加权限。

以下命令假设终端当前目录中已有解压后的 mihomo 文件。先赋予执行权限,再检查程序能否运行;-v 输出实际安装版本,便于后续记录和回退。

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

这里创建的是专用系统账户,不用于交互登录。如果机器已经存在 mihomo 账户,先用 id mihomo 检查账户和组,再跳过创建步骤。独立账户让配置读取权限和运行数据目录更容易控制;本方案不需要把整个服务改成 root 运行。

  • /usr/local/bin/mihomo:存放内核可执行文件。
  • /etc/mihomo/config.yaml:存放由管理员维护的配置。
  • /var/lib/mihomo:存放运行数据,由后面的 systemd 单元创建并授权。

先用最小 YAML 验证配置与端口

YAML 是通过缩进组织字段的文本配置格式。缩进使用空格,不要使用 Tab。先用下列最小配置建立启动基线:只监听本机 7890 混合端口,同时接受 HTTP 代理与 SOCKS5 连接;全部请求直连,不包含任何代理节点。

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 /tmp -f /etc/mihomo/config.yaml

需要实际分流时,再替换为可信来源提供的完整 mihomo 配置。完整配置通常包含 proxies、proxy-groups 和 rules;规则引用的策略组名称必须存在。只有节点集合的 provider 文件、Base64 节点串和订阅网页,都不等同于可以直接交给 -f 的完整配置。

替换配置后,保留本机监听的安全边界,并重新执行配置检查。订阅 URL 可能包含访问令牌,文件中也可能包含节点凭据,不要把它们贴进公共日志、截图或 shell 历史。实际配置若使用相对路径,本服务会以 /var/lib/mihomo 作为数据目录,需要同时检查规则文件和 provider 文件能否读取。

创建 systemd 服务并设置开机自启

systemd 的服务单元描述进程如何启动、使用哪个账户以及失败后如何处理。把下面内容写入 /etc/systemd/system/mihomo.service。本单元面向普通代理端口,不配置 TUN,也不授予网络管理能力。

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
StateDirectory=mihomo
StateDirectoryMode=0750
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=0077
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict

[Install]
WantedBy=multi-user.target
UNIT

sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl status mihomo --no-pager
systemctl is-enabled mihomo

看到 active (running) 表示进程正在运行;is-enabled 输出 enabled 表示已经加入开机启动。两者要分别确认:服务可能已设置自启,却因配置错误而启动失败。

StateDirectory=mihomo 会创建可写的数据目录。ProtectSystem=strict 限制对其余文件系统的写入,ProtectHome=true 则限制访问用户家目录。因此不要让配置引用 /home 下的订阅文件。需要额外资源时,将它们放入合适的数据目录,并检查归属与权限。

network-online.target 表达网络就绪的启动顺序,但效果还取决于发行版是否启用了对应的等待网络服务;它不保证订阅服务器此刻可达。需要远端下载规则的配置,应结合日志判断是网络等待问题,还是远端资源失效。

修改配置后的操作顺序

sudo -u mihomo /usr/local/bin/mihomo \
  -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
sudo systemctl restart mihomo
sudo journalctl -u mihomo -n 80 --no-pager

只有前一条配置检查成功后,才执行重启。修改 YAML 不需要 daemon-reload;修改服务单元才需要。本示例没有定义 ExecReload,因此不要直接用 systemctl reload mihomo 代替重启。重启会中断现有代理连接,应避开长时间下载或远程任务。

验证请求:监听、HTTP 代理与 SOCKS5

按“进程运行 → 端口监听 → 应用请求 → 规则命中”的顺序排查。先查看 7890 端口;预期监听地址为 127.0.0.1:7890,而不是公网接口。

sudo ss -lntp 'sport = :7890'

curl --proxy http://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 20 \
  -I https://example.com

curl --proxy socks5h://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 20 \
  -I https://example.com

这里的 10 秒是连接超时上限,20 秒是整次请求的时间上限,不是性能测试结果。使用 socks5h 时,目标域名交给代理端解析;socks5 通常由 curl 在本地解析,两者会影响 DNS 排查结论。

最小配置下,请求成功只能证明本地代理链路和直连出口可用。换成实际配置后,还要检查日志中的规则与策略组选择,确认流量没有命中 DIRECT。仅看到 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 --max-time 20 https://example.com

unset http_proxy https_proxy no_proxy

https_proxy 的值仍可使用 http://,表示客户端通过 HTTP 代理建立 CONNECT 隧道,不是把目标 HTTPS 降为明文。环境变量只影响读取这些变量的程序;已经运行的 systemd 服务不会自动继承当前终端的设置。这里使用小写变量,也避免部分工具对大写 HTTP_PROXY 的特殊处理。

常见故障与部署边界

启动失败或不断重启

  • 出现 203/EXEC:检查 ExecStart 路径、文件执行权限,以及二进制架构。不要把尚未解压的压缩文件放到执行路径。
  • 出现 address already in use:用 ss 找出占用 7890 的进程,常见来源是另一套桌面客户端或旧内核。
  • 出现 permission denied:检查配置文件的组是否为 mihomo,以及路径中的每一级目录是否可进入;不要直接把敏感配置改成所有用户可读。
  • 出现 YAML 解析错误:检查缩进、冒号和列表层级,尤其注意网页复制带入的制表符。通过 -t 后再启动。
  • 触发启动频率限制:先修复根因,再执行 sudo systemctl reset-failed mihomo 和 sudo systemctl start mihomo,不要只循环重启。

订阅更新、控制接口与 TUN

独立内核不会自动复制图形客户端的“订阅更新”流程。完整远程配置需要单独安排获取与替换;更新时应先下载到临时文件、限制权限、检查语法,再替换当前配置。配置中的 proxy-providers 可以按其更新间隔刷新节点集合,但这不等于整份主配置也会更新。

本例没有启用 external-controller,因此不会提供管理 API。确需面板时,先规划回环监听、访问密钥和 SSH 隧道,不要把管理端口直接开放到公网。allow-lan: false 配合本机监听,也意味着其他局域网设备不能直接把这台服务器作为代理使用。

TUN 是通过虚拟网卡接管流量的方式,还涉及 /dev/net/tun、路由、DNS 和网络权限。本文的普通账户与加固单元不是 TUN 部署单元,不能只加一行 enable: true 就视为完成。通过 SSH 管理的服务器尤其要先保留管理连接的直连路径,再设计透明接管方案。

升级与停止服务

升级前记录 mihomo -v 的结果,并备份当前二进制和配置。停止服务后再替换二进制,检查新文件的架构、版本和配置兼容性,最后启动并重新执行端口与请求验证。需要取消运行和开机启动时,执行下面的命令即可;它不会删除配置和运行数据。

sudo systemctl disable --now mihomo

最终验收应留下四项结果:配置检查通过、服务处于运行状态、监听地址符合预期、实际应用命中预期规则。桌面用户把重点放在配置选择与系统代理;服务器用户把重点放在账户权限、服务日志与可重复的启动流程。