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