このページの目次

mihomo 操作マニュアル

mihomo (clash meta) はプロキシルールエンジンです。核心概念: proxy (プロキシノード), proxy-group (ノードグループ、url-test/fallback などの戦略を含む), rule (ルーティングルール), sniffer (プロトコル検知), fake-ip (擬似 DNS マッピング)。以下では、典型的な設定パスとして /opt/mihomo/mihomo_config/config.yaml を例に挙げます。

設定管理

# 真のソース位置 (手動編集が可能な唯一の設定ファイル)
vi /opt/mihomo/mihomo_config/config.yaml

# 設定構文の検証 (再起動前に必ず実行。構文エラーがあるとサービスが起動しません)
mihomo -t -f /opt/mihomo/mihomo_config/config.yaml
# OK: "configuration file is valid"
# NG: 具体的なエラー行番号

# API によるホットリロード (接続を中断しない)
curl -X PUT 127.0.0.1:9999/configs?force=true \
  -H "Authorization: Bearer <secret>" \
  -d '{"path":""}'
# force=true: エラーがあっても強制的に試行する (非推奨。まず -t で検証してください)

# リモートサブルーター (例: OpenWrt Nikki) の場合:
# ssh <router> /etc/init.d/nikki reload
# または: curl -X PUT <router_ip>:9090/configs?force=true

ログとモニタリング

# ログ (デフォルトレベル: info)
tail -f /var/log/mihomo.log
journalctl -u mihomo -f

# API: 基本ステータス
curl 127.0.0.1:9999 -H "Authorization: Bearer <secret>" | jq
# 戻り値: {"hello":"clash"}

# API: すべてのプロキシノードとレイテンシ
curl 127.0.0.1:9999/proxies -H "Authorization: Bearer <secret>" | jq '.proxies[] | {name, type, history}'
# history: [{time, delay}] — 直近のレイテンシサンプリング

# API: アクティブな接続数
curl 127.0.0.1:9999/connections -H "Authorization: Bearer <secret>" | jq '{upload,download,connections: [.connections[] | {src,dst,rule,chain}]}'

# API: ルールリスト
curl 127.0.0.1:9999/rules -H "Authorization: Bearer <secret>" | jq

ルールデバッグ

# デバッグログを有効化 (再起動後に無効化されます)
# config.yaml: log-level: debug

# ログ内の重要情報:
# [TCP] 192.168.1.100:52341 --> google.com:443 match MATCH using PROXY[Auto] --> HK-Hy2
# ↑ ソースIP          ↑ 宛先ドメイン    ↑ 一致したルール  ↑ 使用されたグループ ↑ 最終ノード

# 一般的な問題のトラブルシューティング:
# 1. ルールが一致しない → Matcher (ドメイン) か GEOIP (IP 所属) のどちらを通っているか確認
# 2. PROXY を通っているがノードが不通 → proxy history のレイテンシを確認
# 3. DIRECT を通っているが PROXY を通すはず → ドメインがダイレクト接続ルールに含まれていないか確認

サブルーター透明プロキシ運用

# OpenWrt/Nikki システム: nftables 透明プロキシルールを確認
nft list table inet nikki
# → 以下が含まれているべき: dstnat redirect TCP → :7891, mangle markers → TUN

# failopen デーモン (デプロイされている場合) の確認
/etc/init.d/nikki-failopen status
# 機能: mihomo の死活監視 → 連続失敗 → 透明プロキシルールを削除 → 全デバイスへのダイレクト接続

# DNS リンクの確認
docker exec adguardhome nslookup google.com   # DNS がコンテナ内にある場合

よくある問題

# すべてのノードがタイムアウト
# → 自ホストの出口ネットワークを確認: curl --proxy 127.0.0.1:7890 -I https://www.google.com
# → 各ノードを確認: curl 127.0.0.1:9999/proxies | jq '.proxies[] | select(.history|length>0) | {name, delay: .history[-1].delay}'

# ドメインルールが効かない
# → sniffer は有効化されていますか? config.yaml: sniffer: enable: true
# → fake-ip モード: DNS が擬似 IP (198.18.x.x) を返す → 接続時にテーブル参照 → ドメインルールにマッチ
# → redir-host モード: fake-ip なし → 接続時に sniffing が必要 — sniffing がない場合、ドメインルールは無効になります

# DNS 解決が異常
# → fake-ip 範囲と hosts が競合していないか? /etc/hosts に 198.18.x.x がないか確認
# → アップストリーム DNS に到達できない? nameserver-policy とフォールバック DNS を確認