プロキシプロトコル · Clash ドキュメント

AnyTLS

現在の Mihomo フィールドに基づく Clash 系 AnyTLS アウトバウンド設定です。password、sni、クライアントフィンガープリント、アイドルセッション確認、TLS 検証を、最小 YAML と代表的なハンドシェイクエラーとともに解説します。

  • password
  • TLS
  • SNI
  • アイドルセッション
  • skip-cert-verify
プロキシプロトコル

プロトコルの境界と最小構成

AnyTLS は、現在の Mihomo コアが提供する TLS over TCP のアウトバウンド種別です。QUIC は使わず、ポートホッピング用のフィールドもありません。最小ノードは、共通の名前、種別、サーバー、ポート、サーバーパスワードで構成されます。

password サーバー側のユーザー設定と一致させる必要があります。udp が true の場合、クライアントは UDP over TCP で UDP リクエストを運びます。基盤となる接続が UDP に変わるわけではありません。

name必須
ノード名です。ポリシーグループやルールから、このアウトバウンドを識別するために使われます。
type: anytls必須
Mihomo の AnyTLS アウトバウンド実装を選択します。オリジナルの Clash はこの種別を認識しません。
server / port必須
サーバーのホストと待受ポートを指定します。ポートは単一の整数です。
password認証
サーバー側でそのユーザーに設定されたパスワードを指定します。空の値が機能する可能性があるのは、サーバー側で明示的に許可されている場合だけです。
udp任意
UDP リクエストへの対応を有効にします。実際には AnyTLS 接続内の UDP over TCP で運ばれます。

TLS、SNI、証明書の検証

AnyTLS は常に TLS 接続を確立します。 sni を指定しない場合、クライアントは server を TLS Server Name として使用します。 server が IP の場合は、通常、サーバー証明書に合わせてドメイン形式の SNI を指定する必要があります。

sniTLS
ハンドシェイクで使うサーバー名を設定します。省略時は server にフォールバックします。
alpnTLS
サーバーが対応する ALPN の一覧を指定します。例として h2 と http/1.1 があります。クライアント側の好みだけで変更しないでください。
client-fingerprintTLS
クライアントの TLS フィンガープリントを選択します。例:chrome。証明書のフィンガープリント検証とは別のフィールドです。
skip-cert-verifyリスク
が true の場合、通常の証明書検証を省略します。リスクを明確に理解している場合にだけ使用してください。
name-cert-verifyTLS
証明書名の検証対象だけを個別に指定します。接続先アドレスを変更するものではありません。
fingerprintTLS
サーバー証明書のフィンガープリントを固定し、証明書ピンニングに使用します。
certificate / private-keymTLS
サーバー側でクライアント証明書が必要な場合に、ペアで指定します。
ech-opts任意
ECH を使って ClientHello 内の実際の SNI を隠します。具体的なフィールドは、現在のコアにおける共通 TLS 設定に従います。

Reality とセキュアラッピングの境界

AnyTLS は、ECH、ShadowTLS、ResTLS、JLS と組み合わせて TLS の露出特性を処理できますが、これらの機能は Reality の別名ではありません。

shadow-tls-optsラッピング
ShadowTLS の version と password を指定します。サーバー側と一致させる必要があります。
restls-optsラッピング
ResTLS の password を指定します。サーバーから提供されている場合は version-hint も指定できます。
jls-optsラッピング
JLS の username と password を指定します。
排他ルール重要事項
現在の実装では、ShadowTLS、ResTLS、JLS のうち選択できるのは一つだけです。同時に指定するとノードの作成が拒否されます。

アイドルセッションのパラメーター

AnyTLS は、一つ以上の TLS 接続上でストリームを多重化します。三つのセッションパラメーターは秒単位で確認と回収を制御するもので、QUIC ウィンドウではなく、TLS 証明書の検証にも影響しません。

idle-session-check-intervalデフォルトは 30 秒
アイドルセッションを確認する間隔です。
idle-session-timeoutデフォルトは 30 秒
確認時に、この値を超えてアイドル状態が続いているセッションを閉じます。
min-idle-sessionデフォルトは 0
確認時に最低限維持するアイドルセッション数です。値を増やすと、より多くの接続が維持されます。

最小構成の例

まず、サーバーから実際に提供されたパスワード、SNI、ALPN を使って接続を確立します。その後、必要に応じて ECH または一種類のセキュアラッピングを追加してください。セッションフィールドにはデフォルト値があるため、通常は重ねて指定する必要はありません。

YAML
proxies:
  - name: anytls-node
    type: anytls
    server: server.example.com
    port: 443
    password: replace-with-server-password
    udp: true
    sni: server.example.com
    client-fingerprint: chrome
    alpn:
      - h2
      - http/1.1

よくある設定ミス

YAML として解析できても、プロトコルパラメーターを相互に置き換えられるとは限りません。AnyTLS で接続できない場合は、まず最小構成まで絞り込んでください。

  • VLESS ノードから reality-optsをコピーし、現在のコアが明示的に未対応としている組み合わせを使っています。
  • server に IP を指定した一方で、証明書に対応する sniを指定していないため、証明書名の検証に失敗しています。
  • ShadowTLS、ResTLS、JLS のうち二つ以上のラッピングを同時に有効にすると、ノードの作成時にエラーになります。
  • セッション確認用のパラメーターを性能倍率だと考えてむやみに増やすと、かえって多くのアイドル接続が維持されます。