Mihomo 代理服务配置完整指南

4 阅读4分钟

Mihomo 代理服务配置完整指南

记录在 CentOS 服务器上配置 Mihomo 代理服务的完整过程,包括安装、配置、开机自启和日常使用。

目录

环境信息

项目信息
操作系统CentOS / Alibaba Cloud Linux
核心程序Mihomo (MetaCubeX/mihomo)
配置目录~/.config/mihomo/
HTTP 代理端口7890
SOCKS5 端口7891
API 控制端口9090

安装 Mihomo

1. 下载二进制文件

# 下载最新版本(根据实际架构选择)
wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.20/mihomo-linux-amd64-v1.19.20.gz

# 解压并安装
gunzip mihomo-linux-amd64-v1.19.20.gz
sudo mv mihomo-linux-amd64-v1.19.20 /usr/local/bin/mihomo
sudo chmod +x /usr/local/bin/mihomo

# 验证安装
mihomo -v

2. 创建配置目录

mkdir -p ~/.config/mihomo
cd ~/.config/mihomo

配置文件

基础配置 (config.yaml)

yaml

# 基础代理端口
port: 7890
socks-port: 7891
redir-port: 7892
mixed-port: 7893
allow-lan: false
mode: rule
log-level: info
external-controller: '0.0.0.0:9090'

# GeoIP 配置(关键!解决GEOIP下载失败的问题,从本地读取.dat文件)
geodata-mode: true

# DNS 配置
dns:
  # 订阅文件内容

# 代理节点(从订阅文件获取,或直接写入)
proxies:
  # 节点配置...

# 代理组
proxy-groups:
  - name: "🚀默认节点"
    type: select
    proxies:
      - "🇭🇰 香港01-Air"
      # ... 更多节点

# 规则
rules:
  # 规则配置...
  - 'GEOIP,CN,🚫不走代理'
  - 'MATCH,🚀默认节点'

解决 GeoIP 数据库问题

问题现象

启动时出现以下错误:

text

ERRO can't initial GeoIP: can't download MMDB: context deadline exceeded
WARN MMDB invalid, remove and download

解决方案

步骤一:手动下载正确的数据库文件

本地从以下链接下载,上传到服务器

https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat
https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat

步骤二:配置文件中禁用自动下载

在 config.yaml 中添加:

yaml

geodata-mode: true      # 使用 dat 格式而非 mmdb

关键点

  • geodata-mode: true 让 Mihomo 使用 .dat 格式的数据库
  • 配合本地下载的 geoip.dat 和 geosite.dat 文件
  • 设置后不会再尝试自动下载

启动与测试

前台启动(调试用)

mihomo -d ~/.config/mihomo

正常启动日志示例

INFO[xxxx] Start initial configuration in progress
INFO[xxxx] Geodata Loader mode: memconservative
INFO[xxxx] Load GeoIP rule: cn
INFO[xxxx] Finished initial GeoIP rule cn => records: 8621
INFO[xxxx] Initial configuration complete, total time: 8ms
INFO[xxxx] RESTful API listening at: [::]:9090
INFO[xxxx] HTTP proxy listening at: 127.0.0.1:7890
INFO[xxxx] SOCKS proxy listening at: 127.0.0.1:7891

测试代理

# 测试 HTTP 代理
curl -x http://127.0.0.1:7890 https://www.google.com -I

# 测试 SOCKS5 代理
curl -x socks5://127.0.0.1:7891 https://www.google.com -I

# 查看 API 状态
curl http://127.0.0.1:9090/version

开机自启

创建 systemd 服务

sudo tee /etc/systemd/system/mihomo.service > /dev/null <<EOF
[Unit]
Description=mihomo Daemon
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/mihomo -d /root/.config/mihomo
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target
EOF

启用服务

# 重新加载配置
sudo systemctl daemon-reload

# 设置开机自启
sudo systemctl enable mihomo

