CONFIG.YAML / システムリファレンス

Clash YAML
設定ファイルリファレンス

トップレベルの構造から始め、ポート、動作モード、DNS、プロキシノード、プロキシグループ、ルール分岐、上書き・マージを項目ごとに確認できます。例ではmihomo互換構文を使用し、フィールド間の依存関係やよくある境界条件も説明します。

mixed-port dns proxies proxy-groups rules rule-providers
読み方

利用ガイドでは、インストール、サブスクリプションの読み込み、ノード選択、システムプロキシの有効化までを案内します。本ページでは、なぜそのように設定するのか、問題が起きたときにどこを確認するのかを解説します。初めて使う場合は、まずクイックスタートを完了してから、実際の問題に応じて本ガイドを参照してください。クライアントを変更する場合は、ダウンロードセンターでプラットフォームとアーキテクチャを確認できます。GUIクライアントではClash Plusを推奨します。

設定ファイルはYAMLのインデント規則に従います。本文の例にあるサーバーのドメイン、パスワード、トークンは明確なサンプル値です。コピー後は必ず自分の有効な情報に置き換えてください。編集前に元ファイルを保存し、1つの箇所を変更したらすぐに設定チェックまたは再読み込みを実行します。関係のない複数のモジュールを一度に変更しないでください。

CHAPTER 01

YAML構造の概要とインデント規則

トップレベルのキーで設定の読み込み順を理解する

実行可能なClash設定は通常、共通設定、DNS、プロキシノード、プロキシプロバイダー、プロキシグループ、ルールプロバイダー、ルール一覧で構成されます。これらはすべてYAMLのトップレベルに置かれ、名前で相互に参照されます。コアはファイルを読み込む際、まずYAML構文を解析し、次にノードとプロキシグループを構築し、最後にルールの参照先が存在するかを確認します。通常、記述順は解析結果に影響しませんが、「基本設定、DNS、ノード、プロキシグループ、ルール」の順に並べると手動確認が容易になり、未定義のオブジェクトを参照する際の混乱も減らせます。

最小構成はポートが1つだけという意味ではありません。ルールモードを有効にする場合、利用可能なプロキシグループなどのポリシー対象と末尾のルールが少なくとも必要です。プロキシグループがノード名を参照するなら、そのノードも存在しなければなりません。RULE-SETを使う場合は、対応するrule-providers項目も必要です。サブスクリプション生成ツールがこれらを補うこともありますが、手動設定では参照関係を自分で完結させる必要があります。名前は大文字と小文字を区別します。日本語、空白、記号も使えますが、上書きスクリプトの文字列一致で問題が起きないよう、常に同じ表記を保ってください。

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false

dns:
  enable: true
  enhanced-mode: fake-ip
  nameserver:
    - https://dns.example/dns-query

proxies:
  - name: "サンプルノード"
    type: ss
    server: proxy.example.com
    port: 443
    cipher: aes-128-gcm
    password: "your-password"

proxy-groups:
  - name: "ノード選択"
    type: select
    proxies:
      - "サンプルノード"
      - DIRECT

rules:
  - DOMAIN-SUFFIX,example.com,ノード選択
  - MATCH,DIRECT

インデント、リスト、データ型

YAMLでは空白で階層を表します。各階層は2つのスペースを推奨し、インデントにタブを混在させないでください。同じ階層のキーは揃え、リスト項目にはハイフンとスペースを使います。上の例では、dnsはマッピング、nameserverはリスト、proxiesは複数のノードマッピングで構成されたリストです。スペースが1つ多いだけでフィールドが誤ったオブジェクトに入り、ハイフンが1つ欠けるだけでリストが通常の文字列になることがあります。エディターに空白文字の表示機能がある場合は、トラブル対処時に有効にしてください。

真偽値はtrueまたはfalseとし、ポートは引用符なしの整数で記述します。ノード名、プロキシグループ名、パスワードはダブルクォートで囲むのがおすすめです。特に、コロン、シャープ、カンマ、アスタリスク、前後の空白、真偽値に見える単語を含む場合は必須です。シャープはコメントの開始を示すため、引用符で囲んでいないパスワードに含まれると、その後ろがコメントとして解析されます。数字だけのパスワードも、先頭のゼロが処理されるのを防ぐため引用符で囲んでください。空値をむやみに空文字列で書かず、不要なオプションフィールドは通常、行ごと削除します。

引用符、アンカー、重複キー

ダブルクォートではバックスラッシュのエスケープが処理され、シングルクォートでは基本的に原文のまま保持されます。通常の名前にはダブルクォートが最も分かりやすいでしょう。正規表現、Windowsパス、大量のバックスラッシュを含む内容では、エスケープ結果を特に確認してください。YAMLアンカーでマッピングを再利用できますが、クライアントによって前処理の流れが異なり、アンカーの扱いが変わることがあります。複数クライアントで利用するサブスクリプションファイルでは、完全なフィールドを優先し、複雑なアンカーやマージキーに依存しすぎないでください。

同じマッピング内に重複キーがある状態は危険です。たとえばトップレベルにdnsを2回書くと、後者を採用するパーサーもあれば、エラーにするツールもあり、結果を保証できません。サブスクリプションの上書きでよくある障害は、新しいモジュールを末尾に追加したものの、元のモジュールを削除していないケースです。確認時はトップレベルのキーが1回だけ現れるか検索し、上書き部分だけでなく、クライアントが最終的に生成した実行設定も確認してください。

設定ファイルの拡張子は通常.yamlまたは.ymlで、構文は同じです。ファイルのエンコーディングにはUTF-8を推奨します。異なるシステム間でプロキシグループの日本語名が文字化けするのを防げます。改行コードは通常クライアントが処理できますが、Windowsで編集したファイルをLinuxのサービスで使う場合は、見えない制御文字が混入しないよう注意してください。まずYAMLとして解析できることを確認し、その後にノードの接続性やルールのマッチを調べます。これがトラブル対処の第一関門です。

