Chapter 01 / Baseline
設定の基本構成とデバッグ基準
Clashの設定は、互いに独立した項目の一覧ではなく、順序を持つ処理チェーンです。クライアントはまず待受ポート、動作モード、DNSなどの基本項目を読み込み、次にプロキシノードとプロキシグループを展開し、その後ルールとルールセットを読み込みます。最後にシステムプロキシまたはTUNがトラフィックをカーネルへ渡します。どこかの層で存在しない名前を参照すると、後続の動作に影響します。典型例は、ルールが名前変更後のプロキシグループを指しているケースです。設定自体は解析できても、該当するトラフィックが想定どおり出口を選べなくなります。したがって、高度な調整の第一歩はパラメーターを増やすことではなく、説明・検証・切り戻しができる基準設定を作ることです。
クライアント設定とカーネル設定を分けて考える
Clash Plus、Clash Verge Rev、FlClash、Clash NyanpasuなどのGUIクライアントは、通常設定を2層に分けています。1層目はアプリ自体の設定で、自動起動、システムプロキシの切り替え、設定更新間隔、テーマ、サービスのインストール状態などです。2層目がmihomoカーネルへ渡されるYAMLです。システムプロキシのボタンは通常、購読ファイルを書き換えず、OSのプロキシ入口だけを変更します。一方、TUNの切り替えではクライアントが実行時の上書きを生成するため、元の購読ファイルにまったく同じ項目が存在しない場合があります。トラブルシューティングでは、ダウンロードしたYAMLだけでなく、現在有効な設定と購読元の内容を同時に確認してください。
デバッグ用の基本設定は、必要最小限に保ちます。ログレベルはまず info にします。接続、ルールマッチ、DNSエラーを確認するには十分で、具体的なリクエストを追跡するときだけ一時的に debug へ切り替えます。ポートを明示する必要があるかはクライアントの管理方法によって異なり、デスクトップクライアントが起動時に独自のポートを注入することもあります。設定ファイルを手動で管理する場合は次の構成を使えますが、ポートが他のプロキシアプリで使用されていないことを確認してください。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
unified-delay: true
profile:
store-selected: true
store-fake-ip: true
mode: rule はルールに応じて直接接続、プロキシ、拒否を決めます。unified-delay は接続全体に近い条件で速度を測定しますが、実際のネットワーク品質を変えるものではありません。store-selected はプロキシグループの選択状態を保存し、再起動後にグループごとに選び直す手間を省きます。store-fake-ip はFake-IPのマッピングを保存し、再起動直後のマッピング変化による接続の揺らぎを抑えます。モバイル端末ではOSがアプリを終了させることがあるため、永続化設定が特に重要ですが、クライアントに適切なバックグラウンド動作の権限を与える必要があります。
最短の経路で検証サイクルを作る
変更するたびに、まずカーネルが設定を読み込めることを確認し、次にプロキシノードが接続を確立できるか確認します。その後、テストリクエストがどのルールにマッチしたかを見て、最後に対象アプリを確認します。設定解析の段階でログにエラーが出ているなら、ノードを切り替えても意味がありません。ノードのハンドシェイクに失敗しているなら、まず購読とネットワークを確認し、DNSを先に変更しないでください。ブラウザーは正常で特定のアプリだけ失敗する場合は、そのアプリがシステムプロキシを回避していないか、独自DNSやQUICを使用していないかを確認します。この順番なら、問題を一つの層に絞り込めます。
| 確認する層 | 期待される結果 | 失敗時に優先して確認する項目 |
|---|---|---|
| 設定解析 | 設定が正常に読み込まれ、フィールドやインデントのエラーがない | YAMLのインデント、重複キー、無効な参照 |
| ノード接続 | プロキシグループに選択可能なプロキシがあり、セッションを確立できる | 購読の有効性、ネットワーク権限、プロトコルパラメーター |
| ルールマッチング | ログに、リクエストが想定したルールとポリシーにマッチしたことが表示される | ルールの順序、プロキシグループ名、ルールセットの読み込み |
| システムによる取り込み | 対象アプリのトラフィックがシステムプロキシまたはTUNへ入る | システムプロキシ、VPN権限、ルーティング競合 |
設定ファイルのインデントにはスペースだけを使い、タブを混在させないでください。コロン、シャープ記号、特殊文字を含む文字列は引用符で囲めます。ルールから参照されるプロキシグループ名は安定させてください。クライアントを変更する場合は、まずダウンロードページで対応プラットフォームを選びます。全プラットフォーム対応を優先するならClash Plusを検討し、OSと操作習慣に合わせて他のクライアントを選択してください。移行時は同じ購読を先にインポートして基本接続を確認し、その後にローカル上書きを移行します。旧クライアントが生成した実行時フィールドを、そのまま汎用設定としてコピーしないようにしてください。
Chapter 02 / Policy
プロキシグループの種類と組み合わせ方
プロキシグループはノードとルールの間に位置します。ルールは通常、特定のノードへ直接紐付けず、安定したプロキシ名へリクエストを送り、プロキシグループが出口を決定します。これによりノードが変わってもルールを変更せずに済み、手動選択、自動速度テスト、フェイルオーバー、負荷分散を別々の層に分けられます。プロキシグループを設計するうえで重要なのは、名前を明確にし、階層を増やしすぎず、用途を一つに絞ることです。一つのグループに地域選択、サービス分類、自動切り替えを同時に担わせると、短期的には便利でも、後から最終的にどの経路が選ばれたか分かりにくくなります。
select、url-test、fallback、load-balance
select は手動選択グループで、共通の入口や人が固定したい出口に適しています。ノードの品質を自動判定しないため、現在のノードが停止しても選択状態が維持される場合があります。url-test は指定URLへ接続テストを行い、結果のよいノードを選ぶため、日常の自動選択に適しています。fallback はリストの前から利用可能なノードを優先するため、出口の安定性を重視し、主系と待機系を明確にしたい場合に向いています。load-balance は複数ノードへ接続を分散します。出口の変化を許容できる並列リクエストには適していますが、ログインセッション、リスク管理の厳しいサービス、送信元アドレスの固定が必要なサービスには通常向きません。
proxy-groups:
- name: 総合選択
type: select
proxies:
- 自動選択
- フェイルオーバー
- DIRECT
- name: 自動選択
type: url-test
use:
- main-provider
url: https://www.gstatic.com/generate_204
interval: 600
tolerance: 80
lazy: true
- name: フェイルオーバー
type: fallback
use:
- main-provider
url: https://www.gstatic.com/generate_204
interval: 600
lazy: true
interval は検出間隔です。短すぎるとノードや端末の復帰処理が増え、モバイル端末ではバックグラウンド消費電力も増える可能性があります。長すぎると障害の発見が遅れます。tolerance は近い結果間で頻繁に切り替わるのを抑える値であり、速度を上乗せするものではなく安定性のしきい値です。lazy: true は実際に使うまでグループの検査を行わない設定で、アイドル時の負荷を抑えるのに適しています。テストURLには軽量で安定した応答を返すものを使い、ファイルのダウンロードURLをヘルスチェックに使わないでください。一度のテスト結果だけで長期的な安定性を判断することも避けます。
プロキシグループはサービスの意味に沿って命名する
まず「総合選択」を共通の出口として残し、用途ごとに「ストリーミング」「開発サービス」「メッセージング」などのグループを作ることをおすすめします。サービス用グループ内では「総合選択」、地域グループ、または DIRECT を参照し、ルールからはサービス用グループだけを参照します。こうするとノードの供給元を変更するときも、下位グループだけを調整でき、ルール層を安定させられます。グループ名に日本語を使うことはできますが、名前を変更した場合は rules、rule-providers の動作フィールド、他のプロキシグループからの参照も確認してください。大文字・小文字やスペースも識別子の一部であり、スペース1つの違いでも別名になります。
- name: 開発サービス
type: select
proxies:
- 総合選択
- 自動選択
- DIRECT
- name: ストリーミング
type: select
proxies:
- 総合選択
- 自動選択
rules:
- DOMAIN-SUFFIX,github.com,開発サービス
- DOMAIN-SUFFIX,githubusercontent.com,開発サービス
- MATCH,総合選択
ノードが多い場合、すべての名前を proxies に一つずつ書く必要はありません。プロキシプロバイダーの use で取り込み、フィルター式で範囲を絞れます。フィルターの精度は購読内のノード名に左右されるため、複数の供給元で命名規則が異なる場合、地域キーワードだけでは誤選択しやすくなります。まずクライアントで実際のノード名を確認してから条件を作成し、購読更新後も新しい命名が現れていないか確認してください。テスト用ノード、期限切れ表示のノード、倍率表記を除外するときは、式を広げすぎて正常なノードまで消さないようにします。
| グループの種類 | 適した用途 | 主な制約 |
|---|---|---|
| select | 手動で固定する出口、共通入口、サービス選択 | 停止したノードを自動的に回避しない |
| url-test | 日常の自動選択、ノード数の多い購読 | テスト結果は実際のサービス体感と一致するとは限らない |
| fallback | 主系と待機系の順序を明確にした安定した出口 | リストの順序を継続的に管理する必要がある |
| load-balance | 並列化でき、固定出口に依存しない接続 | セッションや送信元アドレスが変わる可能性がある |
プロキシグループのトラブルシューティングは、参照関係から始めます。まずルールがマッチしたグループ名を確認し、そのグループで現在選択されている項目を開き、実際のノードまで追跡します。自動グループが切り替わらないように見える場合は、テストURLへ到達できるか、検出間隔がまだ有効か、クライアントがバックグラウンド動作を停止していないかを確認します。特定のサービスが頻繁に再ログインするなら、負荷分散グループから固定出口グループへ移してテストしてください。プロキシ層の目的は自動化を重ねることではなく、選択結果をログとグループ構成から説明できるようにすることです。
Chapter 03 / Rules
ルールセットを購読で管理する
ルールが十数件から数百件に増えたら、すべてをメイン設定に入れ続けると保守性が急速に低下します。rule-providers はテーマごとのルールを独立したリソースに分け、メイン設定でURL、形式、更新間隔、マッチング動作を宣言するための機能です。メインファイルには呼び出し順だけを残し、ルールの内容は各ルールセットで管理します。これにより、広告ブロック、LAN、開発サービス、ストリーミングのルールを個別に更新でき、あるルールセットに問題があっても購読全体を書き直さずに停止できます。
providerの定義とRULE-SETの呼び出し
ルールプロバイダーの名前はローカル参照用の識別子にすぎず、解析に影響するのは behavior、format、リソースの内容です。behavior: domain はドメイン項目だけを含む集合に適しています。ipcidr はIPネットワーク向け、classical はタイプ接頭辞付きの従来型ルールを格納できます。形式はリモートファイルと一致させ、一般的なテキストルールには text、YAMLルールには yaml を使います。classic形式の内容をdomainとして宣言しないでください。読み込みに成功しても、正しくマッチするとは限りません。
rule-providers:
private-domain:
type: http
behavior: domain
format: yaml
path: ./ruleset/private-domain.yaml
url: https://example.com/rules/private-domain.yaml
interval: 86400
developer:
type: http
behavior: classical
format: text
path: ./ruleset/developer.list
url: https://example.com/rules/developer.list
interval: 86400
rules:
- RULE-SET,private-domain,DIRECT
- RULE-SET,developer,開発サービス
- GEOIP,LAN,DIRECT,no-resolve
- MATCH,総合選択
サンプルのドメインはフィールド構成を示すだけです。実際には、アクセス可能で内容を信頼できることを確認したルールソースへ置き換えてください。path はローカルキャッシュの保存先で、異なるプロバイダーに同じパスを使わないでください。interval の単位は秒です。公開ルールを数分おきに更新する必要は通常なく、頻繁すぎる更新はリクエストと書き込みを増やすだけです。更新に失敗しても、カーネルは通常既存のキャッシュを使い続けます。トラブルシューティングでは「初回ダウンロードの失敗」と「更新は失敗したが旧ルールが有効」を区別してください。キャッシュを削除して再試行すると、このフォールバック条件を失うため、最初に行う操作には適しません。
ルールの順序がそのまま優先順位になる
Clashは上から順に最初にマッチするルールを探し、マッチ後は処理を続けません。具体的なルールは広範なルールより前に置きます。プライベートドメインやLANは通常先に直接接続し、サービスのドメインは対応するポリシーへ送り、IPルールはアドレスを解析する必要がある位置に置き、最後に MATCH で残りのトラフィックを受けます。広範囲のプロキシルールを先頭に置くと、後ろの直接接続例外は永遠に実行されません。誤った振り分けを調べるときは、ログで「どのルールにマッチしたか」を確認するほうが、ドメインの分類を推測するより確実です。
no-resolve はIP系ルールのマッチ時に、IPを得るためのDNS解決を自動的に行わないことを示します。不要な解決を避けられますが、すべてのルールに機械的に付けるべきではありません。ドメインリクエストの前方にドメインルールがなく、後続でGEOIP判定に依存する場合、解決を完全に止めると必要なアドレスを取得できず、ルールが機能しない可能性があります。追加するかどうかは、ルールの種類とDNSモードに応じて決めてください。接続がすでに対象IPを直接取得している場合は、IPルールでも通常どおりマッチします。
少数のローカル例外は rules の先頭に直接書けます。3〜5件のためにリモートルールセットを作る必要はありません。たとえば仕事用ドメインを必ず直接接続する場合や、アプリのAPIを「開発サービス」に固定する場合は、購読ルールセットより前に置きます。例外が増え続けたら、ローカルproviderへ移行してください。メイン設定の読みやすさを保ちつつ、微調整のたびにリモートファイルを公開し直す必要がなくなります。
rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,corp.example,DIRECT
- DOMAIN-SUFFIX,github.com,開発サービス
- RULE-SET,private-domain,DIRECT
- RULE-SET,developer,開発サービス
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- MATCH,総合選択
ルールセット障害を特定する順序
まずproviderの状態が読み込み完了になっているか確認し、次にリモートの応答内容が宣言した形式と一致するかを確認します。その後、ルールセット名が RULE-SET の参照と一致するか、最後に呼び出し位置を確認します。状態が正常なのにまったくマッチしない場合、よくある原因はbehaviorの誤り、前方の広範なルールによる先取り、または対象接続がIPしか示さずルールセットがドメインしか持たないことです。更新後に誤った振り分けが急増した場合は、以前のローカルキャッシュへ戻すか、そのルールセットを一時的にコメントアウトして、上流の内容変更が原因か確認します。
ルールソースが増えるほど、更新タイミングと命名の統一は難しくなります。より安定する構成は、用途に応じて少数のルールセットを選び、各サービスに主要ソースを1つだけ設定し、ローカル例外を最優先にすることです。対象範囲が似た全集ルールを複数同時に導入し、順序だけで競合を解決しようとしないでください。複数端末で同期する場合は、複数端末の設定同期方法を参考に、メイン設定、購読リンク、ローカルルールを分けて管理します。
Chapter 04 / DNS
DNS設定の最適化と漏洩チェック
DNSはドメインをアドレスへ変換する方法を決め、ドメインルールが正確にマッチできるかにも直接影響します。ClashのDNSモジュールを有効にすると、アプリの問い合わせはまずローカルの待受へ入り、カーネルが設定に応じて上流のリゾルバーを選択します。確認すべき点は、問い合わせが本当にClashへ入っているか、各ドメインをどの上流へ渡すか、解決結果と後続接続が対応しているかの3つです。公開DNSを大量に並べても安定性が自動的に上がるわけではなく、結果の出所と障害範囲が分かりにくくなることがあります。
nameserver、default-nameserver、proxy-server-nameserver
nameserver は主要な上流リゾルバーです。default-nameserver はDoHやプロキシサーバー自身のドメインを解決するために使うので、通常は直接アクセスできるIP形式のリゾルバーを指定し、リゾルバーへ接続するために再びドメイン解決が必要になる事態を避けます。proxy-server-nameserver はプロキシノードのドメイン専用に使え、ノードアドレスの解決がサービス用DNSルールの影響を受けるのを防ぎます。購読ノードがドメインを使っていて、この層の解決に失敗すると、画面上では全ノードが同時に利用不可に見えることがありますが、原因はノードのプロトコルではありません。
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
use-hosts: true
respect-rules: true
default-nameserver:
- 223.5.5.5
- 1.1.1.1
nameserver:
- https://dns.alidns.com/dns-query
- https://1.1.1.1/dns-query
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
fake-ip-filter:
- "*.lan"
- "*.local"
- "time.*.com"
- "ntp.*.com"
respect-rules を有効にすると、DNSリクエストがプロキシルールを参照します。ただし、プロキシの解決経路がすでに動作していないと、プロキシと解決のどちらを先に用意するかという循環依存が生じる可能性があります。初期設定で上流へ到達できない場合は、まずこの項目を無効にして基本解決を確認し、その後段階的に有効化します。listen はクライアントのDNS取り込み方式と組み合わせる必要があります。デスクトップでTUNが取り込む場合、通常はLAN機器からそのポートへアクセスできるようにする必要はありません。外部向けに待ち受ける場合は、ファイアウォールとLANからのアクセス範囲も確認してください。
リゾルバー数とfallbackの動作
主要なリゾルバーは、安定したものを2〜3個選べば通常は十分です。リゾルバーごとの応答は、ネットワーク位置、CDNの振り分け、キャッシュの影響を受けるため、数を増やせば正確になるわけではありません。fallback を使う場合はフィルター条件も理解してください。条件によってはすべての問い合わせが複数経路へ送られ、待ち時間と通信量が増えます。ルールが明確な設定では、nameserver-policy でドメインごとにリゾルバーを指定するほうが、広範なフォールバック判定に頼るより説明しやすくなります。
nameserver-policy:
"geosite:private":
- system
"+.corp.example":
- 10.0.0.53
"geosite:cn":
- https://dns.alidns.com/dns-query
ポリシー内のドメインマッチは、実際のルールセットの能力に合わせる必要があります。社内ドメインを内部DNSだけで解決できる場合、内部リゾルバーへの経路が直接接続であるか、社内ネットワークへ到達できることを確認してください。内部リゾルバーを共通のnameserverに入れると、社内ネットワークの外へ出た後も問い合わせがタイムアウトし続けます。特定のサフィックスにだけ使うほうが適切です。システムで他のVPN、ネットワークフィルター、セキュリティソフトを同時に動かしている場合は、Clashより先にDNSを書き換えていないかも確認します。
DNS漏洩はまず確認範囲を定義する
DNS漏洩とは一般に、指定した経路で処理されるはずの問い合わせが、システムやアプリから別のリゾルバーへ直接送信されることです。確認時は、1つのWebサイトが示すリゾルバー名だけで判断せず、システムのネットワーク設定、Clashのログ、パケットキャプチャを組み合わせます。ブラウザーが独自のセキュアDNSを使うこともあり、モバイルアプリがDoHを内蔵していることもあります。このようなリクエストは通常のHTTPS通信に見えるため、システムの53番ポートを通るとは限りません。すべてをClashへ統一したい場合は、アプリ内の独自解決を無効にするか、DoHのドメインをルールで明示的に処理します。
| 現象 | 考えられる問題箇所 | 確認する操作 |
|---|---|---|
| すべてのノードでドメイン解決に失敗する | defaultまたはproxy-server-nameserverへ到達できない | IPリゾルバーで最小限の起動経路を作る |
| ブラウザーは正常だが、特定のアプリだけ失敗する | アプリ内蔵DNS、QUIC、またはシステムプロキシの回避 | TUNの取り込みとアプリのネットワーク設定を確認する |
| 社内ドメインを解決できない | 内部DNSへのドメイン別振り分けがない | nameserver-policyを追加して経路を確認する |
| 解決は正常だが誤ったアドレスへ接続する | キャッシュ、CDNの振り分け、Fake-IPマッピングの異常 | ログを照合してから該当キャッシュを削除する |
DNSを変更したら設定を再読み込みし、ログでDNSモジュールが正常に待ち受けていることを確認してから、通常のドメイン、社内ドメイン、ノードのドメインを個別にテストします。Webページが開かないからといって、すぐにすべてのキャッシュを消去しないでください。システム、ブラウザー、Fake-IPのマッピングが同時に変わり、変更前後を比較しにくくなります。クライアントは接続済みなのにインターネットへまったく接続できない場合は、接続済みなのにネットワークへつながらない場合のチェックリストに沿って、ノード、購読、DNS、システムプロキシ、TUNを順に確認します。
Chapter 05 / Network stack
TUNモードとFake-IPの連携
システムプロキシで対象にできるのは、プロキシ設定に従うアプリだけです。コマンドラインツール、一部のゲーム、独自ネットワークスタックを使うアプリ、UDPを直接送信するプログラムは、システムプロキシを完全に回避することがあります。TUNモードは仮想ネットワークインターフェースでシステムのルーティングを取り込み、これらのトラフィックをClashカーネルへ送るため、より広い範囲をカバーできます。Fake-IPはDNS段階でマッピングアドレスを返し、カーネルが接続を受けたときに元のドメインを復元してドメインルールを適用します。両者は併用されることが多いものの役割は異なります。TUNはトラフィックを取り込み、Fake-IPはドメインの意味を保持します。
TUNの項目とシステム権限
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
strict-route: true
mtu: 1500
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
stack はTUNが使うネットワークスタックの実装を決めます。対応するカーネルでは mixed が互換性と性能のバランスに優れます。特定のプラットフォームで異常が出た場合は system または gvisor を個別にテストできますが、比較なしに頻繁に切り替えないでください。auto-route はルートを自動設定し、auto-detect-interface は現在の出口インターフェースを検出します。Wi-Fi、モバイル通信、有線ネットワークを切り替える端末では、手動でインターフェースを指定する保守負担を減らせます。strict-route はバイパスをより厳密に防ぎますが、他のVPN、仮想マシン、コンテナネットワークとのルーティング競合が表面化することがあります。
TUNの起動には、システムレベルのVPNまたはネットワーク拡張権限が必要です。Windowsクライアントはサービスモードでネットワーク操作権限を高めることがあり、macOSではネットワーク拡張の許可が必要です。AndroidとiOSではシステムのVPN許可が表示されます。権限が拒否されると、画面上のスイッチが一時的にオンになってから戻ったり、ログにデバイス作成やルート書き込みのエラーが出たりします。この場合、購読を何度もインポートしても解決しません。先にシステムの許可を処理してください。macOSの具体的なダイアログと復旧手順は、ネットワーク拡張とキーチェーンの処理ガイドを参照してください。
Fake-IPのマッピング処理
Fake-IPモードでは、ドメイン検索を受けても実アドレスをそのままアプリへ返さず、予約アドレス範囲からマッピング値を割り当てます。アプリがそのアドレスへ接続すると、カーネルがマッピングテーブルからドメインを復元し、DOMAIN、DOMAIN-SUFFIX、ルールセットにマッチさせます。アプリが対象アドレスだけをネットワーク層へ渡す場合でも、Clashが元のドメインを保持できる点が利点です。マッピングアドレスはリモートサーバーのアドレスではなく、インターネット上のルーティングテストに使うものでもありません。198.18.0.0/16 の範囲の結果が表示される場合、通常はFake-IPが正常に解析へ参加しています。
LAN内の探索、時刻同期、プリンター、ゲームプラットフォーム、実際のDNS応答に依存するプログラムなどは、Fake-IPに適さない場合があります。その場合は fake-ip-filter に追加します。フィルター範囲はできるだけ具体的にしてください。広すぎるドメイン集合を除外すると、多数のリクエストが実アドレスモードへ戻り、ドメイン復元の効果が弱まるうえ、IPマッチに依存するルールへ影響することがあります。互換性の問題が出たら、まずログでドメインを特定し、サフィックスを1件ずつ追加して再テストしてください。出所不明の長大なフィルターリストをそのままコピーしないでください。
MTU、UDP、ネットワーク切り替え
ページは開くのに、一部の画像、アップロード、特定のアプリだけが停止する場合、パスMTUが適切でない可能性があります。TUNのカプセル化では追加のオーバーヘッドが発生します。下位ネットワークにVPN、PPPoE、モバイル通信の制限があると、1500バイトで断片化やパケットロスが起きることがあります。他の設定を変えずにMTUを段階的に下げ、まず1400前後でテストし、問題が安定して解消するか観察してください。MTUは小さいほど安全というわけではありません。小さすぎるとパケット数と処理負荷が増えるため、有効性を確認したら安定動作する範囲で大きめの値を選びます。
UDPの問題は、アプリがUDPを送信しているか、TUNが取り込んでいるか、ノードのプロトコルとネットワークが該当する転送をサポートしているかの3層に分けて確認します。DNS検索、QUIC、ゲーム、音声通信はいずれもUDPを使う可能性があります。QUICを無効にしてブラウザーが復旧しても、障害がUDP経路に集中していることが分かるだけで、DNSやノード全体が利用できないとは限りません。モバイル端末でWi-Fiとモバイル通信を切り替えた後は、古いセッションが元のインターフェースに紐付いたままになることがあります。必要ならすべての設定を消去するのではなく、TUNを再接続してください。
| 取り込み方式 | カバー範囲 | 適した場面 |
|---|---|---|
| システムプロキシのみ | HTTPまたはSOCKSプロキシ設定に従うアプリ | ブラウザー、一般的なデスクトップアプリ、低権限環境 |
| TUN + redir-host | より広いTCP/UDPトラフィック、DNSは実アドレスを返す | 実アドレスとの互換性が必要な環境 |
| TUN + Fake-IP | 広範囲を取り込み、ドメインマッチ能力を維持する | ルール振り分けが複雑で、アプリがシステムプロキシを回避する端末 |
有効化の順序は、まずシステムプロキシでノードとルールが使えることを確認し、次にTUNだけを有効にしてルートと権限を確認し、最後にFake-IPを有効にして少数の互換性例外を処理するのがおすすめです。TUNを有効にした後、端末全体がインターネットへつながらなくなった場合は、まずTUNを無効にしてネットワークを復旧し、デフォルトルート、DNSの乗っ取り、他のVPNを確認します。Windowsのサービスモード、ポート競合、システムプロキシの手順は、Windowsインストール・設定完全ガイドで確認できます。
Chapter 06 / Sniffer
ドメインスニッフィングとルール復元
Clashに入る接続の中には、対象IPだけを持ち、ドメインルールに直接使えるホスト名を含まないものがあります。ドメインスニッフィングは接続初期に識別できる情報、たとえばTLS ClientHelloのSNIやHTTPリクエストのHostを確認し、取得したドメインをルールマッチに使います。完全な通信内容を読み取る機能ではなく、すべての接続でドメインを復元できるわけでもありません。暗号化されたクライアントハンドシェイク、非標準プロトコル、IPへ直接接続するリクエスト、一部のUDP通信には、スニッフィングに適したフィールドがない場合があります。
基本設定とプロトコルの範囲
sniffer:
enable: true
force-dns-mapping: true
parse-pure-ip: true
override-destination: false
sniff:
HTTP:
ports:
- 80
- 8080-8880
override-destination: true
TLS:
ports:
- 443
- 8443
QUIC:
ports:
- 443
skip-domain:
- "+.push.apple.com"
- "Mijia Cloud"
parse-pure-ip は、IPだけで表示される対象に対してプロトコルの特徴を解析することを許可します。force-dns-mapping はFake-IPマッピングと連携し、接続とDNS問い合わせの関係を復元しやすくします。override-destination は、スニッフィングで得たドメインで対象を書き換えるかどうかを決めます。全体で書き換えを有効にするとドメインルールのマッチ率が上がる可能性がありますが、元のアドレスに依存する接続で互換性問題が起きることもあります。より安全なのは、全体では無効にし、適していることを確認したHTTPなどのプロトコル範囲だけで有効にする方法です。
ポート範囲を無制限に広げないでください。HTTPスニッフィングは明確なWebポート、TLSは主に443とサービスで使う暗号化ポート、QUICは主にUDP 443を対象にします。すべてのポートをすべてのプロトコル解析器へ渡すと、無効な判定が増え、非標準のバイナリプロトコルを誤認識する可能性もあります。特殊ポートを使うサービスでは、まずログでプロトコルとポートを確認してから範囲を追加します。ポート範囲を広げても、実際に得られる情報が増えるわけではなく、解析の試行範囲だけが広がります。
スニッフィングとFake-IPの関係
Fake-IPは、DNS経由で開始される多くの接続にドメインを保持できます。スニッフィングは補助的な経路で、アプリがシステムDNSを回避したり、キャッシュされたIPへ直接接続したり、接続情報とマッピングを関連付けられなかったりする場合に、ドメインを再取得できる可能性があります。両方を有効にしても同じ処理を重複して行うわけではありません。Fake-IPは解析段階でマッピングを作り、スニッフィングは接続段階でプロトコルのメタデータを観察します。ルールマッチを調べるときは、ログで最終的に使われたのがマッピングドメイン、スニッフィングされたドメイン、元のIPのどれかを確認してください。
スニッフィングを無効にすると特定のサービスが常に MATCH に入り、有効にするとドメインルールへマッチする場合、元の接続に利用可能なドメイン情報がなかったことを示します。逆に、有効化後に誤ったポリシーへ送られる場合は、取得したドメインが共有CDN、リダイレクト先、サードパーティAPIのものではないか確認します。1つのアプリが複数のドメインへ同時にアクセスすることは多く、メインサイトのドメインだけで全接続を判断できません。ログレベルを一時的に上げて短時間テストを行い、完了後は info に戻してください。
スキップリストと互換性の境界
skip-domain は、既知の非対応ドメインを改変や解析から除外するために使います。項目は実際の障害検証に基づいて追加し、一度に広範なリストを登録しないでください。一部のデバイス探索やプッシュ通知サービスは、証明書のドメイン、接続先アドレス、サービス識別子が完全には一致しない仕組みを使います。誤った書き換えは接続の重複を引き起こす可能性があります。スキップ項目を追加したら、古い接続には新しいルールが自動適用されないため、対象アプリを再接続してください。
| ログの表示 | 説明 | 次の手順 |
|---|---|---|
| 対象IPしか表示されない | ドメインを取得できない、またはプロトコルをスニッフィングできない | DNSの取り込み、プロトコル、ポート範囲を確認する |
| ドメインを取得したのにMATCHへ入る | ルールにそのドメインがない、または順序で先に捕捉されている | 実際のドメインを確認してルール位置を調整する |
| 書き換えを有効にすると接続に失敗する | 対象が元のアドレスに依存している、または識別結果が書き換えに適していない | 全体の書き換えを無効にするか、正確なスキップ項目を追加する |
| ブラウザーは正常だがQUICだけ異常 | UDP経路、ノードの対応状況、QUICスニッフィングの問題 | QUICを無効にして比較し、TUNのUDP処理を確認する |
スニッフィング設定を検証するときは、ルールが明確なドメインを1つ選び、まず無効時のマッチ結果を記録してから、有効化後に接続を再確立して比較します。DNS、ルールセット、対象ポリシーを同時に変更しないでください。どの層の変化か判断できなくなります。システムプロキシモードでブラウザーだけをテストする場合、ブラウザーは通常すでにドメインをプロキシへ渡しているため、スニッフィングによる差は小さいことがあります。TUNでの取り込み、IPのみの接続、システムDNSを回避する場面で特に有効です。
ドメインスニッフィングはルール設計の代わりにはなりません。ドメインを復元できても、広範なルールより前に具体的なルールを置き、対応するプロキシグループが存在することを確認する必要があります。アプリが動的なサブドメインへ大量にアクセスする場合は、確認済みのサフィックスルールやルールセットを優先し、完全なドメインを追加し続けないでください。関連用語は用語ガイドで確認できます。SNI、Fake-IP、TUN、ルールモードの関係も解説しています。
Chapter 07 / Merge
ローカル上書きと複数購読の統合
購読はリモートで管理されるノードと基本設定を提供し、ローカル上書きは端末や個人環境固有の調整を保存します。両方を同じファイルへ直接書き込むと、次回の購読更新でローカル内容が上書きされる可能性があります。一方、静的設定として完全にコピーするとノード更新を失います。購読を上流入力として扱い、ポート、DNS、プロキシグループの追加、ルールの前置き、TUN設定を再適用可能な上書き層へ分ける構成が適切です。クライアントによってMerge、Mixin、Script、グローバル拡張など名称は異なりますが、目的は更新後に有効設定を再生成することです。
置換、追加、ディープマージを区別する
YAMLのオブジェクトはキー単位で統合できますが、配列には異なる意味があります。dns.enable の変更は通常1つのフィールドだけを置き換えます。一方、rules では、ルールを前置きするのか、後置きするのか、配列全体を置換するのかを明確にする必要があります。マージャーが新しい配列で古い配列を直接上書きすると、ローカルルール3件だけを含む上書きによって、購読側のルールがすべて消えることがあります。クライアント内蔵の統合機能を使う前に、上書き断片が保存されたかだけでなく、最終的な有効設定を確認してください。
prepend-rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,corp.example,DIRECT
append-rules:
- MATCH,総合選択
override:
mode: rule
log-level: info
ipv6: false
上の構成は「前置き」「後置き」「置換」という3つの意図を示すものです。具体的なキー名はクライアントの統合実装によって異なるため、確認せずにmihomoのネイティブ設定として読み込まないでください。mihomoが最終的に受け取るのは完全な設定です。検証時はクライアントが生成した実行時設定を開き、ローカルルールが想定位置にあり、プロキシグループが重複せず、最終的に MATCH が1つだけ残っていることを確認します。クライアントに設定チェック機能がある場合は、更新のたびに実行してください。
複数購読の統合はノード層を中心に行う
複数の購読を同時に使う場合、通常は別々の proxy-providers として定義し、ローカルのプロキシグループから use で取り込む方法が最も安定します。複数の完全な設定ファイルを直接連結する方法はおすすめしません。完全設定にはそれぞれポート、DNS、プロキシグループ、ルールが含まれるため、同名キーが上書きされ、同名グループが競合し、最終結果が統合ツールの実装に左右されます。ノードプロバイダーはノード集合だけを担当し、メイン設定はポリシーとルールを統一して管理すると、役割が明確になります。
proxy-providers:
primary:
type: http
url: https://example.com/subscription/primary
path: ./providers/primary.yaml
interval: 86400
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 600
backup:
type: http
url: https://example.com/subscription/backup
path: ./providers/backup.yaml
interval: 86400
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 900
proxy-groups:
- name: 総合選択
type: select
use:
- primary
- backup
proxies:
- DIRECT
サンプルの購読URLは構成例です。実際には自分の有効なURLへ置き換え、アクセス資格情報を含むリンクをドキュメント、スクリーンショット、共有リポジトリで公開しないでください。2つのproviderには異なるキャッシュパスを指定する必要があります。ヘルスチェック間隔は端末とノード数に応じて調整し、モバイル端末では多数のノードを高頻度でポーリングしないでください。上流ノード名が重複すると画面上で供給元を区別しにくくなるため、クライアントが対応していれば統合層で接頭辞を付けるか、異なるproviderを独立した地域グループへ入れてください。長いリストに直接混在させる方法は避けます。
更新失敗と設定ドリフト
複数購読環境でよくある問題は、ある時点で設定を読み込めないことではなく、運用を続けるうちに少しずつ想定からずれることです。上流がノード名を変更するとフィルター式が機能しなくなり、地域が削除されるとプロキシグループが空になることがあります。同名ノードが追加されれば、手動選択が別の供給元を指すこともあります。更新後はproviderの状態、プロキシグループのメンバー数が妥当か、主要サービスのルールが存在するグループを参照しているかを確認してください。架空の固定ノード数を監視条件にせず、「グループが空か」「参照先が存在するか」「重要なリクエストがマッチするか」を重視します。
端末間で同期するときは、クライアントのデータディレクトリ全体を直接同期しないことをおすすめします。デスクトップとモバイルでは、権限、パス、TUNインターフェース名、キャッシュ場所が異なります。同期に適しているのは購読入口、ローカルのメイン設定テンプレート、ルールセット、上書きロジックです。端末固有の項目は各クライアントに残してください。WebDAV、購読配布、手動インポートの違いについては、Clashの複数端末設定同期方法も参照できます。
| 内容 | リモート管理に適するもの | ローカル保存に適するもの |
|---|---|---|
| ノード集合 | 購読またはproxy-provider | 一時テスト用ノード |
| 公開ルールセット | rule-provider | 少数の端末固有設定と社内ネットワーク例外 |
| プロキシグループの基本構成 | 管理下に置くメイン設定 | 手動選択状態と端末ごとの差異 |
| TUN、ポート、権限に関する項目 | 通常はプラットフォーム間で直接同期しない | 端末とOSごとに管理する |
Chapter 08 / Controller
外部コントロールパネルと運用保守
mihomoは外部コントロールインターフェースを提供し、クライアント画面やブラウザーのコントロールパネルからプロキシグループの確認、ノード切り替え、接続の表示、providerの更新、ログの確認を行えます。コントロールインターフェースは稼働中のカーネルを管理するもので、設定ファイルの代わりにはなりません。パネルで一時的にポリシーを切り替えるとすぐ反映されますが、ルールの追加、DNSの調整、TUNパラメーターの変更には設定の変更と再読み込みが必要です。コントロールインターフェースは設定エディターではなく、実行状態への入口と考えるのが適切です。
待受アドレス、シークレット、アクセス範囲
external-controller: 127.0.0.1:9090
secret: "your-password"
external-ui: ./ui
external-ui-name: dashboard
ローカルだけで使う場合、コントロールアドレスは 127.0.0.1 で待ち受けさせます。0.0.0.0 にすると他のネットワークインターフェースからの接続も受け付けるため、LANからの管理が明確に必要で、ファイアウォールを設定している場合だけ使用してください。secret はインターフェースの認証に使います。自分で生成した独立した値を使い、購読アクセス用のパラメーターや他のアカウントと共有しないでください。パネルページとコントロールインターフェースを別の場所に配置することはできますが、ブラウザーがインターフェースのアドレスへアクセスでき、プロトコル、セキュアコンテキスト、CORSの条件を満たす必要があります。
リモート管理でコントロールポートを公共ネットワークへ直接公開しないでください。信頼できるLANからアクセスするか、管理された安全なトンネルを経由して端末のネットワークへ入る方法がより安全です。家庭のルーター上で動くClashの状態を見るだけなら、送信元アドレスを制限し、ファイアウォールルールを維持してください。コントロールインターフェースでは出口の切り替え、接続の終了、実行情報の取得ができるため、アクセス範囲はルーター管理画面と同じ慎重さで管理します。
接続ページとログを組み合わせる方法
接続一覧には通常、送信元、宛先、プロトコル、ルール、ポリシーチェーン、通信状態が表示されます。特定のアプリを調べるときは、まず表示範囲をクリアするか宛先で絞り込み、その後にリクエストを1回再現します。ポリシーチェーンからは、リクエストが最初に入ったサービス用グループと、最終的に到達したノードが分かります。ルール欄からは、どのルールがマッチしたかを確認できます。ページが開かないのに接続一覧へ記録がまったくない場合、問題はカーネルへ入る前に発生している可能性が高いため、システムプロキシ、TUNルート、アプリ自身のプロキシ設定を確認します。
日常利用ではログレベルを info に保ちます。DNS、ハンドシェイク、スニッフィングの詳細を特定するときだけ、短時間 debug へ切り替え、1回再現したらすぐ戻してください。詳細ログを長時間有効にすると出力量が増え、本当のエラーが大量の正常記録に埋もれます。ログを共有する前に、購読URL、社内ドメイン、宛先アドレス、認証フィールドを確認し、障害発生時刻に関係する部分だけを抜き出してください。
providerの更新とポリシー状態
コントロールパネルでは通常、プロキシプロバイダーとルールプロバイダーを手動更新できます。更新ボタンは対象リソースの更新を開始するだけで、設定全体の再読み込みを意味しません。プロキシproviderを更新すると、新しいノードはそれを参照するプロキシグループへ入りますが、現在の接続がすべて自動移行するわけではありません。ルールproviderを更新すると、新しいリクエストは新ルールでマッチしますが、既存の長時間接続は元のポリシーを維持する場合があります。更新結果を確認するときは、テスト接続を再確立し、ボタンの回転が完了したかだけでなくproviderの最終エラー状態も確認してください。
選択したポリシーの保存は、profile.store-selected とクライアントのデータディレクトリへの書き込み権限に依存します。再起動するたびにデフォルトノードへ戻る場合は、まず最終設定にこの項目が存在するか確認し、次にクライアントが実行ディレクトリへ書き込めるか確認します。複数の設定で同じグループ名を使っていると、保存状態によって切り替え後の結果がデフォルト設定と異なって見えることもあります。テストでは、名前の分かりやすい新しいグループを作り、保存機能が正常に動くことを確認してから古い状態を処理してください。
| パネルの機能 | 適した用途 | 代替できないもの |
|---|---|---|
| ポリシー切り替え | 出口の即時選択と比較テスト | プロキシグループの構成設計 |
| 接続の確認 | ルール、ポリシーチェーン、プロトコルの確認 | システム層のパケットキャプチャとルート確認 |
| Providerの更新 | ノード集合またはルールリソースの更新 | 完全な設定の再読み込み |
| ログの確認 | 解析、接続、ルールのエラー特定 | 長期的な性能評価 |
再現可能な保守手順
日常の保守は4段階に固定できます。まず購読とproviderを更新し、すべてのリソースの読み込み完了を確認します。次に「総合選択」と主要サービス用グループに利用可能なメンバーが残っているか確認します。その後、1つのドメインリクエストとTUNが必要なアプリ1つを使ってルールチェーンを確認し、最後に通常のログレベルへ戻して現在利用できる設定をエクスポートします。更新後に異常が出たら、まず変更範囲を比較します。ノードだけが変わったならproviderとプロキシグループを確認し、ルールセットだけが変わったならマッチ順を確認します。クライアントの更新やシステムネットワークの変更後は、権限とルートを重点的に確認してください。
コントロールパネルへ接続できない場合は、まずカーネルが動作していることを確認し、次にコントロールアドレス、ポートの使用状況、シークレットを確認します。ブラウザーでローカルのパネルを開きながら、リモート端末のインターフェースへ接続する場合は、アドレスがブラウザーを実行している端末の 127.0.0.1 になっていないかも確認してください。クライアントにコントロールページが内蔵されている場合は、まず内蔵入口を使います。通常は現在のポートと認証情報が自動処理されます。クライアントを選び直す場合は、比較ガイドでプラットフォームごとの差異を確認し、インストーラーはダウンロードページから入手してください。
次の手順
設定は一度に1つの変数だけ調整する
まず現在の問題に該当する章から変更を1つ選び、再読み込み後にログと接続ページで検証します。基本操作に戻る必要がある場合はクイックスタートガイドを、専門用語を確認する場合は用語ガイドを参照してください。クライアントは接続済みなのにネットワークが切断された場合は、項目別チェックリストで問題箇所を特定します。