2026-07-11 03:00 0 条评论

Ubuntu Server 安装 Mihomo 并为 Docker 配置代理

1. 前言

如果机场提供的是 Clash/Mihomo 订阅,并且节点类型包含:

  • anytls
  • vless
  • reality

那么通常不能使用老版 clash,应使用 mihomoclash-meta

典型报错如下:

Parse config error: proxy 0: unsupport proxy type: anytls

这说明内核压根不支持。所以本文使用 Mihomo。


2. 安装 Mihomo

先确认服务器架构:

uname -m

常见为 x86_64

下载 mihomo

cd /usr/local/bin
wget -O mihomo.gz https://github.com/MetaCubeX/mihomo/releases/download/v1.19.28/mihomo-linux-amd64-compatible-v1.19.28.gz
gunzip mihomo.gz
chmod +x mihomo
/usr/local/bin/mihomo -v

3. 准备配置目录

这里以 /opt/clash 为例:

mkdir -p /opt/clash

将机场提供的 Clash/Mihomo 配置保存为:

/opt/clash/config.yaml

或:

/opt/clash/config.yml

Mihomo 启动时会在指定目录中读取配置文件。

注意:有些机场给的订阅地址拉下来是一堆 Base64 编码的节点列表,这种情况就需要将它先导入 Clash 软件,然后在把生成的配置文件拿去给服务器用。


4. 测试配置文件

正式启动前,先测试配置是否合法:

/usr/local/bin/mihomo -t -d /opt/clash

如果通过,说明配置文件可以被当前 Mihomo 正常解析。


5. 配置 systemd 服务

创建服务文件:

nano /etc/systemd/system/clash.service

写入以下内容:

[Unit]
Description=Clash daemon
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /opt/clash
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

加载并启动服务:

systemctl daemon-reload # 重载设置
systemctl enable --now clash # 启动 Mihomo 并设置开机自启动
systemctl status clash # 查看运行状态

查看是否设置为开机自启:

systemctl is-enabled clash

如果输出 enabled,说明重启服务器后 Mihomo 会自动启动。


6. 常见配置示例

一个可用的基础配置通常包含:

mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: 127.0.0.1:9090

说明如下:

  • mixed-port: 7890:HTTP/SOCKS 混合代理端口
  • allow-lan: true:允许局域网访问
  • bind-address: '*':监听所有地址
  • external-controller: 127.0.0.1:9090:本机控制接口

如果只需要本机控制接口,保留 127.0.0.1:9090 更安全。


7. 验证 Mihomo 是否正常工作

查看监听端口:

ss -lntp | grep 7890
ss -lntp | grep 9090

本机强制通过代理测试:

curl -I -x http://127.0.0.1:7890 https://www.google.com
curl -I -x http://127.0.0.1:7890 https://api.openai.com

如果成功,说明:

  • Mihomo 正在监听
  • 至少有一个节点可用
  • 代理功能正常

查看日志:

journalctl -u clash -n 100 --no-pager

实时查看日志:

journalctl -u clash -f

8. 查看当前使用的节点

Mihomo 提供了控制接口:

external-controller: 127.0.0.1:9090

可以通过 API 查看代理组和当前节点:

curl http://127.0.0.1:9090/proxies

返回结果中重点关注主代理组,例如:

"TaiShan Net": {
  "type": "Selector",
  "now": "自动选择"
}

如果主组选中的是另一个组,例如 自动选择,还需要继续查询该组:

curl http://127.0.0.1:9090/proxies/自动选择

如果安装了 jq,查看更方便:

curl -s http://127.0.0.1:9090/proxies | jq '.proxies["TaiShan Net"]'
curl -s http://127.0.0.1:9090/proxies | jq '.proxies["自动选择"]'

9. Shell 临时代理与永久代理

临时代理写法:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890

这只对当前 shell 会话有效。退出终端、重新登录或重启服务器后会失效。

如果希望当前用户登录后自动生效,可以写入:

~/.bashrc

例如:

echo 'export http_proxy=http://127.0.0.1:7890' >> ~/.bashrc
echo 'export https_proxy=http://127.0.0.1:7890' >> ~/.bashrc
echo 'export all_proxy=socks5://127.0.0.1:7890' >> ~/.bashrc
source ~/.bashrc

10. 让 Docker 使用代理

Docker 代理分两层:

  1. Docker daemon 拉镜像使用代理
  2. 容器内应用运行时使用代理

这两者需要分别配置。本文只介绍第一种


11. Docker daemon 使用代理

创建 Docker 的 systemd 覆盖配置:

mkdir -p /etc/systemd/system/docker.service.d
nano /etc/systemd/system/docker.service.d/http-proxy.conf

写入:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="ALL_PROXY=socks5://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1"

重载并重启 Docker:

systemctl daemon-reload
systemctl restart docker

确认生效:

systemctl show --property=Environment docker

测试拉镜像:

docker pull hello-world

说明:

  • 这里使用 127.0.0.1:7890,因为 Docker daemon 运行在宿主机上
  • 该配置主要影响 docker pull

评论

欢迎留下你的看法

0