CHAPTER 02

共通フィールド:ポート、モード、コントロールAPI

リスニングポートの使い分け

portはHTTPプロキシの待受、socks-portはSOCKS5の待受に使われ、mixed-portは同じポートでHTTPとSOCKS5の両方を受け付けます。デスクトップのGUIクライアントでは通常、mixed-portを1つ用意すれば十分で、システムプロキシが自動的にそこを指します。別のアプリがSOCKS5アドレスを明示的に要求する場合は、socks-portを個別に設定できます。複数の待受ポートで同じ番号を使うことはできず、システム上の他のサービスとも競合させないでください。

redir-porttproxy-portは主にLinuxゲートウェイ、ルーター、透過プロキシのルールで使用します。デスクトップ環境では、「より多くの通信をカバーする」ためだけに不用意に有効化しないでください。TUNモードには独立した仮想NICとルーティング経路があり、待受ポートを単純に1つ増やすものではありません。2つの取り込み方式を比較する場合は、TUNモードとシステムプロキシの違いを参照し、まず通信がどこからコアに入るのかを確認してから関連フィールドを選びます。

mixed-port: 7890
allow-lan: false
bind-address: "*"
mode: rule
log-level: info
ipv6: false

external-controller: 127.0.0.1:9090
secret: "your-controller-secret"

profile:
  store-selected: true
  store-fake-ip: true
フィールド 用途 よくある設定 確認ポイント
mixed-port HTTPとSOCKS5のリクエストをまとめて受け付ける デスクトップクライアントでローカルポートを1つだけ使う 他のプロセスが使用していないことを確認する
allow-lan LAN内のデバイスからの接続を許可する 本機だけで使う場合はfalseにする 有効化後はファイアウォールも確認する
bind-address 待受アドレスを限定する LAN共有と組み合わせて使う コントロールAPIをプロキシポートと取り違えない
mode ルール、グローバル、ダイレクトの処理を決める 日常利用では通常ruleにする クライアントの画面がファイルの値を上書きすることがある

LANアクセスとバインドアドレス

allow-lanは、他のデバイスが現在の端末のプロキシポートへ接続できるかどうかを決めます。falseなら単体利用に適しています。trueにした場合は、OSのファイアウォール、待受アドレス、LAN分離設定も確認してください。LANアクセスを許可しただけで、スマートフォンやテレビが自動的にプロキシ設定されるわけではありません。対象デバイスで、Clashを実行している端末のLANアドレスと待受ポートを入力する必要があります。アドレスが変わると接続できなくなるため、継続的に共有する場合はホストに安定したLANアドレスを割り当ててください。

bind-addressは待受範囲を制限します。クライアントによっては「LAN接続を許可」するスイッチに応じてこのフィールドを自動生成するため、起動時に画面の設定でファイルの値が上書きされることがあります。トラブル対処では実際の待受アドレスを確認してください。127.0.0.1だけを待ち受けている場合、他のデバイスからアクセスできません。すべてのインターフェースで待ち受ける場合は、コントロールAPIとプロキシポートを信頼できないネットワークへ直接公開しないようにしてください。プロキシの待受と外部コントロールAPIは別のサービスであり、混同してはいけません。

動作モード、ログ、状態の保存

mode: rulerulesを上から順に照合する、日常設定の中心となるモードです。globalは通信をグローバルプロキシへ渡すため、特定のノードが使えるか一時的に確認するのに適しています。directはリクエストを直接接続し、問題がプロキシ経路にあるかを切り分けるのに役立ちます。GUIクライアントのモードボタンは実行中の状態だけを切り替え、元のサブスクリプションファイルへ書き戻さないことがあります。ファイルのmodeだけでなく、クライアントの現在の画面も確認してください。

log-levelは通常infoを使い、トラブル対処時だけ一時的にdebugへ上げ、終了後に戻します。ログが多すぎると判断の妨げになります。ipv6はコアがIPv6関連の機能を処理するかを制御しますが、ローカルネットワーク自体にIPv6ルートがない問題を解決するものではありません。有効化後に接続待ちが発生した場合は、DNSがIPv6アドレスを返していないか、システムに利用可能なIPv6出口があるか、ルールが対象アドレスをカバーしているかを確認してください。

external-controllerは画面とコアが通信するコントロールアドレスを提供し、通常は本機のループバックアドレスにバインドします。secretはコントロールAPIのアクセス資格情報なので、サンプル値を必ず置き換えてください。これはプロキシノードのパスワードではなく、リモート接続にも使われません。profile.store-selectedはプロキシグループの選択を保存し、profile.store-fake-ipはFake-IPのマッピング状態を保存します。サブスクリプション更新後に選択が毎回リセットされる場合は、YAMLだけでなくクライアント側の永続化設定も確認してください。

CHAPTER 03

DNS設定:名前解決の経路とFake-IP

まず、どこが名前解決を開始しているかを確認する

DNS設定はドメイン名をアドレスへ変換する方法を決め、ルールが適切な段階でドメインを識別できるかにも影響します。ブラウザーがシステムDNSやセキュアDNS、自身のキャッシュを使うこともあれば、OSが古い結果を保持していることもあります。TUNモードでは、より多くのDNSリクエストをコアへ渡す場合があります。「ノードは使えるのにWebサイトが開かない」とき、すぐに全ノードを交換しないでください。まずリクエストがClashのDNSに入っているか、名前解決の結果へ到達できるか、最終的にどのプロキシグループが選ばれたかを確認します。

dns.enableは内蔵DNSモジュールを有効にします。listenはDNSサービスの待受アドレスを指定しますが、通常のGUIクライアントではクライアント側が管理します。LANへ手動で公開する前に、ファイアウォールへの影響を理解してください。nameserverは主要なリゾルバーで、通常のアドレスだけでなくDoHアドレスも指定できます。目的なくリゾルバーを増やしすぎると、応答差がトラブル対処を難しくします。

