预览文件: README.md
# Mihomo 网关代理服务 — 配置手册
> NAS 服务器 (10.0.1.2) | 飞牛OS Debian | Mihomo Meta v1.19.24
## 架构概览
```
┌─────────────────────────────────────┐
局域网设备 ──────► │ NAS (10.0.1.2) - Mihomo Gateway │
(手机/电脑/TV) │ │
│ ┌─────────────────────────────┐ │
│ │ Mihomo (systemd service) │ │
│ │ HTTP/SOCKS5/透明代理/DNS │ │
│ └──────────┬──────────────────┘ │
│ │ │
│ ┌──────────▼──────────────────┐ │
│ │ 3x 机场订阅 (proxy-providers)│ │
│ │ + 97x 规则集 (rule-providers)│ │
│ └──────────┬──────────────────┘ │
└─────────────┼───────────────────────┘
▼
互联网 (代理/直连)
```
## 文件结构
```
MagicHub/clash/mihomo/ # 本地仓库(Git 管理)
├── config.yaml # 主配置文件(远程 URL: list.magichub.top)
├── mihomo.service # systemd 服务单元
├── mihomo-maintenance.sh # 每日重启前维护脚本
├── mihomo-logrotate # 日志轮转配置
├── mihomo-crontab # 定时任务
└── README.md # 本手册
NAS /etc/mihomo/ # 远程运行目录
├── config.yaml # 运行时配置
├── providers/ # 订阅节点缓存
├── rules/ # 规则集缓存(.mrs 文件)
├── logs/ # 日志
├── cache.db # fake-ip 缓存
├── geoip.metadb / geosite.dat # GeoIP/GeoSite 数据库
└── UI 面板文件 # 外部管理面板
```
## 端口分配
| 端口 | 协议 | 用途 |
|-------|-------------------|------------------------------|
| 7890 | HTTP + SOCKS5 混合 | 通用代理 |
| 7891 | HTTP | 纯 HTTP 代理 |
| 7892 | SOCKS5 | 纯 SOCKS5(SSH/Git/终端) |
| 7893 | HTTP Redirect | 透明代理(iptables) |
| 7894 | TProxy | 透明代理(TPROXY) |
| 9090 | HTTP RESTful API | 管理面板 + API |
| 1053 | DNS | fake-ip DNS 服务 |
## 代理策略
### 订阅源 (proxy-providers)
| 名称 | 直连下载 | 健康检查间隔 | 说明 |
|-------------|----------|--------------|------------|
| Airport_01 | DIRECT | 300s | 机场1 |
| Airport_02 | DIRECT | 300s | 机场2 |
| Airport_03 | DIRECT | 300s | 机场3 |
### 自动选择组 (URLTest)
| 组名 | 容差 | 检查间隔 | 失败切换 |
|------------|------|----------|----------|
| 家宽自动 | 20ms | 300s | 立即 |
| 新加坡自动 | 20ms | 300s | 立即 |
| 美国自动 | 20ms | 300s | 立即 |
| 日本自动 | 20ms | 300s | 立即 |
| 台湾自动 | 20ms | 300s | 立即 |
| 香港自动 | 20ms | 300s | 立即 |
| 自动选择 | 20ms | 300s | 立即 |
### Fallback 组
所有 Fallback 组检查间隔 300 秒,按优先级顺序自动故障切换。
### Selector 组
节点选择、Apple、Emby、Steam、Talkatone、LINE 等为手动选择组。
## DNS 架构
```
enhanced-mode: fake-ip
├── fake-ip-range: 198.18.0.1/16 (IPv4) / 2001:480:abcd::1/64 (IPv6)
├── nameserver (解析国内域名): 223.5.5.5, 1.12.12.12 (DoH)
├── fallback (解析国外域名): dns.google, cloudflare-dns.com (DoH)
├── direct-nameserver: doh.pub, 223.5.5.5 (h3)
└── proxy-server-nameserver: doh.pub, 223.5.5.5 (h3)
```
- `respect-rules: true` — DNS 结果受规则约束,避免 DNS 泄露
- `fallback-filter` — 启用 GeoIP + GFWList 双重过滤
- DNS 监听 `0.0.0.0:1053`,可被客户端直接使用
## 规则系统
### 规则来源
全部 97 个 rule-providers 从 GitHub 下载(通过 `proxy: "节点选择"` 经代理访问),使用 `.mrs` 格式。
两个上游规则库:
- **MetaCubeX/meta-rules-dat** — 官方规则(geosite/geoip)
- **Lanlan13-14/Rules** — 社区补充规则
### 规则匹配顺序
```
局域网直连 → PT直连 → 国内AI直连 → 国外AI代理 → 隐私拦截 →
微信 → 银行 → 流媒体(按平台) → 社交媒体 → 游戏 → 电商 →
GFW → GeoLocation-!CN → CN域名直连 → CN IP直连 → MATCH漏网之鱼
```
## 关键优化项(v2)
### 1. rule-providers 代理下载(致命问题修复)
**问题**:全部 97 个 rule-providers 从 `raw.githubusercontent.com` 下载,中国大陆无法直连,导致规则集全部加载失败。
**修复**:为每个 rule-provider 添加 `proxy: "节点选择"`,通过代理下载规则文件。proxy-providers 使用 `proxy: DIRECT` 可直连,节点先于规则加载,不存在鸡生蛋问题。
### 2. Sniffer skip-addr(消除 Telegram 噪声日志)
**问题**:Telegram 使用 MTProto 协议(非标准 TLS),Sniffer 尝试提取 SNI 时无法获取 TLS ClientHello 数据。
**修复**:添加 Telegram IP 段到 `sniffer.skip-addr`:
- `91.108.0.0/16`
- `149.154.160.0/20`
此配置仅影响 Sniffer 的域名嗅探行为,不影响 Telegram 的路由和代理。
### 3. 健康检查优化
- proxy-providers 健康检查间隔从 600s 降至 300s
- 全局选择 fallback 间隔从 600s 降至 300s
- URLTest 组已有 tolerance: 20 + max-failed-times: 1
### 4. 日志轮转
新增 logrotate 配置:每日轮转,保留 7 天,超过 50MB 立即轮转。
### 5. 定时维护
- **每天 03:20**:同步远程配置 → 更新 proxy-providers → 重启 mihomo 服务,一次完成
- 维护脚本会自动备份旧配置(保留最近 3 份)
### 6. systemd 服务加固
- `Restart=always` + `RestartSec=5` — 异常退出自动重启
- `StartLimitBurst=5` + `StartLimitIntervalSec=300` — 5 分钟内最多重启 5 次
- `ProtectSystem=strict` — 限制文件系统写入范围
- `PrivateTmp=true` — 使用独立临时目录
- `ProtectHome=true` — 禁止访问用户主目录
## 管理面板
- URL: `http://10.0.1.2:9090/ui`
- 密码: `rain8240`
### API 常用操作
```bash
# 查看所有代理组
curl -H "Authorization: Bearer rain8240" http://10.0.1.2:9090/proxies
# 手动更新订阅节点
curl -X PUT -H "Authorization: Bearer rain8240" http://10.0.1.2:9090/providers/proxies/Airport_01
# 手动更新规则集
curl -X PUT -H "Authorization: Bearer rain8240" http://10.0.1.2:9090/providers/rules/telegram_domain
# 热重载配置(不重启)
curl -X PUT -H "Authorization: Bearer rain8240" -H "Content-Type: application/json" \
-d '{"path":"/etc/mihomo/config.yaml"}' 'http://10.0.1.2:9090/configs?force=true'
# 切换节点(示例:节点选择 → 新加坡自动)
curl -X PUT -H "Authorization: Bearer rain8240" -H "Content-Type: application/json" \
-d '{"name":"新加坡自动"}' http://10.0.1.2:9090/proxies/节点选择
```
## 部署/更新流程
### 首次部署
```bash
# 1. 复制配置文件
scp config.yaml nas:/etc/mihomo/config.yaml
# 2. 安装 systemd 服务
scp mihomo.service nas:/etc/systemd/system/
ssh nas "systemctl daemon-reload && systemctl enable mihomo"
# 3. 安装维护脚本
scp mihomo-maintenance.sh nas:/usr/local/bin/
ssh nas "chmod +x /usr/local/bin/mihomo-maintenance.sh"
# 4. 安装日志轮转
scp mihomo-logrotate nas:/etc/logrotate.d/mihomo
# 5. 安装定时任务
ssh nas "crontab -l 2>/dev/null; cat mihomo-crontab | crontab -"
# 6. 启动服务
ssh nas "systemctl restart mihomo"
# 7. 验证
ssh nas "systemctl status mihomo"
```
### 日常更新配置
1. 本地修改 `config.yaml`
2. Git 提交并推送到仓库
3. 等待次日 03:20 自动同步重启,或手动触发:
```bash
ssh nas "/usr/local/bin/mihomo-maintenance.sh"
```
4. 也可以直接复制并热重载(立即生效,会短暂中断):
```bash
scp config.yaml nas:/etc/mihomo/config.yaml
ssh nas "curl -s -X PUT -H 'Authorization: Bearer rain8240' -H 'Content-Type: application/json' -d '{\"path\":\"/etc/mihomo/config.yaml\"}' 'http://127.0.0.1:9090/configs?force=true'"
```
## 故障排查
### 检查服务状态
```bash
ssh nas "systemctl status mihomo"
```
### 查看实时日志
```bash
ssh nas "journalctl -u mihomo -f"
```
### 检查代理连通性
```bash
curl -x http://10.0.1.2:7890 -s -o /dev/null -w '%{http_code}' https://www.google.com
# 预期: 200
```
### 检查出口 IP
```bash
curl -x http://10.0.1.2:7890 -s https://ipinfo.io/json
```
### 重启服务
```bash
ssh nas "systemctl restart mihomo"
```
已复制到剪贴板!