config.yaml構造の全体像

完全な設定ファイルはいくつかのトップレベルのフィールドで構成されています。この表を理解すれば、以降の各セクションはそれぞれのフィールドの詳しい書き方の説明になります:

フィールド役割
port / socks-portローカルHTTP / SOCKS5プロキシポート
allow-lanLAN内のデバイスからローカルプロキシへの接続を許可するかどうか
mode動作モード:rule(ルールベースルーティング)、global(グローバルプロキシ)、direct(グローバル直接接続)
log-levelログの詳細度:silent / error / warning / info / debug
external-controllerRESTful APIのリスンアドレス。ダッシュボード系クライアントと併用
dnsDNSルーティングと漏洩防止に関する設定
proxies手動で記述するノードリスト(サブスクリプションのノードはここに書く必要はありません)
proxy-groupsプロキシグループの定義
proxy-providersリモートノードプロバイダー(サブスクリプションリンクの基盤となる仕組み)
rule-providersリモートルールセットプロバイダー
rules最終的に適用されるルーティングルールのリスト。上から順に照合
ご注意: サブスクリプションリンクは、要するにクライアントが一定周期でこのconfig.yaml(またはその中のproxies/rules部分)をリクエストし、ローカル設定に統合する仕組みです。この構造を理解しておくと、サブスクリプションの問題を手動で調査する際にかなり役立ちます。

プロキシプロトコルパラメータ詳細

サブスクリプションに完全に依存せず、ノードを手動で追加したい場合は、proxiesフィールド配下の主要プロトコルのコアパラメータを以下に示します:

Shadowsocks

コアとなるフィールドはcipher(暗号方式、例:aes-256-gcmchacha20-ietf-poly1305)とpasswordです。一部のノードではpluginobfsv2ray-pluginなど)を使ってトラフィックを難読化することもあります。

VMess

uuidalterId(新しいバージョンでは通常0)が必要で、cipherは一般的にautoを使います。TLSが有効なノードの場合はtlsservername(SNI)も設定が必要です。

Trojan

コアとなるフィールドはpasswordsniです。Trojanはデフォルトで標準TLSを強制し、通常のHTTPS通信になりすますため、sniが証明書のドメインと一致しているかどうかが接続の成否に直結します。

Hysteria2

QUICプロトコルをベースとし、コアとなるフィールドはpasswordup / down(アップロード/ダウンロード帯域のヒント値)です。弱い回線や高遅延の環境では、従来のTCPプロトコルより安定する傾向があります。

WireGuard

他のプロトコルとはフィールドの構成が異なります:private-key、相手側のpublic-key、そしてip(WireGuardの内部ネットワーク上での自分のアドレス)が必要です。設定はやや低レベルで、通常はノード提供元から完全な設定スニペットがそのまま渡されます。

各プロトコルのフィールド例を見る
proxies:
  - name: "ss-node"
    type: ss
    server: example.com
    port: 443
    cipher: aes-256-gcm
    password: "your-password"

  - name: "trojan-node"
    type: trojan
    server: example.com
    port: 443
    password: "your-password"
    sni: example.com

  - name: "hy2-node"
    type: hysteria2
    server: example.com
    port: 443
    password: "your-password"
    up: "50 Mbps"
    down: "200 Mbps"

ルール構文完全リファレンス

ルールの形式は統一されており、ルールタイプ,マッチ対象,ターゲットポリシーという形で上から順に照合し、一致した時点で処理を停止します。以下によく使われるルールタイプの一覧を示します:

ルールタイプマッチ対象
DOMAIN完全一致するドメインDOMAIN,ad.example.com,REJECT
DOMAIN-SUFFIXドメインのサフィックスDOMAIN-SUFFIX,google.com,PROXY
DOMAIN-KEYWORDドメインに含まれるキーワードDOMAIN-KEYWORD,youtube,PROXY
DOMAIN-REGEX正規表現でドメインを照合DOMAIN-REGEX,^ad\d+\.com$,REJECT
GEOIPIPの所在地(GeoIPデータベースと連携)GEOIP,JP,DIRECT
IP-CIDR / IP-CIDR6IPv4 / IPv6のアドレス範囲IP-CIDR,192.168.0.0/16,DIRECT
SRC-IP-CIDRリクエスト元のローカルソースIP範囲SRC-IP-CIDR,192.168.1.100/32,DIRECT
SRC-PORT / DST-PORT送信元ポート / 宛先ポートDST-PORT,22,DIRECT
PROCESS-NAMEリクエスト元のプロセス名(アプリ単位のプロキシを実現する基盤の仕組み)PROCESS-NAME,com.app.id,PROXY
RULE-SETRule Providerのルールセットを参照RULE-SET,reject,REJECT
MATCH一致しなかった全トラフィック向けのフォールバックルールMATCH,PROXY
ご注意: ルールは具体的で、アクセス頻度が高いものほど上に配置すべきです。処理に時間がかかるDOMAIN-REGEXや大きなRULE-SETを、明らかに一致しない位置より前に置くと、リクエストごとの照合速度が遅くなります。

Providerの仕組み:Proxy ProviderとRule Provider

Providerは、Clashが「リモートかつ自動更新可能」なリソースを管理するための統一された仕組みです。サブスクリプションリンクの裏側は実はProxy Providerであり、ルールセットの裏側はRule Providerです。どちらも定期的な自動更新に対応しており、ファイルを手動で置き換える必要はありません。

proxy-providers:
  my-sub:
    type: http
    url: "https://example.com/api/v1/subscribe?token=xxx"
    interval: 3600
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 300

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/rules/reject.txt"
    path: ./rules/reject.txt
    interval: 86400

ここでintervalは自動更新の周期(秒単位)を制御し、health-checkはクライアントに定期的にProvider配下のノードを一括で速度測定させます。behaviorは、ルールセットの内容がドメインリスト(domain)、IP範囲(ipcidr)、あるいは完全なルール(classical)のいずれかであるかをクライアントに伝えます。

プロキシグループの高度なパラメータ

基本的なtypeproxiesのほかに、プロキシグループには知っておくと役立ついくつかの高度なパラメータがあります:

  • lazy —— url-test / fallbackグループで有効にすると、実際に使用されたときだけバックグラウンドで速度測定を行い、アイドル時のリソース消費を減らします;
  • tolerance —— 遅延の許容値(ミリ秒)。新しいノードの遅延が現在のノードよりこの値以上低くならない限り切り替えは発生せず、測定値のブレによる頻繁な切り替えを防ぎます;
  • strategyload-balanceグループのみ)—— ロードバランシングの戦略で、一般的なのはconsistent-hashing(同じ宛先は常に同じノードを使用し、セッション維持が必要な場面に適する)またはround-robin(順番に巡回)です;
  • disable-udp —— そのプロキシグループ内のノードのUDP転送を無効化します。一部のノードや回線がUDPに対応していない場合に使用します。

DNSの高度な設定

DNS設定は漏洩防止のオン・オフだけでなく、解決動作を細かく制御することもできます:

dns:
  enable: true
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://dns.google/dns-query
    - https://1.1.1.1/dns-query
  fallback:
    - https://1.0.0.1/dns-query
    - https://dns.quad9.net/dns-query
  nameserver-policy:
    "geosite:private": [192.168.1.1]
  fallback-filter:
    geoip: true
    geoip-code: JP

enhanced-mode: fake-ipは最も一般的なモードで、クライアントが各ドメインに仮のIPを割り当て、プロキシ層で実際のドメインに戻すため、互換性が最も高いです。nameserver-policyはドメインの所属に応じてどのDNSグループで解決するかを個別に指定できます(例:自宅ルーターなどLAN内のホスト名だけローカルDNSで解決する)。fallback-filterはある解決結果が「汚染されている疑いがある」かどうかを判定し、fallbackリストで再度問い合わせるかどうかを決定するために使われます。geoip-code(ここではJP)とサンプルのIP/ドメインは、実際にお使いの地域やDNSサーバーに置き換えてください。

TUNモードのパラメータ詳細

TUNモードのコアパラメータは以下の通りです:

tun:
  enable: true
  stack: system
  auto-route: true
  auto-detect-interface: true
  dns-hijack:
    - any:53