dns:
  enable: true
  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.example/dns-query
  proxy-server-nameserver:
    - https://resolver.example/dns-query
  direct-nameserver:
    - 223.5.5.5
  fake-ip-filter:
    - "*.lan"
    - "*.local"
    - "time.*.com"
    - "+.stun.*.*"

各nameserverの役割

default-nameserverは主にDoHまたはDoTサーバー自身のドメインを解決し、起動時の基礎リゾルバーとしても使われます。「リゾルバーを使うために、まずリゾルバーのドメインを解決する」という循環を避けるため、ここには直接アクセスできるIPアドレスを指定することが多いです。すべての業務ドメイン用のデフォルト出口ではないため、大量のアドレスを追加して主DNS設定の代わりにすることはできません。

nameserverは通常のドメイン検索を担当します。proxy-server-nameserverはプロキシノードのサーバードメインを専用に解決し、まだ確立していないプロキシ接続にノードの名前解決が依存するのを防ぎます。ノードアドレスがIPなら影響は小さいですが、ドメインで起動時に名前解決エラーが続く場合は重点的に確認してください。direct-nameserverはダイレクト接続用の名前解決に使えます。ルールに従うDNS経路と組み合わせれば、ダイレクト対象とプロキシ対象で異なる名前解決戦略を採用できます。

respect-rulesを有効にすると、DNSクエリがトラフィック分岐ルールにより厳密に従いますが、プロキシグループとリゾルバーの設定に依存します。誤ったルール対象、利用できないプロキシリゾルバー、循環参照があると、ノードが使える前からプロキシを待ち続けることがあります。有効化後にすべてのドメインが解決できなくなったら、まず簡単な設定へ戻してください。アクセス可能なnameserverを1つ残し、複雑な分岐を無効にして基本の名前解決を確認してから、専用リゾルバーを1つずつ追加します。

Fake-IPとredir-hostの違い

enhanced-mode: fake-ipはドメインに対して予約アドレス範囲の一時アドレスを返し、コアが「一時アドレスと元のドメイン」の対応を管理します。ドメイン情報を早い段階で保持できるため、ルール判定が直接的になり、ドメインルールを迂回する一部アプリへの対処にも役立ちます。fake-ip-rangeには専用の予約アドレス範囲を使い、実際のLAN、社内ネットワーク、仮想マシンのネットワークと重複させないでください。LANアドレスが競合すると、一部の社内サービスだけ開けず、通常のインターネットアクセスは正常という症状が出ることがあります。

redir-hostは実際の名前解決アドレスを返すため、従来型の経路との互換性が高い一方、透過的な取り込みでは元のドメイン情報を早い段階で失うことがあります。どちらを選ぶかは、アプリの互換性と通信の取り込み方式で判断し、特定のモードが常に速いと考えないでください。デスクトップクライアントでFake-IPを使い、プリンター、LAN機器、時刻同期、ゲームのLAN検出だけに問題がある場合は、まずfake-ip-filterを追加します。DNSモジュール全体を無効にする必要はありません。

fake-ip-filterに登録したドメインはFake-IPを迂回し、実際のアドレスを返します。フィルター範囲はできるだけ正確にしてください。広すぎるワイルドカードを追加すると、大量のドメインがFake-IP処理を失い、「ルールはあるのにマッチが安定しない」状態になります。項目を追加した後は、古いマッピングが残る可能性があるため、クライアントのDNSキャッシュを削除するかコアを再起動してください。OSとブラウザーにも個別のキャッシュがあるので、必要に応じてそれぞれ更新します。

DNS障害の段階的な確認

第1段階で設定を読み込めるか、第2段階でリゾルバーアドレスへ現在のネットワークからアクセスできるか、第3段階でノードサーバーのドメインを解決できるか、第4段階で業務ドメインのルールを確認し、最後にアプリのキャッシュを調べます。ログにタイムアウトが出た場合は、UDP DNS、DoH接続確立、プロキシノード接続のどれが遅いのかを区別してください。アドレスは取得できるのに接続できないなら、問題は名前解決からルーティング、ルール、ノードの段階へ移っています。

DNSを同時に変更し、TUNを有効化し、Fake-IP範囲を変え、ルールセットまで交換しないでください。動作する基準設定を1つ残し、毎回1つのモジュールだけ変更するのが正しい方法です。接続速度低下をさらに段階的に調べる方法は、Clashが遅いときの調べ方を参照してください。DNSは名前解決の経路を担当するだけで、品質の低い遠隔回線を改善したり、適切なノードやプロキシグループの選択を代替したりするものではありません。

CHAPTER 04

プロキシノードのフィールドとプロキシプロバイダー

ノードオブジェクトの共通構造

proxiesは静的なノード一覧です。各項目には少なくとも名前、タイプ、サーバーアドレス、ポートを含め、プロトコルに応じて認証やトランスポートのフィールドを追加します。nameは設定全体で使う参照識別子で、プロキシグループはこの名前でノードを探します。同名ノードがあると選択や上書きの結果が不確定になるため、サブスクリプションをマージした後は名前が一意か確認してください。serverにはドメインまたはIPを指定でき、portはサーバー側の実際の待受ポートと一致させます。

プロトコルの種類によって利用できるフィールドが決まるため、あるプロトコルのパラメーターを別のプロトコルへ機械的にコピーしないでください。暗号方式、ユーザー識別子、トランスポート層、TLS、サーバー名はすべてサーバー側の設定と一致させる必要があります。クライアントがYAMLを読み込めても、構文とフィールド構造が基本的に有効というだけで、リモート認証の成功までは意味しません。ログに出るハンドシェイク失敗、認証失敗、接続拒否、タイムアウトはそれぞれ異なる段階を示すため、エラーの段階に応じて対処します。

