使用 Systemd 部署 Mihomo
使用 Systemd 部署 Mihomo
一、安装内核与准备配置
在将 mihomo 交给 systemd 管理前,需要先把它的”骨架”搭建好。
-
下载并安装 mihomo 内核: 从 mihomo 的官方发布页面下载对应你系统架构(如
linux-amd64)的压缩包。解压后,将二进制文件复制到系统的程序目录并赋予执行权限:Terminal window # 假设你已经将文件解压并重命名为 mihomosudo cp mihomo /usr/local/bin/sudo chmod +x /usr/local/bin/mihomo -
创建配置目录和文件: mihomo 默认会从
/etc/mihomo目录读取配置。Terminal window sudo mkdir -p /etc/mihomo然后,你需要创建一个核心配置文件
/etc/mihomo/config.yaml。你可以将从你的服务商获取的订阅链接内容,或一个基础的配置文件模板放入其中 。
二、创建 systemd 配置文件
创建 systemd 配置文件 /etc/systemd/system/mihomo.service:
sudo vim /etc/systemd/system/mihomo.service然后,粘贴以下配置内容:
[Unit]Description=mihomo Daemon# 等待网络完全就绪后再启动,避免启动时网络不可用After=network-online.targetWants=network-online.target
[Service]# 以普通用户身份运行,最小权限原则User=mihomoGroup=mihomo
# 资源限制Type=simpleLimitNPROC=500LimitNOFILE=1000000
# 官方推荐#CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE#AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE
# 限制:仅保留运行TUN模式和绑定低端口所必需的能力# 移除了高危的 CAP_DAC_OVERRIDE, CAP_SYS_PTRACE 等CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICEAmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE
# 启用一系列安全沙箱选项,进一步隔离服务NoNewPrivileges=yesPrivateTmp=yesProtectSystem=strict# 允许写入的数据目录(如缓存、持久化连接)ReadWritePaths=/var/lib/mihomo# 允许写入内核文件所在目录,以便面板能够更新内核ReadWritePaths=/usr/local/bin# 允许写入配置文件所在目录,以便面板能够更新配置ReadWritePaths=/etc/mihomoProtectHome=yesProtectKernelTunables=yesProtectKernelModules=yesProtectControlGroups=yes
# 服务行为Restart=alwaysExecStart=/usr/local/bin/mihomo -d /etc/mihomoExecReload=/bin/kill -HUP $MAINPID
[Install]WantedBy=multi-user.target配置解读:
- [Unit] 单元描述与依赖
| 配置项 | 设置值 | 作用/解释 |
|---|---|---|
Description | mihomo Daemon | 服务的简要描述,便于管理员识别。 |
After | network-online.target | 声明此服务应在网络完全就绪的 target 之后启动,避免启动时网络不可用导致失败。 |
Wants | network-online.target | 表示希望 network-online.target 被激活,但并不严格要求其成功;通常与 After 配合使用以确保网络已配置好。 |
- [Service] 服务运行定义
| 配置项 | 设置值 | 作用/解释 |
|---|---|---|
| 用户与组 | ||
User | mihomo | 以非特权系统用户 mihomo 的身份运行服务,避免使用 root 账户,实现最小权限原则。 |
Group | mihomo | 服务运行时所属的组,同样为非特权组。 |
| 服务类型与资源限制 | ||
Type | simple | 默认类型,表示 ExecStart 启动的进程就是主进程,systemd 会将其作为服务的主控进程。 |
LimitNPROC | 500 | 限制服务及其子进程的最大进程/线程数为 500。 |
LimitNOFILE | 1000000 | 限制文件描述符数量为 100 万,满足高并发网络连接需求。 |
| Linux Capabilities(能力集) | ||
CapabilityBoundingSet | CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE | 限制进程可拥有的能力边界,超出此集合的能力即使通过 exec 也无法获得。此处仅保留网络管理、原始套接字和绑定特权端口所需的能力。 |
AmbientCapabilities | 同上 | 在 exec 后仍保留上述能力,使得非 root 用户启动的进程也能保持这些能力。 |
| 安全沙箱选项 | ||
NoNewPrivileges | yes | 禁止进程及其子进程通过 execve 获得新特权(如通过 setuid 或文件系统能力),即使文件有 suid 位也无效,增强安全性。 |
PrivateTmp | yes | 为服务创建独立的临时文件空间 /tmp 和 /var/tmp,与其他进程隔离,防止临时文件信息泄露。 |
ProtectSystem | strict | 以最严格模式保护系统文件:将 /usr、/boot、/etc 挂载为只读,服务无法修改这些关键系统目录。 |
ReadWritePaths | /var/lib/mihomo | 在 ProtectSystem=strict 下,允许服务对指定目录(如数据目录)拥有写入权限。 |
ReadWritePaths | /usr/local/bin | 允许面板更新内核文件 |
ProtectHome | yes | 将 /home、/root 和 /run/user 挂载为不可访问(返回空或隐藏),保护用户隐私数据。 |
ProtectKernelTunables | yes | 禁止修改内核可调参数(/sys/...、/proc/sys/...),防止内核配置被篡改。 |
ProtectKernelModules | yes | 禁止加载或卸载内核模块,防止内核模块攻击。 |
ProtectControlGroups | yes | 禁止修改 cgroup(控制组)配置,防止资源隔离被破坏。 |
| 服务行为 | ||
Restart | always | 无论退出原因(正常退出或异常崩溃),服务总是自动重启,确保高可用性。 |
ExecStart | /usr/local/bin/mihomo -d /etc/mihomo | 启动 mihomo 主程序,-d 指定配置目录为 /etc/mihomo。 |
ExecReload | /bin/kill -HUP $MAINPID | 当执行 systemctl reload mihomo 时,向主进程发送 HUP 信号,触发配置重载(需 mihomo 支持)。 |
- [Install] 安装与自启
| 配置项 | 设置值 | 作用/解释 |
|---|---|---|
WantedBy | multi-user.target | 表示该服务应在系统进入多用户运行级别(通常为正常启动后)时自动启动。 |
三、创建用户与启动服务
配置文件写好后,需要创建对应的用户并启动服务。
-
创建专用的系统用户: 执行以下命令创建
mihomo用户和组。--system表示创建系统用户,--no-create-home表示不创建 home 目录(我们用不到)。Terminal window sudo groupadd --system mihomosudo useradd --system --gid mihomo --no-create-home --shell /usr/sbin/nologin mihomo -
设置配置目录的权限: 确保
mihomo用户能读取配置文件。Terminal window sudo chown -R root:mihomo /etc/mihomosudo chmod 750 /etc/mihomo如果你的服务配置了
ReadWritePaths=/var/lib/mihomo,还需要创建该目录并授予权限:Terminal window sudo mkdir -p /var/lib/mihomosudo chown mihomo:mihomo /var/lib/mihomosudo chmod 750 /var/lib/mihomosudo chown mihomo:mihomo /usr/local/bin/mihomosudo chmod 755 /usr/local/bin/mihomo -
启动服务并设置开机自启: 现在,可以通知 systemd 重载配置,并启动服务了。
Terminal window # 重新加载 systemd 管理器配置sudo systemctl daemon-reload# 设置开机自启sudo systemctl enable mihomo# 立即启动服务sudo systemctl start mihomo
四、日常管理与维护
服务运行起来后,你可以通过以下命令来管理它:
-
查看状态:
Terminal window sudo systemctl status mihomo -
查看日志:
Terminal window sudo journalctl -u mihomo -f -n 50-f表示实时跟踪,-n 50表示显示最后50行日志。 -
停止/重启:
Terminal window sudo systemctl stop mihomosudo systemctl restart mihomo -
重新加载配置(发送
HUP信号): 修改了config.yaml后,可以优雅地重载配置而不用中断服务 。Terminal window sudo systemctl reload mihomo# 或者sudo kill -HUP $(pidof mihomo)
五、自动部署管理面板(可选)
mihomo 支持在启动时自动下载并部署 Web 管理面板(如 MetaCubeXD),让你可以通过浏览器直观地查看日志、切换节点、测试延迟等。只需在配置文件中添加几行配置,mihomo 就会在启动时自动完成面板的下载、解压和挂载。
1. 修改核心配置文件
编辑 /etc/mihomo/config.yaml,在适当位置(通常在 external-controller 相关配置段)添加以下三行:
external-controller: 0.0.0.0:9090 # 必须:开启外部控制 API,监听所有网卡的 9090 端口external-ui: ui # 指定存放面板文件的目录名(相对路径,相对于工作目录 /etc/mihomo)external-ui-url: "https://ghproxy.cn/github.com/MetaCubeX/metacubexd/archive/gh-pages.zip" # 面板的下载地址配置说明:
external-controller:开启 RESTful API,mihomo 会监听此地址,供面板调用。external-ui:面板静态文件的存放目录。此处使用相对路径ui,即 mihomo 将在工作目录/etc/mihomo下创建ui文件夹。external-ui-url:面板压缩包的下载链接。mihomo 启动时会自动从该地址下载并解压到ui目录。
2. 确保面板目录可写
由于 external-ui 指定的目录(/etc/mihomo/ui)需要由 mihomo 用户创建和写入文件,因此必须确保该用户对 /etc/mihomo 目录有写入权限。
在之前配置的 systemd 服务中,我们启用了严格的安全保护(ProtectSystem=strict),默认会将 /etc 挂载为只读。为了让 mihomo 能在 /etc/mihomo 下创建 ui 文件夹并写入面板文件,有两种解决方案:
方案 A(推荐):修改 systemd 服务,允许写入 /etc/mihomo
编辑 /etc/systemd/system/mihomo.service,在 [Service] 部分的 ReadWritePaths 中添加一行:
ReadWritePaths=/etc/mihomo修改后执行:
sudo systemctl daemon-reload这样既保留了大部分系统目录的只读保护,又单独放行了配置目录。
方案 B(更安全):将面板目录指向已有可写路径
如果你不希望放宽对 /etc 的保护,可以将 external-ui 设置为一个已经允许写入的绝对路径,例如 /var/lib/mihomo/ui。
external-ui: /var/lib/mihomo/ui并确保该目录存在且属主为 mihomo:
sudo mkdir -p /var/lib/mihomo/uisudo chown mihomo:mihomo /var/lib/mihomo/uisudo chmod 750 /var/lib/mihomo/ui注意:/var/lib/mihomo 已在之前的 systemd 配置中通过 ReadWritePaths 开放了写入权限,因此无需修改服务文件。
3. 防火墙放行 9090 端口
面板需要通过 9090 端口访问,请确保防火墙允许外部设备连接该端口。
如果使用 firewalld:
sudo firewall-cmd --permanent --add-port=9090/tcpsudo firewall-cmd --reload如果使用 ufw:
sudo ufw allow 9090/tcp4. 重启服务并验证
重新加载配置并重启 mihomo 服务(reload 可能不会触发面板下载,建议直接 restart):
sudo systemctl restart mihomo查看日志,确认面板是否下载成功:
sudo journalctl -u mihomo -f -n 50如果日志中出现类似以下信息,说明面板已自动部署:
... downloading ui from https://ghproxy.cn/github.com/MetaCubeX/metacubexd/archive/gh-pages.zip ...... extracted ui to /etc/mihomo/ui5. 访问面板
在浏览器中输入 http://<你的Linux设备IP>:9090/ui,即可打开管理面板。首次访问时,面板可能需要与 mihomo 建立连接,请确保 API 地址正确(默认为面板所在设备的 <你的Linux设备IP>:9090)。
6.故障排查
- 面板无法访问:检查防火墙是否放行 9090 端口;确认
external-controller配置正确且 mihomo 正常运行。 - 面板未自动下载:检查
external-ui-url是否可访问(可手动在服务器上用curl -I测试);确认mihomo用户对目标目录有写入权限;查看日志中是否有权限错误或下载失败信息。 - 手动部署面板:如果自动下载失败,可以手动从 MetaCubeX/metacubexd 仓库下载
gh-pages.zip,解压到指定的ui目录(确保index.html等文件直接位于目录内),然后重启服务。