MIHOMO · 設定ガイド
Clash 詳細設定ガイド
プロキシグループ、ルールセット、DNS、ネットワーク制御。設定が適用される順に、各段階の入力、制約、検証結果を確認します。
初回インストールやサブスクリプションの読み込みを行う場合は、まず使い方ガイドに沿って接続を完了してください。このページでは、利用可能な設定をすでにお持ちの方向けに、継続的に管理する設定項目をまとめて解説します。初期設定の手順は扱いません。例ではmihomoの設定形式を使用します。メニュー名や上書き方法はクライアントによって異なる場合があります。
設定の適用階層と反映状況の確認
Clashの設定ファイルは、画面上のすべての設定をそのまま写したものではありません。Clash Plusなどのデスクトップクライアントでは、アプリがサブスクリプションの取得、ウィンドウ操作、システム連携を担い、mihomoコアがポートの待ち受け、ルール照合、接続確立を担います。クライアントはサブスクリプションを読み込んだ後、ローカル設定を重ね、実行用の設定を生成する場合があります。サブスクリプションの元ファイルを編集しても、生成時に再び上書きされれば変更は反映され続けません。詳細設定は、まずこの階層を区別するところから始めましょう。
コアが実際に読み込んでいる設定を確認する
クライアントの設定画面で現在有効な項目を確認し、ログ画面で起動時に使われた設定ディレクトリを調べます。「実行中の設定を表示」などの機能があれば、エディター上の元ファイルだけでなく、最終的に生成された内容を優先して確認してください。混合ポート、動作モード、DNSの有効化、ルール一覧を重点的に確認します。設定ファイルの保存場所はクライアントごとに異なるため、別のPCの絶対パスをそのまま使わないでください。また、コアの実行中に作業ディレクトリを直接移動するのも避けましょう。
変更前に、現在使えている設定を保存し、システムプロキシ、TUN、サービスモードの状態を記録してください。一度に変更するのは一種類に絞りましょう。たとえば、先にプロキシグループを変更して読み込みを確認し、その後DNSを変更します。サブスクリプションの変更、仮想NICの有効化、リゾルバーの変更を同時に行うと、障害の原因となった階層を特定しにくくなります。設定のバックアップはローカルに保管してください。サブスクリプションURL、ノードのパスワード、コントローラーの認証情報が含まれることがあり、公開の掲示板に貼り付けるのは危険です。
最小構成で構文とネットワークの問題を切り分ける
以下はローカルでの直接接続テスト専用の最小構成です。独立したファイルとしてコアに読み込ませて確認できます。プロキシノードが含まれていないため、リモートプロキシとしては使えません。YAMLが読み込めること、ローカルポートが起動すること、ルールモードで直接接続できることを確認するための例です。実際に使う場合は既存のサブスクリプションに戻してください。このファイルをプロキシ設定一式として使わないでください。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
proxies: []
proxy-groups:
- name: 手動選択
type: select
proxies:
- DIRECT
rules:
- MATCH,手動選択
YAMLのインデントにはスペースを使い、同じ階層では幅を統一してください。リスト項目のハイフンやコロンの後のスペースにも意味があります。特殊文字を含む名前は引用符で囲めますが、参照先でも同じ文字列を使う必要があります。特にトップレベルのキーを重複させると、誤解を招きやすくなります。同じファイルにdns:が2つあっても、設定が自動で統合されるとは限らず、実際の解析動作も異なる場合があります。まず設定を1つのオブジェクトにまとめ、クライアントが対応する上書き機能を使ってください。
検証に成功しても接続できるとは限らない
コアを直接起動する場合は、設定ファイルがあるディレクトリで次のコマンドを実行できます。相対パスの基準は作業ディレクトリなので、-dと-fには同じ一式のファイルを指定してください。構文チェックの成功は、設定が受理されたことを示すだけです。リモートのルールセットをダウンロードできるか、ノード認証に成功するか、DNSサーバーに到達できるかまでは保証しません。本番起動後は終了コードだけでなく、初回読み込み時のログも確認してください。
mihomo -t -d . -f config.yaml
ポートが使用中と表示された場合は、別のクライアントやコアがバックグラウンドで動作していないか確認します。エラーを消すためだけにポートを何度も変更しないでください。アプリの手動プロキシ設定、システムプロキシ、クライアントの待ち受けポートは一致している必要があります。設定を読み込めるのに一部のアプリだけ失敗する場合は、システムプロキシへの対応状況、独自DNSの使用、通信がTUNに入っているかを切り分けましょう。これらはYAMLのインデントとは別の問題です。
クライアントはダウンロードセンターから選べます。まずはClash Plusを検討し、OSや既存の使い方に合わせてほかのクライアントと比較してください。オリジナル版Clash、mihomo、GUIクライアントの関係については、コアとクライアントの派生関係も参考になります。以降の章では設定の動作を解説します。特定の画面にあるボタンの位置を、すべてのクライアントに共通するものとして扱うことはありません。
プロキシグループの種類と設定例
プロキシグループはルールとノードの間に位置します。ルールが接続を渡すグループを決め、グループが使用する出口を選びます。業務ルールからノードを直接指定すれば簡単ですが、ノード名が変わるたびに参照箇所をすべて修正する必要があります。ルールから固定の業務用グループを参照し、そのグループから手動選択または自動選択のグループを参照する構成のほうが管理しやすくなります。実際の用途に合わせてグループを設計し、サイトごとに同じ階層を繰り返し作る必要はありません。
4種類のプロキシグループの使い分け
selectは手動選択用で、出口を固定したい場合や一時的な切り分けに適しています。url-testは接続テストの結果に応じて出口を自動選択し、経路の変化を許容できる一般的な通信に向いています。fallbackは設定順に利用可能な項目を選ぶ方式で、主系・予備系の切り替えが目的です。常に最速のものを選ぶわけではありません。load-balanceは複数の出口に接続を振り分けますが、1つのダウンロード接続の帯域を合算して何倍にもする機能ではありません。
| 種類 | 選択基準 | 注意点 |
|---|---|---|
select | ユーザーが指定 | 選択後も出口が使えるか確認する |
url-test | テストへの応答 | テスト成功は対象サービスの利用可能性を保証しない |
fallback | 優先順と稼働状況 | 主系の復旧後に再び切り替わる場合がある |
load-balance | 振り分け方式 | ログインが出口の安定性を求める場合がある |
接続テスト先には、安定して応答が軽く、すべての候補ノードからアクセスできるエンドポイントを選びます。テスト先自体が制限されていると、実際の通信に問題がなくてもグループ内の全ノードが異常と表示されることがあります。逆に、テスト先へ接続できても、動画配信の利用条件、業務システムへのログイン、地域制限の要件を満たすとは限りません。トラブル対処では、ヘルスチェックと実際のサービス利用確認を分けて記録してください。
業務用の入口を固定する
以下は、自動選択グループを手動選択グループに入れる例です。include-allは、設定にすでにあるプロキシ候補をまとめて追加します。完全な設定に利用可能なノードが読み込まれていることが前提です。ノードの取得元ではなく、プロキシを自動生成する機能でもありません。コードのテスト先は一般的な接続確認用エンドポイントです。現在のネットワークからアクセスできない場合は、到達可能と確認できた軽量なエンドポイントに変更してください。
proxy-groups:
- name: 自動選択
type: url-test
include-all: true
url: https://www.gstatic.com/generate_204
interval: 300
tolerance: 50
- name: ネットワーク出口
type: select
proxies:
- 自動選択
- DIRECT
intervalは秒単位で、テストの間隔を指定します。toleranceは切り替えの許容幅をミリ秒単位で指定し、近い結果の間で頻繁に切り替わるのを抑えます。間隔を短くすればよいとは限りません。バックグラウンドのリクエストが増え、短時間の変動にも反応しやすくなります。ノートPCやモバイル回線では、まず余裕のある間隔に設定し、ログを見ながら調整しましょう。テスト頻度を上げても、接続品質が保証されるわけではありません。
プロキシプロバイダーを使う場合は、定義済みのproxy-providers名をuseで参照すれば、ノード名をグループに1つずつ記述せずに済みます。プロバイダー名とノード名は異なる階層の概念です。前者は取得元を管理し、後者は具体的な接続先を示します。取得元にフィルター式を適用する場合は、元の名称が変わったときや、フィルター結果が空になったときの動作も考慮してください。変更後は設定の読み込み成功だけでなく、候補一覧も確認します。
切り替え時の注意点と復旧方法
自動グループの切り替えは通常、新しく作成される接続に反映されます。確立済みの長時間接続は、すぐに移行しない場合があります。ページを再読み込みしても古い出口が使われる場合は、該当アプリの接続をいったん終了してから再試行してください。プロキシグループが機能していないと即断しないようにしましょう。動画再生、ターミナルセッション、業務システムでは出口の変化に対する許容度が異なります。送信元アドレスの安定性が必要なサービスには、複数地域を自動で切り替えるより、手動固定のグループが適しています。
グループ同士は参照できますが、循環参照はできません。たとえば「ネットワーク出口」が「業務用」を参照し、「業務用」が再び「ネットワーク出口」を参照すると、最終的な出口が決まりません。設計時は参照をたどり、末端が実際のノードやDIRECTなどの組み込みポリシーになることを確認します。グループ名をノード名と重複させるのも避けてください。画面表示とルールの振り分け先を判別しにくくなります。
検証は、まずプロキシ画面で候補が空でないことを確認し、次に利用可能と分かっているノードを手動で固定し、最後に自動選択を有効にする順で行います。固定したノードが使えて自動グループだけ失敗する場合は、テスト先、フィルター条件、参照階層を確認してください。固定ノードも使えない場合は、ノード認証と基礎ネットワークに戻り、グループをさらに増やさないでください。画面の使い方はプロキシ・設定・ログ画面のガイドを参照してください。
ルールセットを使った管理
ルールはリストの上から順に評価され、最初に一致したルールのポリシーが使われます。ルールセットは大量の条件を別ファイルにまとめる仕組みで、この順序の原則は変わりません。管理しやすくするには、少数のローカル例外を先頭に置き、その後に用途別のルールセットと一般的な地域ルールを並べ、最後にMATCHで受けます。宛先の名前解決結果に依存するルールを使う場合に限り、コアに接続先のアドレスを照会させます。
明確な条件から照合し、最後にフォールバックする
DOMAINはドメイン名の完全一致、DOMAIN-SUFFIXはドメイン名とそのサブドメインに一致します。IP-CIDRはアドレス範囲で照合し、GEOIPは地理情報データを利用します。範囲の広いルールを先に置くと、後続の個別例外に到達しません。特定のサイトが常に誤った出口を使う場合は、リストの末尾に同じドメインを追加し続けるのではなく、最初に一致したルールを確認してください。
設定で指定するポリシー名は、実在する必要があります。ルールの振り分け先が「ネットワーク出口」なのに、実際のグループ名が「プロキシ出口」では、自動修正されるような小さな違いではありません。サブスクリプションの更新でグループ名が変わることもあります。ローカルルールでは、自分で管理する固定の入口グループを参照するのがおすすめです。また、ルールモードからグローバルモードに切り替えると、通常のルール一覧が想定どおり選択に使われなくなります。細かな照合条件を調べる前に、動作モードを確認してください。
ローカルルールセットで検証用のケースを作る
以下はローカルファイルを使う例で、まずパス、形式、ルール参照を確認するのに適しています。ファイルパスはコアの作業ディレクトリを基準に解決されます。この例では、予約済みのサンプルドメインをDIRECTに振り分けますが、実際の用途に対する振り分け設定ではありません。仕組みを確認した後、管理しているドメイン一覧に置き換えてください。メイン設定とルールファイルは別々のファイルです。コードを連結して1つのファイルに保存しないでください。
# メイン設定の該当部分
rule-providers:
local-direct:
type: file
behavior: domain
format: yaml
path: ./rules/local-direct.yaml
rules:
- RULE-SET,local-direct,DIRECT
- GEOIP,CN,DIRECT
- MATCH,ネットワーク出口
# rules/local-direct.yaml
payload:
- '+.example.com'
- '+.example.org'
behavior: domainはドメインの集合に使い、各項目にDOMAIN-SUFFIXなどの接頭辞は付けません。ipcidrはアドレス範囲用です。classicalには従来形式のルール条件を記述できますが、項目に最終的なポリシー名を含めてはいけません。formatはファイルの実際の形式に合わせます。HTMLのエラーページ、JSON APIの応答、通常のテキストを取得してYAMLとして扱うと、読み込みに失敗します。
リモート更新でローカル例外を壊さない
ルールの取得元をHTTPにする場合は、有効なurl、キャッシュ用のpath、更新間隔のintervalを設定します。ルールセットの更新間隔も秒単位です。リモートURLからはルールファイルそのものが返される必要があり、コードホスティングサイトのプレビュー画面ではいけません。異なる取得元で同じキャッシュパスを使わないでください。更新やロールバックの際に、ローカルファイルの由来を判別しにくくなります。
ルールセットのダウンロードにも、利用可能なネットワーク経路が必要です。ルールセットの取得に特定のポリシーが必要で、そのポリシーがまだ読み込まれていないルールやノードの取得元に依存していると、起動時に依存関係の循環が発生することがあります。初回設定では、まず基本の出口が利用できることを確認してからリモートルールを追加しましょう。ダウンロードに使用するプロキシを指定する場合は、確実に使えるグループを参照します。更新に失敗したら、キャッシュをすべて削除するのではなく、ログに記録されたHTTPステータスと解析エラーを残してください。
IP-CIDRやGEOIPにno-resolveを指定すると、アドレスルールの判定だけを目的とした余分な名前解決を避けられます。ただし、実際の宛先IPがまだ分からない場合、そのルールに一致しないことがあります。汎用的な高速化スイッチではありません。既知のドメインルールを先に置き、実際にIPを取得した接続をアドレスルールで処理し、接続ログで動作を確認するのが適切です。
検証では、サンプルに含まれることが明確なドメインと含まれないドメインを1つずつ使い、ルール、プロキシグループ、最終的な出口をそれぞれ確認します。ルール変更後は、新規接続を使って確認してください。ブラウザーの接続再利用では、古い経路が残ることがあります。サブスクリプションの更新には成功したのにルールファイルの取得に失敗する場合は、サブスクリプションと設定の解析チェックリストを参照し、ダウンロードと解析の段階を切り分けましょう。異なるエラーを混同しないでください。
DNS設定と名前解決の経路
DNS設定では、アプリの問い合わせを誰が受け付けるのか、上流への問い合わせを誰が行うのか、どのネットワーク経路で送信するのか、という3点を確認する必要があります。上流を暗号化DNSに変更しただけでは、すべてのアプリの問い合わせがコアに入るとは限りません。ブラウザーのセキュアDNS、システムキャッシュ、アプリ内蔵のリゾルバー、LANゲートウェイが別経路を作る場合があります。ClashのDNS漏れを検討する前に、端末の実際の問い合わせ経路を整理してください。
待ち受け、ブートストラップ、通常の名前解決を区別する
listenはコアのDNSサービスが待ち受けるアドレスを定義します。nameserverは通常の問い合わせに使う上流サーバーです。default-nameserverは上流DNSサーバー自身のホスト名を解決するなど、初期接続に必要な問い合わせに使うもので、失敗した問い合わせを何でも自動転送する万能の予備ではありません。ホスト名を使うHTTPSリゾルバーでは、まずそのホスト名を解決する必要があります。「リゾルバーに接続するには、まずリゾルバーのアドレスを解決しなければならない」という循環を避けてください。
以下は、ローカルでの診断に使いやすいDNS設定例で、専用のループバックポートを使います。OSのDNS設定を自動でこのアドレスに変更したり、アプリの通信を横取りしたりするものではありません。まずコマンドで待ち受けポートに明示的な問い合わせを行い、その後TUNやシステム設定と合わせて通信の取り込みを確認します。これにより、「DNSサービス自体の失敗」と「アプリがDNSサービスを経由していない」問題を切り分けられます。
dns:
enable: true
listen: 127.0.0.1:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- 223.5.5.5
nameserver:
- https://dns.alidns.com/dns-query
nameserver-policy:
'+.example.com':
- 223.5.5.5
例のアドレスは設定の構造を示すものです。実際に使うサーバーは、利用している通信事業者、地域、アクセス方針に合わせて選んでください。nameserver-policyは特定のドメインに使うリゾルバーを指定します。社内DNSや特定地域の応答が必要なドメインに適しています。業務ドメイン全体を安易にパブリックDNSへ渡すと、内部アドレスが返らない場合があります。対象範囲はできるだけ絞り、まず単一のドメインを確認してからサブドメインへ広げましょう。
DNSの問い合わせと出口ポリシーを連携させる
DNS接続にもルーティングルールを適用する場合は、respect-rulesを検討し、ノードサーバーのホスト名を解決するためのproxy-server-nameserverも適切に設定します。ノードアドレスの解決にプロキシが必要で、プロキシの確立にはノードアドレスが必要という循環が起きる可能性があります。すべてのサブスクリプションに当てはまる共通のスイッチ設定はありません。まだ確立していないプロキシに依存しない初期接続経路を、少なくとも1つ確保することが重要です。
direct-nameserverは、DIRECT出口に関係する名前解決に使えます。ドメイン別ポリシーと併用する場合は、nameserver-policyに従うかどうかも明確にしてください。結果を確認しないまま、複数のnameserver、fallback、ポリシーマッピングを同時に設定するのは避けましょう。複雑な設定では、同じドメインへの問い合わせが複数の経路で発生し、応答元を追跡しにくくなります。
従来のfallbackとfallback-filterは、DNS応答を選択する仕組みです。「最初のDNSがタイムアウトしたら2番目へ問い合わせる」と単純に解釈できるものではありません。フィルター条件、地理情報による判定、候補となる応答が最終結果に影響します。既存環境で明確なドメイン別ポリシーにより要件を満たせるなら、まずは設定をシンプルに保ちましょう。汚染や異常な応答が再現する場合に、検証可能なケースをもとにフィルター条件を設計してください。
応答結果と問い合わせ先を分けて確認する
digがインストールされている環境では、以下のコマンドでローカルのDNS待ち受け先を確認できます。Windows標準のツールは、既定以外のポートへの対応方法が異なる場合があります。システムDNSへの問い合わせ結果を、ローカルのコアへの問い合わせ結果と取り違えないようにしてください。問い合わせ時刻、応答の種類、ログに記録された上流サーバーの選択を残し、アプリの接続状況と照らし合わせると、全体を検証できます。
dig @127.0.0.1 -p 1053 example.com A
Fake-IPモードで仮想アドレスが返るのは想定どおりの動作です。パブリックDNSの結果と異なるという理由だけで、名前解決の誤りと判断しないでください。IPv6についても、コア全体の設定、DNSがAAAAを返すか、システムのIPv6ルート、ノードがIPv6通信に対応するかを区別する必要があります。例では初回の診断項目を減らすためDNSからのIPv6応答を無効にしていますが、すべてのネットワークでIPv6を恒久的に無効化することを勧めるものではありません。
一般的なDNS漏れテストで確認できるのは、あるWebアクセスで使われた名前解決元の一部に限られ、すべてのアプリやプロトコルを網羅できるわけではありません。ブラウザーで独自のセキュアDNSを有効にしている場合は、その設定を個別に確認してください。企業端末では、組織の管理ポリシーが適用されている場合もあります。特定のテストページに合格するためにシステム設定を何度も変えないでください。保護する範囲と問い合わせを取り込む範囲を確認してから、ログ、ルーティング、アプリの動作を照合しましょう。
TUNとFake-IPの連携
TUNとFake-IPは異なる階層で動作します。TUNは仮想ネットワークインターフェースを作り、ルーティング条件に一致するIP通信をコアに取り込みます。Fake-IPはDNSの応答方法を変え、仮想アドレスを通じてドメインとの関連付けを維持します。前者は通信をどう取り込むかを、後者は通信先のドメインをどう判別するかを助けます。併用されることは多いものの、別々に設定できます。一方を有効にしても、もう一方が有効になったとは限りません。
まず権限とルートの管理元を確認する
デスクトップクライアントでTUNを有効にするには、通常、管理者権限、システムの許可、またはインストール済みのバックグラウンドサービスが必要です。システムプロキシの設定は、主にシステム設定に従うアプリで使われます。詳細はシステムプロキシの設定を確認してください。ブラウザーは使えるのにコマンドラインツールが使えない場合、後者がシステムプロキシを参照していないだけかもしれません。その場合は、まずTUNが本当に必要か判断し、ノードとDNSを同時に変更しないようにしましょう。
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
この設定は一般的な通信の取り込み方法を示しますが、実際の動作はシステム権限、クライアントのサービス、ローカルルートに左右されます。auto-routeは関連するルートを追加し、auto-detect-interfaceは出口インターフェースの自動検出を試みます。複数のNIC、仮想マシン、複数のVPNが同時に動作している環境では、自動検出が意図どおりにならない場合があります。変更前にデフォルトの出口を記録し、問題が起きたらネットワークスタックを何度も切り替えるのではなく、ルートを確認してください。
| 環境 | 優先して確認する項目 | よくある競合 |
|---|---|---|
| Windows | サービス権限、仮想インターフェース、システムファイアウォール | 他のVPN、仮想スイッチ、ループバック制限 |
| macOS | ネットワークの許可、デフォルトルート、サービスの状態 | 他のトンネルインターフェース、ネットワークフィルタリングソフト |
| Linux | TUNデバイス、権限、ポリシールーティング | ファイアウォールルール、コンテナ、ネットワーク名前空間 |
仮想アドレスと例外ドメインを理解する
Fake-IPは、ドメイン名を専用の仮想アドレスプールに割り当てます。接続がコアに戻ると、ドメインとの関連付けが復元されます。アプリがIPだけを保存したり、そのアドレスを別の端末へ転送したり、コアの終了後もキャッシュを再利用したりすると、通信に失敗することがあります。そのため、仮想アドレスをWebサイトの実IPとしてファイアウォールの許可リストに登録しないでください。同じコアを経由しない端末にコピーして使うのにも適しません。
プリンターの検出、LAN機器、実アドレスが必要なサービスでは、fake-ip-filterに例外を設定し、一致した問い合わせに実アドレスを返せます。無関係な大量のパブリックサービスをまとめて除外するのではなく、実際に問題が起きたドメインを対象にしてください。除外された接続では、ドメインとの関連付けによる利点が失われ、以降はアドレスルールやスニッフィングに頼ることがあります。範囲を広げすぎると、通信の振り分けを説明しにくくなります。
# 既存のdnsオブジェクトに統合し、別のdns設定を重複して宣言しない
dns:
fake-ip-filter:
- '*.lan'
- '*.local'
.localサービスではマルチキャストDNSを使う場合もあり、通常のDNSに例外を設定しても機器検出が必ず復旧するとは限りません。TUNで通常の53番ポートを横取りしても、すべての暗号化DNSやマルチキャスト問い合わせが自動で取り込まれるわけではありません。プリンターに固定アドレスで接続できるのに自動検出できない場合は、DNSサーバーだけを変更するのではなく、マルチキャスト、LANルート、システムサービスも確認してください。
通信の取り込みを重ねたり、誤った経路を作ったりしない
企業VPN、リモートワーク用トンネル、ほかのプロキシクライアントは、いずれもルートを書き換える可能性があります。通常は、不要な通信制御プログラムを先に停止して、単独のTUNで動作を確認します。併用が必要な場合は、社内ネットワーク、プロキシサーバーのアドレス、ローカル管理用アドレスがどのルートを使うかを個別に決めてください。除外するネットワーク範囲は実際のネットワーク設計に基づいて指定します。Web上の長い一覧をそのまま流用すると、プロキシ経由にすべき通信が直接接続になるおそれがあります。
Fake-IPの切り替え、TUNの無効化、コアの再起動後も、アプリが古いアドレスをキャッシュしている場合があります。まずアプリの接続を終了してドメインを再度問い合わせ、必要ならシステムDNSキャッシュを消去してから、新しい接続を確認してください。古い接続が残ったまま、ページを一度再読み込みしただけで結論を出さないようにしましょう。特定のアプリだけが失敗する場合は、すべてのルートを同時に変更するより、そのアプリの宛先アドレスと使用プロトコルを記録するほうが効果的です。
復旧は明確な順序で行います。まずTUNを無効にして基礎ネットワークが復旧するか確認し、次にクライアントが関連ルートを削除したかを調べ、最後に以前のシステムプロキシ設定を戻します。通常、クライアントを終了すると自身が設定した通信制御も解除されますが、異常終了では残る場合があります。よくある症状はトラブル対処Q&Aを参照してください。システムのネットワーク設定を変更する前、特にリモート操作中の端末では、ローカルから復旧できる方法を用意しておきましょう。
ドメインスニッフィングの仕組みと限界
ドメインスニッフィングは、接続がコアに入った後、対応するプロトコルの初期データから宛先ホストの情報を取り出します。代表的な情報源はHTTPのHostとTLSハンドシェイクのサーバー名です。宛先IPしか分からない接続に対して、ドメインルールを使えるようにする助けになりますが、DNSの代わりではなく、すべての暗号化通信を識別できるわけでもありません。アプリを完全に識別する機能と考えるより、追加の手がかりとして捉えるのが適切です。
通信が届いてから識別を考える
スニッフィングの対象は、コアがすでに受信した接続だけです。アプリがシステムプロキシを迂回し、TUNにも入っていない場合、スニッフィングを有効にしても通信は取り込まれません。逆に、接続に信頼できるドメイン情報がすでにあれば、追加のスニッフィングが役立つとは限りません。まずクライアントの接続画面に対象の接続が表示されることを確認し、その後ドメイン欄、適用ルール、最終的な出口を調べてください。最初からスニッフィング対象のポートを広げるのは避けましょう。
sniffer:
enable: true
sniff:
HTTP:
ports:
- 80
- 8080-8880
override-destination: false
TLS:
ports:
- 443
- 8443
override-destination: false
QUIC:
ports:
- 443
override-destination: false
この例では、スニッフィングを一般的なプロトコルのポートに絞り、元の宛先アドレスを書き換えずに識別の精度を確認します。ポートはプロトコルが使う可能性のある場所であって、通信内容を保証するものではありません。443番ポートでも、別のプロトコルが使われることがあります。すべてのポートをスニッフィング対象にすると、不要な処理が増え、標準外のサービスで起きる互換性問題も見つけにくくなります。実際の用途を確認しながら、段階的に対象を広げてください。
ドメインの識別と宛先の書き換えは別の機能
override-destinationは、スニッフィング結果で接続先を上書きするかどうかを指定します。特定のIPアドレスを必要とするサービスでは、書き換えによって別のサーバーへ接続する可能性があります。CDNを使うサイトでは、再名前解決によって選択されるアドレスが変わることもあります。振り分けの判定を改善したいだけなら、まず宛先アドレスを保持したまま接続ログでルールの動作を確認してください。実際に上書きが必要と分かってから設定すればよく、常に有効にすべき項目ではありません。
parse-pure-ipを有効にすると、宛先がIPアドレスだけの一部の通信もスニッフィング対象にできます。ただし、識別できるかどうかは、プロトコルに読み取れるドメイン情報が含まれているかによります。IPアドレスを直接指定したHTTPリクエストには、想定したドメインが含まれない場合があります。TLSでもサーバー名が取得できるとは限りません。アプリ独自の暗号化プロトコルは、HTTP、TLS、QUICの解析方式に合わない可能性があります。「HTTPSで接続している」という理由だけで識別できると判断しないでください。
スニッフィングを強制する場合や対象外にする場合は、force-domain、skip-domainなどで範囲を明示できます。例外には再現可能なサービスを指定してください。出所不明のドメイン一覧をそのまま設定に貼り付けないようにしましょう。共有IP、リバースプロキシ、社内ゲートウェイがある環境では、識別された名前が接続元のサービスの意図を表すとは限りません。元の宛先も合わせて確認してください。
暗号化プロトコルとプライバシー上の制限
一部のTLS環境では、暗号化クライアントハローなどにより、従来のサーバー名抽出が機能しない場合があります。QUICはUDPを使うため、TCPとは異なる処理が必要で、ノードのUDP対応状況、ルーティング、ネットワークポリシーにも左右されます。ブラウザーではアクセスできるのにクライアントがドメインを識別できない場合でも、設定ミスとは限りません。他の信頼できる情報に基づいてルールが正しく動作していれば、すべての接続にドメイン名を表示させる必要はありません。
スニッフィングはHTTPSの本文を復号する機能ではなく、通常のドメイン識別のために端末へ自己署名のルート証明書をインストールする必要もありません。読み取るのはユーザーのログインパスワードやWebページの内容ではありません。一方で、ドメイン名からアクセス先が推測できる場合があるため、ログのエクスポートやパネルの共有には注意してください。障害情報を共有する際は、個人用ドメイン、サブスクリプション情報、ノードの認証情報を削除し、ルールの問題を再現できる最小限の範囲だけを残します。
検証では、既知のドメインを使ってスニッフィングを無効にした場合と有効にした場合の両方で、新しい接続を作成し、ドメイン欄と適用ルールを比較します。Webページが開くかどうかだけでは判断できません。同じフォールバックポリシーで成功している可能性があります。有効化後に問題が起きた場合は、まず宛先の上書きを無効にし、対象ポートを絞ってください。それでも改善しない場合はスニッフィングを一時的に無効にし、DNSの関連付けとルール設定から基本経路を確認します。
金融サービスへのログイン、企業内ネットワーク、固定アドレスを必要とするサービスでは、識別範囲を広げることより安定性が重要です。明確なIPアドレスまたはドメインのルールを維持し、互換性がないと分かっているサービスには小さな範囲で例外を設定できます。スニッフィング設定の合格基準は「すべての接続に名前が表示されること」ではなく、「対象サービスが想定どおりに振り分けられ、問題が起きないこと」です。画面を整えるために実用性を損なわないようにしましょう。
ローカル上書きと複数サブスクリプションの統合
サブスクリプションはリモートのノードと基本設定を提供し、ローカル上書きは端末固有の設定を保持します。両者を分けると、サブスクリプションの更新でポート、DNS、ルールの例外が上書きされるのを防ぎやすくなります。ただし、「上書き」はすべてのクライアントで共通のファイル形式ではありません。オブジェクトのマージに対応するもの、ルールの先頭追加機能を備えるもの、スクリプトで設定を生成するものがあります。操作前に利用中のクライアントの仕様を確認し、別のアプリの編集方法をそのまま当てはめないでください。
まず設定項目ごとの管理元を決める
ノードのアドレス、認証パラメーター、サーバー側の変更は通常サブスクリプションの提供元が管理します。ローカルの待ち受けアドレス、LANへの公開範囲、端末固有のルール、コントローラーの設定はローカルに置くのが適しています。DNSやプロキシグループは、上流設定にどこまで含まれているかによって管理元が変わります。これらをローカルで管理する場合は、オブジェクト全体を上書きするのか、少数の項目だけを追加するのかを明確にしてください。上流の前提とローカルのロジックを中途半端に混在させないことが重要です。
オブジェクトのマージと配列のマージは別々に確認します。たとえばdns.enableの上書きは、多くの場合1つの真偽値を変更するだけです。一方、rulesやproxy-groupsは配列で、クライアントによって置換、先頭追加、末尾追加、名前による処理など、動作が異なります。エディターに新しいルールが表示されても、実行時の設定に既存ルールが残っているとは限りません。マージ方式を変更するたびに、最終的なルール順とプロキシグループの数を確認してください。
| 内容 | 推奨する管理元 | 確認項目 |
|---|---|---|
| ノードの認証情報とアドレス | サブスクリプションの提供元 | 更新の成否、ノードの失効状況 |
| 待ち受けポートと公開範囲 | ローカル設定 | 画面上の設定で再度上書きされていないか |
| 個人用ドメインの例外 | ローカルの先行ルール | 範囲の広いルールより前にあるか |
| プロキシグループとDNS | どちらが管理するか明確にする | 名称への依存とオブジェクト全体の構造 |
プロキシプロバイダーで複数の取得元を管理する
複数のサブスクリプションを統合する際、2つの完全なYAMLを単純に連結してはいけません。どちらにも同名のトップレベルキー、フォールバックルール、プロキシグループが含まれることが多く、連結すると重複や上書きが発生します。メイン設定を1つに保ち、複数の取得元をプロキシプロバイダーとして読み込み、共通のローカルプロキシグループから参照する方法が分かりやすいでしょう。リモートから返される内容がクライアント用の完全な設定である場合は、プロキシプロバイダー形式に適合するか確認してください。URLを変更するだけで互換性が得られるわけではありません。
proxy-providers:
personal:
type: file
path: ./providers/personal.yaml
work:
type: file
path: ./providers/work.yaml
proxy-groups:
- name: 取得元の選択
type: select
use:
- personal
- work
proxies:
- DIRECT
上記のローカルファイルには、それぞれ有効なproxiesリストを含め、用意済みのノードファイルをパスで指定してください。任意のサブスクリプション本文を保存する場所ではありません。リモート更新が必要になったらHTTPプロバイダーに切り替え、取得元ごとに異なるキャッシュパスを設定します。実際のサブスクリプションURLは、サービスへ直接アクセスできる認証情報を含む場合があるため、ドキュメント、スクリーンショット、共有リポジトリで公開しないでください。
異なる取得元で同じノード名が使われている場合があります。クライアントまたはコアが対応するプロバイダー上書き機能で識別しやすいプレフィックスを付け、プロキシグループが引き続き正しい宛先を参照しているか確認してください。表示順だけで取得元を判断しないようにしましょう。正規表現による絞り込みでは、地域や用途で選ぶ場合に特に、プレフィックス変更の影響も考慮します。統合後は候補一覧を確認し、各取得元から実際に接続できるかを個別に検証してください。
更新に戻せる境界を設ける
安全性を高めるには、まず現在の設定をコピーし、取得元を1つ追加して利用できることを確認してから2つ目を加え、最後に共通のルール入口を整える順で進めます。各段階で復元できる状態を残してください。サブスクリプションの更新に失敗しても、すぐにすべての取得元を削除しないでください。認証の失効、ダウンロードの失敗、内容の解析エラーのどれかを先に確認します。キャッシュが破損していると確かめ、利用可能なリモート取得元もある場合に限り、対象を絞ってキャッシュを削除してください。
スクリプトで上書きする場合は、フィールドの欠落、空配列、名称の変更も扱う必要があります。取得元が一時的に空でも、不在のグループを参照する設定を生成せず、明確な結果を返すスクリプトにしてください。ネットワークアクセスやファイル書き込みができるスクリプトを、信頼できない場所から貼り付けないでください。宣言的な設定で解決できる単純な変更に、完全なスクリプトを導入する必要は通常ありません。保守やレビューの負担を抑えられます。
最終確認では、「2つのサブスクリプションが読み込まれた」と表示されるだけでは不十分です。更新前後でローカルルールの位置が正しいこと、ノードの取得元が明確であること、プロキシグループに循環参照がないこと、DNSとポートが予期せず変更されていないことを確認します。初回の手順はサブスクリプションの読み込みガイドを参照してください。このページの統合構成は長期管理向けです。初めて使う方が接続を確立する前に、複数の取得元を構築する必要はありません。
外部コントローラーパネルとセキュリティ
外部コントローラーパネルは、mihomoのコントローラーAPIを通じて実行状態を取得し、プロキシグループの切り替えや接続一覧の確認を行います。プロキシの接続口でも、サブスクリプションサーバーでもありません。混合ポートはアプリの通信を受け付け、コントロールポートは管理操作を受け付けます。両者は互換性がありません。パネルを開けない場合は、静的ページが読み込めるか、コントローラーAPIに接続できるか、認証に成功するかを分けて確認してください。インターネット接続用の混合ポートをむやみに変更しないでください。
ローカル管理はループバック待ち受けから始める
デスクトップクライアント内蔵の画面を使う場合、通常は追加のコントロールポートを開放する必要はありません。ローカルパネルに接続する必要がある場合は、まずループバックアドレスを使い、LAN内の端末に管理APIを公開しないようにします。以下の認証情報は説明用の例です。実際に使う前に、自分で生成してローカルだけに保管する強固なパスワードに置き換えてください。ほかの端末からアクセスできるサービスに、例の値を使わないでください。
external-controller: 127.0.0.1:9090
secret: "your-password"
external-ui: ./ui
external-uiは、用意済みのパネル用静的ファイルのディレクトリを指定します。パスはコアの作業ディレクトリを基準に解決され、パネルのファイルを自動生成するものではありません。ディレクトリがあっても入口ファイルがなければ、APIは正常でもページがエラーになる場合があります。パネルのファイルは信頼できるプロジェクトから取得し、説明に従ってローカルに配置してください。出所不明のページに入力したコントローラーの認証情報を、一般的なWebサイトのログイン情報と同じように扱わないでください。
127.0.0.1にバインドすると、そのアドレスを使って本機からのみアクセスできます。すべてのインターフェースで待ち受ける設定にすると、LAN内や到達可能なほかのネットワークからもポートへアクセスできる可能性があります。実際に到達できるかは、ファイアウォールとネットワーク構成によります。allow-lanは主にプロキシの待ち受け範囲に影響し、コントロールポート全体を制御するスイッチではありません。これを無効にしても、コントロールポートの待ち受けやアクセス制限の代わりにはなりません。
接続、認証、ブラウザーの制限を切り分ける
APIへの接続が拒否される場合は、まずコアが実行中か、待ち受けアドレスが正しいか、ポートが使用中でないかを確認してください。接続できても認証エラーになる場合は、ファイアウォールを調整し続けるのではなく、パネルに保存したコントロール用パスワードを確認します。パネルの画面は表示されるのにデータを取得できない場合は、ブラウザーのクロスオリジン制限や、ページとAPIのアドレスの不一致が原因かもしれません。ブラウザーの開発者ツールで該当リクエストの結果を確認してください。
HTTPSのページからHTTPのコントロールAPIへアクセスすると、混在コンテンツ制限を受ける場合があります。同じ端末上の同一オリジンでローカルに配置する方法を優先し、クロスオリジン設定の必要性を減らしてください。リバースプロキシ経由が必須の場合は、TLS、認証、オリジン制限をそれぞれどの層が担うか明確にします。ブラウザーのエラーを消すために任意のオリジンを許可しないでください。また、コントロール用パスワードを公開URLに含めるのも避けましょう。アドレスが履歴、ログ、共有内容に残る可能性があります。
複数端末から管理する必要がある場合は、管理された安全なトンネルを使うか、信頼できる管理ネットワーク内だけで公開し、システムファイアウォールでアクセス可能な端末を絞ってください。コントロールAPIを直接インターネットに公開すると、状態の確認だけでなく、使用中のポリシーや設定にも影響を及ぼす危険があります。パスワードを設定するだけでは、通信の暗号化、総当たり攻撃への対策、パネルの配布元の信頼性まで確保したことにはなりません。
設定変更を一通り検証する
パネルでグループを切り替えたら、クライアント画面と新しい接続の実際の出口が同じように変わったか確認します。パネルから動作モードを変更した場合は、現在のルール検証に影響がないかも確認してください。パネルの表示、設定ファイル、実行中の状態が常に一致するとは限りません。画面上の選択がクライアントに保存される場合もあれば、再読み込み時に上書きされる場合もあります。継続して反映させたい設定は、コントロールAPI上で一時変更するのではなく、管理元が明確な設定層に戻して変更してください。
ログはトラブル対処に必要な最小範囲に保ちます。デバッグ時だけ一時的に詳細度を上げ、再現後は通常のレベルに戻してください。大量のアクセスドメインを長時間記録し続けないようにしましょう。資料を共有する前に、ノード認証情報、サブスクリプションURL、コントロール用パスワード、個人のアクセス履歴が含まれていないか確認します。管理用認証情報を誤って公開した場合は、実際に使用している値を変更し、パネルに保存された古い値も削除してください。スクリーンショットから文字を消すだけでは不十分です。
ガイド全体の最終確認は、設定の読み込み成功、ノードの利用可能性、プロキシグループの参照関係に循環がないこと、ルールの一致結果、DNS経路の明確さ、想定どおりのTUN通信取り込み、スニッフィングによる互換性問題がないこと、必要な範囲だけでコントロールAPIにアクセスできること、の順に進めます。変更は一度に1項目に絞り、いつでも戻せる状態を残すほうが、設定を次々に追加するより管理しやすくなります。原因を特定できない場合は、個人情報を伏せたログを添えてトラブル対処カテゴリで症状ごとに確認してください。