proxies:
  - name: "SS サンプルノード"
    type: ss
    server: ss.example.com
    port: 443
    cipher: aes-128-gcm
    password: "your-password"
    udp: true

  - name: "Trojan サンプルノード"
    type: trojan
    server: trojan.example.com
    port: 443
    password: "your-password"
    sni: service.example.com
    skip-cert-verify: false
    udp: true

  - name: "Hysteria2 サンプルノード"
    type: hysteria2
    server: hy2.example.com
    port: 443
    password: "your-password"
    sni: service.example.com
    skip-cert-verify: false

認証、TLS、トランスポートのフィールド

Shadowsocksノードでは、cipherpasswordudpがよく使われます。暗号方式はサーバー側と同じにする必要があり、名前が似ていても代用できません。Trojan系ノードはTLSに依存し、パスワードに加えてsniが必要になることもあります。SNIはハンドシェイクで使うサーバー名です。接続先アドレスと同じ場合もあれば、サービス提供者から指定される場合もあります。誤って入力するとTCP接続は成功してもTLSハンドシェイクに失敗します。

skip-cert-verifyは証明書検証を制御します。通常の設定ではfalseを維持し、サーバー名、システム時刻、証明書チェーンの問題を先に修正してください。trueへの変更は、証明書検証が故障箇所かを切り分ける場合だけに使い、一般的な修復方法にはしないでください。システム時刻のずれ、制限されたネットワークによる遮断、誤ったSNIはいずれも証明書関連のエラーを引き起こします。「接続失敗」という表示だけでは原因を判断できないため、ログのハンドシェイク段階も確認してください。

VMess、VLESS、TUIC、Hysteria2などでは、ユーザー識別子、ネットワークタイプ、WebSocketパス、HTTPヘッダー、フロー制御、輻輳制御のフィールドが含まれることもあります。フィールドの集合はコアの機能やサーバー側の構成によって変わります。ノードを手動で移行する場合は、元のサブスクリプションと現在のコアのドキュメントを基準にし、別のノードの見た目だけでフィールドを追加しないでください。オリジナルClash、Meta、mihomoの名称と互換性については、コアバージョンの選び方を参照してください。

proxy-providersのオンデマンド読み込み

ノード数が多い場合やリモート更新が必要な場合は、proxy-providersを使えます。プロバイダーはノードの集合で、プロキシグループからuseで参照します。一般的なタイプはHTTPまたはローカルファイルです。リモートプロバイダーには、URL、更新間隔、保存先、ヘルスチェックを指定します。保存先はクライアントが書き込みを許可している場所にしてください。コンテナやサービスとして動かす場合は、ディレクトリ権限も確認します。リモートURLのクエリパラメーターにはアクセス資格情報が含まれることがあるため、公開ログや公開サンプルに書かないでください。

proxy-providers:
  provider-main:
    type: http
    url: "https://subscription.example/config?token=xxxx"
    path: ./providers/provider-main.yaml
    interval: 3600
    health-check:
      enable: true
      interval: 600
      url: https://www.gstatic.com/generate_204

proxy-groups:
  - name: "サブスクリプションノード"
    type: select
    use:
      - provider-main
    proxies:
      - DIRECT

intervalは更新間隔であり、起動するたびに必ず即時ダウンロードするという意味ではありません。クライアント独自の更新ボタンやキャッシュ戦略が使われることもあります。health-checkは固定アドレスでノードの到達性を確認し、その結果を画面表示や自動プロキシグループの選択に使います。ただし、1つのテストアドレスだけで、すべてのWebサイトが利用できるとは判断できません。テストに失敗したら、まずそのアドレスが現在のネットワークから到達可能か確認し、その後でノード障害を判断してください。

proxiesuseは同じプロキシグループ内に共存できます。前者は固定ノードや内蔵アクションを列挙し、後者はプロバイダーの集合を取り込みます。上書きツールはこの2種類のフィールドを異なる方法で処理することがあり、静的ノードを追加してもプロバイダーへ自動的に追加されるとは限りません。サブスクリプション更新後にノードが消えた場合は、リモートプロバイダーの更新成功、保存先の書き込み可否、プロキシグループが正しいプロバイダー名を参照しているかを確認します。

CHAPTER 05

プロキシグループ:手動選択と自動テスト

プロキシグループはルールとノードの中間層

proxy-groupsは複数のノード、他のプロキシグループ、内蔵アクションを選択可能な対象としてまとめます。ルールは通常、特定のノードを直接指定せず、「ノード選択」「ストリーミング」「ダウンロード」などのプロキシグループを指定します。これにより、ノードを変更してもルールを書き直す必要がありません。プロキシグループ名も大文字と小文字を区別するため、ルールの対象、上位グループの参照、画面表示をすべて一致させてください。

グループは入れ子にできますが、循環参照は作れません。たとえばAがBを参照し、BがAを参照すると、設定チェックに失敗したり動作が不安定になったりします。プロキシグループの階層は一方向に設計してください。上位の業務グループが地域グループを参照し、地域グループが個別ノードを参照する形が基本です。下位グループから上位グループを逆参照しないでください。階層が深すぎると選択も難しくなるため、通常は2~3層で十分です。

proxy-groups:
  - name: "ノード選択"
    type: select
    proxies:
      - "自動選択"
      - "フェイルオーバー"
      - "SS サンプルノード"
      - DIRECT

  - name: "自動選択"
    type: url-test
    proxies:
      - "SS サンプルノード"
      - "Trojan サンプルノード"
    url: https://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50
    lazy: true

  - name: "フェイルオーバー"
    type: fallback
    proxies:
      - "SS サンプルノード"
      - "Trojan サンプルノード"
    url: https://www.gstatic.com/generate_204
    interval: 300
    lazy: true

select、url-test、fallback

selectは手動選択グループで、クライアント画面にノードと子プロキシグループを表示します。どのノードが速いかを自動判定する機能ではなく、安定した出口を指定したい場合に適しています。DIRECTを選択肢に入れると一時的な比較に使えますが、誤って選ぶと関連するルールがすべてダイレクト接続になります。よく使うメイングループでは状態保存を有効にすると、クライアント再起動後も前回の選択を継続できます。