# 立即启动
sudo systemctl start mihomo

# 查看状态
sudo systemctl status mihomo

服务管理命令

sudo systemctl start mihomo   # 启动
sudo systemctl stop mihomo    # 停止
sudo systemctl restart mihomo # 重启
sudo systemctl status mihomo  # 状态
sudo journalctl -u mihomo -f  # 查看日志

命令行代理管理

设置别名

在 ~/.bashrc 中添加:

# 代理开关
alias proxy='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:7891; echo "✅ 代理已开启"'
alias unproxy='unset http_proxy; unset https_proxy; unset all_proxy; echo "❌ 代理已关闭"'

# 查看当前 IP
alias myip='curl -s https://ip.sb'

生效配置

source ~/.bashrc

使用方式

proxy    # 开启代理
unproxy  # 关闭代理
myip     # 查看当前 IP

节点切换

通过 API 切换

# 查看当前节点
curl -s http://127.0.0.1:9090/proxies/🚀默认节点 | jq -r '.now'

# 切换到指定节点
curl -X PUT http://127.0.0.1:9090/proxies/🚀默认节点 \
  -H "Content-Type: application/json" \
  -d '{"name": "🇭🇰 香港01-Air"}'

创建节点管理脚本

sudo tee /usr/local/bin/node-manager > /dev/null << 'EOF'
#!/bin/bash

API="http://127.0.0.1:9090"
GROUP="🚀默认节点"

case "$1" in
    list)
        echo "===== 可用节点 ====="
        curl -s "$API/proxies/$GROUP" | \
            python3 -c "
import sys, json
try:
    data = json.load(sys.stdin)
    for i, node in enumerate(data.get('all', []), 1):
        marker = '👉 ' if node == data.get('now') else '   '
        print(f'{marker}{i:2}. {node}')
except:
    print('API 连接失败')
" 2>/dev/null
        ;;
    current)
        curl -s "$API/proxies/$GROUP" | \
            python3 -c "import sys,json; print(json.load(sys.stdin).get('now', '未知'))" 2>/dev/null
        ;;
    switch)
        if [ -z "$2" ]; then
            echo "用法: node-manager switch <节点名称>"
            exit 1
        fi
        curl -s -X PUT "$API/proxies/$GROUP" \
            -H "Content-Type: application/json" \
            -d "{"name": "$2"}" > /dev/null
        echo "✅ 已切换到: $2"
        ;;
    *)
        echo "用法: node-manager {list|current|switch}"
        ;;
esac
EOF

chmod +x /usr/local/bin/node-manager

使用示例

node-manager list              # 列出所有节点
node-manager current           # 查看当前节点
node-manager switch "🇭🇰 香港01-Air"  # 切换节点

常用命令速查

操作命令
启动服务sudo systemctl start mihomo
停止服务sudo systemctl stop mihomo
重启服务sudo systemctl restart mihomo
查看状态sudo systemctl status mihomo
查看日志sudo journalctl -u mihomo -f
开启代理proxy
关闭代理unproxy
查看节点node-manager list
切换节点node-manager switch "节点名"
测试代理curl -x http://127.0.0.1:7890 https://www.google.com -I

故障排除

问题 1:端口被占用

# 查看端口占用
netstat -tlnp | grep -E "7890|7891|9090"

# 杀掉占用进程
kill -9 <PID>

问题 2:配置文件语法错误

# 验证配置
mihomo -d ~/.config/mihomo -check

问题 3:订阅下载失败

# 手动下载订阅文件
curl -o ~/.config/mihomo/proxies.yaml "订阅链接"

# 修改配置使用本地文件
proxy-providers:
  my_subscription:
    type: file
    path: /root/.config/mihomo/proxies.yaml

问题 4:API 无法访问

# 检查 API 端口是否监听
curl http://127.0.0.1:9090/version

# 检查防火墙
sudo firewall-cmd --list-ports
# 或
sudo iptables -L -n

参考资料