stackは仮想ネットワークアダプターの実装方式を決めます。systemは互換性が最も高く、gvisor/mixedは場面によってはパフォーマンスが優れています。auto-routeを有効にすると、クライアントが自動的にシステムのルーティングテーブルを引き継ぎます。auto-detect-interfaceは、現在使用している物理ネットワークインターフェースをクライアントが自動的に検出し、手動指定を不要にします。dns-hijackは、UDP53ポート経由のDNSリクエストを強制的に横取りし、アプリがシステムのDNS設定を回避して直接問い合わせるのを防ぎます。

外部コントローラーとRESTful API

external-controllerを設定すると、Clashは指定したアドレスでRESTful APIを公開します。ダッシュボード系クライアントと組み合わせることで、クライアントを再起動せずに接続状況の確認、ノードの切り替え、遅延の確認などをリアルタイムで行えます。

external-controller: 127.0.0.1:9090
secret: "your-strong-secret"
セキュリティ上の注意: 必ずsecretを設定し、external-controllerがローカルアドレス(127.0.0.1)のみをリスンするようにしてください。0.0.0.0にバインドしてシークレットを設定していない場合、プロキシの操作権限をネットワーク全体に公開してしまうことになります。

パフォーマンス・セキュリティのおすすめ設定

  • 何百ものDOMAIN-SUFFIXrulesに直接並べるのではなく、できるだけRULE-SETでルールセットを参照する方が、照合が速く、メンテナンスも簡単です;
  • アクセス頻度が高く、明確なルールほどrulesリストの上位に置き、平均的な照合回数を減らしましょう;
  • 必要がない限りlog-leveldebugのまま長時間運用しないでください。詳細なログはディスクとメモリを消費し続けます;
  • external-controllerには必ずsecretを設定し、複数デバイス・複数プラットフォーム間で同じシークレットを使い回さないでください;
  • プロキシグループの速度測定の間隔は短すぎないようにしましょう。数十秒から数分に1回で十分にノードの異常を検知できます。頻度が高すぎるとノード側の負荷やローカルリソースの消費が増えるだけです;
  • カスタムで上書きしたルールやプロキシグループは別途バックアップしておくと、サブスクリプション更新やクライアント再インストール後にすぐ復元できます。

よくある質問

設定ファイルを変更しても反映されないのはなぜ?

ほとんどのクライアントでは、変更を反映させるために手動で「設定を再読み込み」をクリックするか、クライアントを再起動する必要があります。サブスクリプションで管理している設定の場合、ローカルファイルを直接編集すると次回の自動更新で上書きされる可能性があるため、代わりに上書き(オーバーライド)機能を使うことをおすすめします。

RULE-SETと直接ルールを書く方法の違いは?

効果自体は同じですが、メンテナンス方法が異なります。RULE-SETはリモートで更新できる独立したファイルで、ルール内容が変わっても設定全体を再読み込みする必要がありません。一方、rulesに直接書いたルールは、変更するたびに設定ファイル自体を手動で編集する必要があります。

fake-ipとredir-hostモードはどちらを選ぶべき?

fake-ipは互換性・速度ともに優れており、現在の主流の選択肢です。redir-hostはDNSの応答結果を書き換えて実現するため、実際のIPで検証を行う一部のアプリで問題が起きる場合があります。fake-ipモードで明確な互換性問題に遭遇した場合のみ、切り替えを検討してください。

external-controllerのポートが使用中だったら?

external-controllerのポート番号を別の未使用のポートに変更すれば解決します。一般的なデフォルトポートは9090です。システムのコマンドでそのポートを使用しているプロセスを確認してから、閉じるかどうかを判断することもできます。

プロキシグループの速度測定が失敗し続ける場合はどう調査する?

まず、測定用アドレス(urlフィールド)自体がそのノードからアクセス可能かどうかを確認してください。特定のネットワーク環境では一部の測定用アドレスがブロックされることがあります。他の公開されている接続テスト用アドレスに変更したり、ノード自体が失効していないか確認することもできます。

複数のRule Providerを同時に使うことはできますか?

できます。rule-providersでは任意の数のルールセットを定義でき、rulesリストの中で必要に応じてRULE-SET名でそれぞれ参照できます。順序は上から順に照合するルールに従います。

まだ基本的な使い方を見ていない方は、初心者向けチュートリアルからサブスクリプションの読み込み、プロキシグループ、ルールベースルーティングなどの基本概念を学んでみてください。