url-testはテストアドレスへ定期的にアクセスし、候補ノードから応答がより適切なものを選びます。測定対象はテストアドレスへの接続状況であり、すべての業務通信の実速度を示すものではありません。intervalはテスト周期を制御し、短すぎると通信量やバッテリー消費が増えます。toleranceは結果が近い場合の頻繁な切り替えを抑えます。許容差が小さすぎると、わずかな揺らぎでノードが頻繁に変わり、長時間接続にも影響することがあります。

fallbackは可用性と候補順を重視します。現在のノードが使えなくなるとリスト順に切り替えるため、固定の出口を優先し、障害時だけ切り替えたい場合に適しています。「常に最も遅延の低いノードを選ぶ」こととは目的が異なります。送信元アドレスの安定性が重要な業務では、頻繁な速度テストによる切り替えより、手動選択やフェイルオーバーの方が制御しやすいことが多いです。

load-balanceとヘルスチェックの限界

load-balanceは複数の利用可能なノードへ接続を分散し、コアが対応する方式に応じて同じ宛先の一貫性を保ったり、ラウンドロビンしたりします。独立した接続が大量にある場合に適していますが、セッション全体で同じ出口を使う必要があるサービスには向きません。ログイン状態の異常、認証画面の増加、同じ業務で出口が変化する現象がある場合は、速度テストの間隔をさらに短くするのではなく、まず固定ノードへ変更して確認してください。

自動プロキシグループはヘルスチェックのアドレスに依存します。テストアドレスには、安定していて応答が小さく、頻繁なアクセスを許可し、ローカルネットワークによる特殊な処理を受けないものを選びます。すべてのノードが突然失敗表示になったのに実際のアクセスは正常なら、テストアドレス自体に到達できない可能性があります。反対に、テストに成功しても、そのアドレスへアクセスできることしか分からず、DNS、対象サイト、UDP、特定プロトコルが正常とは限りません。自動選択は補助機能であり、完全な品質評価ではありません。

プロキシグループの種類 主な目的 適した場面 よくある誤解
select 手動で固定選択 安定した出口を必要に応じて切り替える 自動で速度測定すると思い込む
url-test テスト結果に基づく自動選択 日常のブラウジング、候補が多い場合 テスト遅延をダウンロード速度と同一視する
fallback 優先利用し、障害時に切り替える メイン回線とバックアップ回線 リスト順を無視する
load-balance 複数ノードへ接続を分散する 複数接続を使う処理 固定出口が必要なセッションに使う

業務グループでルールを保守しやすくする

保守しやすい設定では、総合入口となるグループを1つ残し、業務ごとに少数のプロキシグループを作ります。ルールは業務グループを指し、業務グループが総合入口、自動グループ、指定地域グループを参照します。これならサブスクリプションのノードが変わっても、調整するのはグループのメンバーだけです。ドメインごとにプロキシグループを作るのは避けてください。画面に重複した選択肢が増え、上書きも管理しにくくなります。

プロキシグループを追加または改名したら、ファイル全体で旧名称を検索してください。ルール、他のプロキシグループ、上書きスクリプトが参照している可能性があります。クライアントに「プロキシグループが存在しない」と表示されたら、まず空白、全角記号、大文字・小文字を確認し、次に上書きの順序でグループが削除されていないか調べます。ノードの遅延表示と実際の使用感に大きな差がある場合は、ノード、回線、ローカル設定の調べ方を参照し、DNS、ハンドシェイク、継続転送を個別に確認してください。1回のヘルスチェックだけで判断しないことが重要です。

CHAPTER 06

ルール構文、マッチ順、ルールセット

ルールは上から下へ順番にマッチする

rulesは順序付きリストです。リクエストは最初にマッチしたルールで処理を止めるため、具体的なルールを広範なルールより上に置き、末尾には残りの通信を受けるMATCHを置きます。MATCHを先頭に置くと、後続のルールは一切有効になりません。広いドメインサフィックスを先に書き、その後にサブドメイン用の特殊ルールを書くと、サブドメインも先のルールで処理されます。

ルールは通常、「タイプ、マッチ値、プロキシグループ」で構成され、一部には追加パラメーターを指定できます。カンマはフィールドの区切りで、プロキシグループ名はproxy-groupsに存在するか、DIRECTREJECTなどの内蔵アクションでなければなりません。ルール行の余分な空白が値の一部になることがあるため、手動編集では形式を統一してください。

rules:
  - DOMAIN,api.example.com,ノード選択
  - DOMAIN-SUFFIX,example.com,ノード選択
  - DOMAIN-KEYWORD,example,ノード選択
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
  - PROCESS-NAME,example-app.exe,DIRECT
  - GEOIP,CN,DIRECT
  - RULE-SET,private-domain,DIRECT
  - RULE-SET,service-domain,ノード選択
  - MATCH,ノード選択

ドメイン、アドレス、プロセスのルール

DOMAINは完全一致のドメインだけにマッチし、単一ホストに適しています。DOMAIN-SUFFIXは指定ドメインとそのサブドメインにマッチし、サイト全体に適しています。DOMAIN-KEYWORDはドメインにキーワードが含まれるだけでマッチする可能性があり、範囲が最も広く、誤マッチもしやすい方式です。完全なドメインを使えるならキーワードを使わず、明確なサフィックスを使えるなら短すぎる断片を指定しないでください。

IP-CIDRIP-CIDR6は対象アドレスの範囲でマッチします。LAN、コンテナのネットワーク、社内ネットワークは通常ダイレクト接続を優先しますが、アドレス範囲は実際のネットワークに合わせる必要があります。no-resolveは、マッチ判定のためにIPを取得する追加のドメイン解決を行わない指定です。不要なDNSクエリを避けられますが、既存のIP通信を禁止するものでも、アプリがすでに完了した名前解決を変更するものでもありません。

PROCESS-NAMEやプロセスパス系のルールは、プラットフォームの機能、権限、通信の取り込み方式に依存します。システムプロキシモードでは、すべての通信からプロセス情報を確実に取得できるとは限りません。モバイルプラットフォームでも、同じプロセスルールに対応しないことがあります。クロスプラットフォーム設定では、ドメインとアドレスのルールを基本とし、プロセスルールは特定デバイス向けの補助として使ってください。デスクトップではマッチするのにスマートフォンではマッチしない場合、まずルールタイプがプラットフォームをまたいで利用できるか確認します。

GEOIPはIPデータベースに基づいて分類し、GEOSITEやルールセットはドメイン集合に基づいて分類します。利用できる機能はコアとデータファイルに依存します。データベースルールは広範囲を簡単にカバーできますが、分類データには更新周期があるため、明確な業務ルールの代わりにはなりません。特定ドメインを必ず指定したプロキシグループへ送る場合は、データベースルールより前に正確なルールを置いてください。

rule-providersで大規模なルールセットを管理する

大量のルールはrule-providersにまとめるのが適しています。各プロバイダーには、名前、タイプ、動作、取得元、保存先、更新間隔が必要です。behaviorは内容の形式を決めます。ドメイン集合、IPアドレス範囲、従来型のルール行を混在させることはできません。プロバイダーのダウンロードに成功しても、分岐へ参加したとは限りません。rulesで同じ名前のRULE-SETを使用する必要があります。

rule-providers:
  private-domain:
    type: http
    behavior: domain
    format: yaml
    url: "https://rules.example/private-domain.yaml"
    path: ./rules/private-domain.yaml
    interval: 86400

  service-domain:
    type: file
    behavior: classical
    format: yaml
    path: ./rules/service-domain.yaml

rules:
  - RULE-SET,private-domain,DIRECT
  - RULE-SET,service-domain,ノード選択
  - MATCH,ノード選択

domain動作はドメインまたはドメインサフィックスの集合に適し、ipcidrはアドレス範囲に、classicalは従来型のルール表現に対応します。リモート内容の形式は宣言と一致させてください。プロバイダーファイル自体に完全なpayload構造が含まれる場合、保存後にコアが対応する形式で読み込みます。通常のサブスクリプションファイルを誤ってルールセットとして扱うと、解析段階でエラーになります。

ルールセットの更新に失敗したら、まずネットワークリクエストの状態、次に保存先の権限とファイル形式を確認します。古いキャッシュが使われ続けることがあるため、「現在もアクセスできる」だけでは更新成功の証明になりません。サービスモードでは相対パスの基準が実行ディレクトリやクライアント設定ディレクトリになるため、YAMLファイルのある場所とは限りません。端末移行後にルールプロバイダーが使えなくなった場合、パスの違いがよくある原因です。

結果を推測せず、ルールのマッチを確認する

クライアントの接続履歴には通常、対象ドメイン、マッチしたルール、最終的なプロキシグループが表示されます。テスト時はブラウザーの既存接続を閉じるか、新しいリクエストを使ってください。接続の再利用により、古いプロキシグループが使われ続けることがあります。ルールを変更したら設定を再読み込みし、新しい接続が新ルールにマッチするか確認します。Webページが開くかどうかだけでは、ダイレクト接続かプロキシ経由かを区別できません。

カスタムルールは少数の正確な項目から始めます。まず明確なドメインルールを1つ書いてマッチを確認し、その後サフィックスやルールセットへ段階的に広げます。新しいルールで多くのサイトに異常が出たら、短すぎるキーワード、広すぎるアドレス範囲、早すぎる位置のMATCHを確認してください。ルール分岐で重要なのは数ではなく、順序が明確で、対象が存在し、範囲を説明できることです。

CHAPTER 07

サブスクリプションの上書き、YAMLマージ、更新時の境界

元のサブスクリプションと実行設定は同じファイルではない

GUIクライアントにサブスクリプションを取り込むと、通常はダウンロード、解析、上書き、クライアント設定の注入、コアへの読み込みという段階を経ます。画面で見えるサブスクリプション内容は元ファイルの場合もあれば、処理後のキャッシュの場合もあります。コアが実際に動かしている設定には、クライアントが自動的に書き込んだポート、コントロールAPI、TUN設定が含まれることもあります。上書きの問題を調べるときは、どの段階のファイルを見ているのか明確にしてください。

サブスクリプションを更新すると、リモート内容が再ダウンロードされます。キャッシュファイルを直接編集しても、次回更新時に変更が消えることがあります。これは正常な更新結果であり、クライアントが保存に失敗したわけではありません。長期的に保持したいローカルルール、プロキシグループ、DNS設定は、クライアントがサポートする上書き、拡張スクリプト、ローカル設定層へ置きます。クライアントによって上書き機能やフィールド名は完全には一致しないため、移行時は最終設定を書き出して照合してください。

マッピング、リスト、スカラーのマージの違い

YAML自体はデータ構造を定義しますが、サブスクリプションツールがどのように深くマージするかは統一していません。modeのようなスカラーは通常、後の値で前の値が置き換わります。dnsのようなマッピングはキー単位でマージされる場合も、全体が置き換わる場合もあります。rulesproxy-groupsのようなリストは、上書き、追加、先頭への挿入、名前による処理など、動作が異なることがあります。すべてのクライアントが同じアルゴリズムを使うとは考えないでください。

ルールの上書きは特に順序に依存します。カスタムルールがリモートルールの末尾に追加され、リモート設定にすでにMATCHがある場合、新しいルールはマッチしません。この場合は通常の追加ではなく「先頭への挿入」が必要です。プロキシグループ全体を置き換えると、サブスクリプションが生成したノード参照が失われることがあります。同名グループを追加するだけだと、重複名が生じることもあります。データ型ごとにマージ結果を個別に確認してください。

# 基本設定に含まれる断片
mode: rule
dns:
  enable: true
  enhanced-mode: fake-ip
rules:
  - DOMAIN-SUFFIX,example.com,ノード選択
  - MATCH,ノード選択

# 先頭に挿入するローカルルールの断片
rules:
  - DOMAIN,internal.example.com,DIRECT

# マージ後の正しい順序は次のようになる
rules:
  - DOMAIN,internal.example.com,DIRECT
  - DOMAIN-SUFFIX,example.com,ノード選択
  - MATCH,ノード選択

YAMLアンカーを安全に使う

アンカーを使うと重複フィールドを減らせます。たとえば複数の自動プロキシグループでテストアドレスと間隔を共有する場合、共通マッピングを定義してからマージキーで展開できます。ただし、アンカーが有効なのは同じYAMLドキュメント内だけです。リモートサブスクリプションとローカル上書きを解析後にマージする場合、上書き部分から元ファイルのアンカーを参照できないことがあります。変換ツールによってはアンカーを先に展開したり破棄したりするため、ファイルをまたぐアンカーに重要な互換性を依存させないでください。

group-test-common: &group-test-common
  type: url-test
  url: https://www.gstatic.com/generate_204
  interval: 300
  tolerance: 50

proxy-groups:
  - name: "自動選択"
    <<: *group-test-common
    proxies:
      - "SS サンプルノード"
      - "Trojan サンプルノード"

アンカー名はYAML解析にだけ使われ、Clashの設定フィールドにはなりません。クライアントの厳格なチェックが余分なトップレベルキーを受け付けない場合は、共通構造をツールが対応する場所へ移すか、フィールドを直接展開してください。複数の端末へ渡す最終設定は、展開済みで単独読み込みできる完全なファイルにするのが理想です。重複を減らすことは便利ですが、可読性と互換性を優先してください。

復元可能な上書き手順を作る

最初の上書きでは、ログレベルや正確なルール1つなど、検証しやすいフィールドだけを変更します。再読み込み後に最終設定と接続履歴を確認し、上書き層が実際に有効になったことを確かめてください。2段階目でDNSやプロキシグループを追加します。ポート、DNS、グループ、ルールを一度に置き換えると、障害がどの層で起きたか判断できません。

ローカル拡張には分かりやすい名前を付けます。たとえばプロキシグループは安定した名称で統一し、ルールプロバイダーにはサブスクリプションと衝突しない接頭辞を付けます。サブスクリプション更新の前後で、最終設定にあるトップレベルキーの数、プロキシグループ名、ルール順を比較してください。ノード数の変化による無関係な差分が大量に出るため、行数だけを比較しないでください。ローカルフィールドが残っているか、参照関係が閉じているか、末尾のフォールバックが1つだけかを重点的に確認します。

クライアント間で移行する場合は、新しいクライアントへ元のサブスクリプションを取り込んでから、ローカル上書きを移植してください。実行ディレクトリ全体を直接コピーしないでください。Clash Plus、Clash Verge Rev、FlClash、Clash NyanpasuなどのGUIクライアントでは、設定管理画面や永続化方式が異なる場合があります。コアの互換性があっても、画面上の設定まで完全に一致するとは限りません。クライアント選択で各クライアントの位置づけを確認し、ダウンロードセンターから対象プラットフォームのインストーラーを取得してください。

サブスクリプション更新後の異常を切り分ける

更新後に設定を読み込めなくなったら、まずローカル上書きを一時的に無効にして元のサブスクリプションを確認します。元のサブスクリプションが使えて上書き後だけ失敗するなら、問題はマージ層にあります。元のサブスクリプションも失敗するなら、リモート内容、サブスクリプションの状態、コアの互換性を確認してください。設定は読み込めるのにプロキシグループが空なら、ノードプロバイダー名とフィルター条件を確認します。カスタムルールが消えた場合は、上書きタイプが置換か追加かを確認します。ポートが初期値に戻った場合は、クライアントの設定がファイルのフィールドより優先されていないか調べます。

最近動作した最終設定を1つ保存しておくと、「上流のサブスクリプションが変わった」のか「ローカル編集が変わった」のかを素早く切り分けられます。復元後すぐにすべてを再上書きせず、差分の小さいモジュールから戻してください。初回インストールとサブスクリプション取り込みの一般的な注意点は、クロスプラットフォームの初期設定とよくあるエラーも参照できます。

CHAPTER 08

設定チェック、読み込み手順、障害の切り分け

まず構文、次にネットワークを確認する

設定障害は、ファイルのエンコーディングとYAML構文、フィールド構造と参照、待受ポート、DNS、ノード接続、プロキシグループ、ルールのマッチ、アプリの取り込みという順番で対処します。前の段階を通過していないのに次へ進まないでください。構文エラーは設定全体を読み込めなくします。ノードエラーは該当する接続だけに影響し、ルールエラーは通信を誤ったプロキシグループへ送る可能性があります。障害の範囲を分けることで、目的なくすべての設定を交換せずに済みます。

GUIクライアントには通常、設定チェックや再読み込みのボタンがあります。サーバーやコマンドライン環境では、使用中のコアが提供するテストパラメーターを使えますが、実行ファイル名とパラメーターはインストーラーに付属する説明を基準にしてください。チェックコマンドは実際の設定ディレクトリを指す必要があります。相対パスを誤ると、同名の別ファイルをテストしてしまうことがあります。「設定は有効」と表示されても、起動ログを確認してください。ポート競合、ディレクトリ権限、ネットワーク接続は実行段階の問題です。

# 実際の設定ディレクトリへ移動してから、使用中のコアの設定チェックパラメーターを呼び出す例
cd /path/to/clash-config
mihomo -t -d .

# 本機のポートが使用中か確認する場合は、OSに対応したツールを使う
# Linux
ss -lntup

# Windows PowerShell
Get-NetTCPConnection -State Listen

解析エラーが起きやすい箇所

エラーに行番号が含まれる場合は、その行だけでなく上数行も確認してください。YAMLパーサーは処理を続けられなくなった時点でエラーを出すことが多く、実際の原因は前の行の閉じ忘れた引用符、コロンの後の空白不足、リストのインデント中断かもしれません。マッピングキーの重複が示されたら、同じ階層に同名フィールドがないか検索します。型が合わないと表示されたら、本来リストである場所からハイフンが抜けていないか、整数をオブジェクトとして書いていないか確認してください。

チャットアプリやリッチテキストからコピーした内容には、全角コロン、曲がった引用符、ノーブレークスペース、見えない文字が含まれることがあります。最も確実なのは、問題の行をプレーンテキストエディターで入力し直す方法です。日本語のプロキシグループ名は問題なく使えますが、句読点や区切りには通常の半角YAML記号を使用してください。コメントはシャープから始め、有効な値との間に適切な空白を置きます。

設定は解析できるのに対象が存在しないと表示される場合は、ノード名、プロバイダー名、プロキシグループ名、ルールセット名を確認します。よくある原因は、プロキシグループがサブスクリプション更新で改名されたノードを参照している、ルールが上書きで削除されたグループを指している、RULE-SET名とプロバイダーキーが一致していない、といったものです。名前を検索するときは引用符内の完全な文字列を対象にし、末尾の空白や似た文字にも注意してください。

ポート、システムプロキシ、TUNの分岐

クライアントは動作中と表示されるのにアプリがネットワークへ接続できない場合、まず待受ポートが存在するか確認し、次にシステムプロキシのアドレスを照合します。YAMLのmixed-portを新しい値へ変更したのに、システムプロキシが古い値を指していると、ブラウザーはすぐに接続に失敗します。システムプロキシに従わないアプリだけが取り込めない場合、基本のプロキシは正常で、ノードプロトコルを変更し続けるのではなくTUNの利用を検討すべき可能性があります。

TUNを有効にして完全にネットワークへ接続できなくなったら、権限、仮想NIC、ルート、DNSの取り込み、他のネットワークソフトとの競合を確認します。まずTUNを無効にし、システムプロキシ経路が機能することを確認してから、TUNだけを個別に調べてください。クライアントを終了しても接続できない場合は、システムプロキシが有効なまま残っていないか、仮想NICのルートが復元されているか確認します。同じテスト中に複数のプロキシクライアントを有効にしないでください。システムプロキシ、ポート、ルートを奪い合う可能性があります。

ノードの可用性とルールマッチを検証する

ノードテストに失敗したら、DNS名前解決の失敗、TCP接続タイムアウト、接続拒否、TLSハンドシェイク失敗、認証失敗を区別します。名前解決の失敗ではノードサーバーのドメインとproxy-server-nameserverを確認します。タイムアウトではネットワークとリモートアドレスを調べ、拒否なら対象ポートが接続を受け付けているか確認します。ハンドシェイク失敗ではシステム時刻、SNI、証明書を、認証失敗ではパスワード、ユーザー識別子、プロトコルフィールドを確認してください。異なるエラーを同じ方法で修復することはできません。

ノードテストは成功するのに対象サイトへ接続できない場合は、接続履歴でマッチしたルールとプロキシグループを確認します。DIRECTにマッチしているなら、問題はルール順またはモードにあります。想定したノードにマッチしているなら、対象ドメインの名前解決、ノードの出口、サイト側の制限を調べてください。一時的にグローバルモードへ切り替えると、ルールの問題かどうかを切り分けられますが、テスト後はルールモードへ戻します。グローバルモードでアクセスできても、元のルールが正しいとは限りません。プロキシ経路の1つが利用可能だと分かるだけです。

現象 優先して確認する項目 次の手順
設定を読み込めない インデント、重複キー、フィールド型 解析可能な最小設定まで縮小する
クライアントは動くがブラウザーが切断される 待受ポートとシステムプロキシのポート ローカルポートに競合がないことを確認する
ドメインは失敗するがIPには接続できる DNSの待受、リゾルバー、キャッシュ DNSを簡略化して項目ごとに戻す
グローバルでは使えるがルールモードでは失敗する ルールの順序とプロキシグループの対象 接続履歴でマッチした項目を確認する
サブスクリプション更新後にローカルルールが消える 上書き方式とマージ順 最終実行設定を比較する

動作する最小設定を作る

複雑な設定の原因を特定できない場合は、ポート1つ、ノード1つ、手動プロキシグループ1つ、ルール2つから始めます。読み込みと接続を確認した後、DNS、自動プロキシグループ、ルールプロバイダー、TUNを順番に追加してください。各層を追加するたびに、動作するコピーを保存します。数千行のサブスクリプションで推測を繰り返すより速く、クライアントとコアが実際に対応するフィールドも明確になります。

最小設定のテストに使うノードは、必要な情報がすべて揃っていることを確認してください。テストドメインも安定している必要があります。最小設定でも失敗するなら、問題はルールセットではなく、ノード、システムネットワーク、権限、クライアントのインストールにある可能性が高いです。その場合は利用ガイドで初期設定を確認するか、サブスクリプション、モード、接続状態に関する10の質問を参照してください。再インストールが必要なら、ダウンロードセンターで対応プラットフォームを選びます。デスクトップ、モバイルともにClash Plusを優先して確認してください。

トラブル対処が終わったら、一時的に有効にしたdebugログ、広範なテストルール、証明書検証の変更を通常の設定へ戻します。使わなくなったポート、重複したプロキシグループ、無効なプロバイダーを削除し、カスタム部分には短いコメントを付けてください。設定を長期的に保守できるかどうかは、フィールド数ではなく、各モジュールの役割が明確かで決まります。各ルールの存在理由、各グループの参照先、各DNSリゾルバーの役割を説明できてこそ、継続的に更新できる設定になります。

動作する設定から次へ進む

まだクライアントをインストールしていない場合は、プラットフォームに合ったインストーラーを取得します。インストール済みで画面操作に慣れていない場合は、クイックスタートの手順に従ってサブスクリプションを読み込み、プロキシグループを選び、接続を確認してください。