REALITYとXTLS Visionの仕組みを解説:VLESSのフロー制御で暗号化の重複を抑える方法

TLSハンドシェイクから、REALITYが実在サイトの証明書を活用する仕組みと、xtls-rprx-visionが暗号化の重複を抑えて遅延やCPU負荷を軽減する理由を解説します。

この記事の概要

VLESSのサブスクリプションを追加したものの、REALITYとflowの設定項目の違いが分からないMac・Androidユーザー向けの記事です。アプリのTLS、プロキシの通信経路、VLESSの3層を整理し、Visionが暗号化の重複を減らせる条件を解説します。最後に、v2rayNとv2rayNGの設定項目を確認する手順と、トラブル時の切り分け方を紹介します。性能向上の度合いは通信内容や実行環境によって異なり、flowの名前を変えるだけで高速化するわけではありません。

TLSハンドシェイクとプロキシトンネル:暗号化が重複する階層

HTTPSサイトにアクセスすると、まずブラウザーと接続先サイトの間でTLSをネゴシエートします。ハンドシェイクではプロトコルのパラメーターを決め、サイトの正当性を確認してセッション鍵を確立します。その後のHTTPリクエストとレスポンスはTLSレコード層で暗号化されます。プロキシ経由でも、このサイトとのTLS接続は通常、ブラウザーとサイトの間でエンドツーエンドに維持されます。

プロキシクライアントとプロキシサーバーの間にもTLSトンネルを確立すると、ブラウザーが生成したTLS暗号文は外側のトンネルのペイロードになります。クライアントは暗号化済みのデータをさらに暗号化し、サーバーは外側を復号してから内側の暗号文をサイトへ転送します。これが一般に「TLS over TLS」と呼ばれる状態です。ただし、2つのTLS層が保護する接続はそれぞれ異なります。

ブラウザーのリクエストアプリケーション層のTLSプロキシによるカプセル化サーバーから転送接続先サイト

暗号化の重複は、暗号処理やレコードのカプセル化、メモリー間のデータ移動を増やします。ただし、それが接続の遅さの主な原因とは限りません。Webページの初回表示には、DNS名前解決、ネットワーク経路の往復時間、パケットロス、サーバーの処理待ちも影響します。Visionが最適化するのは特定のデータ経路であり、これらのコストすべてを取り除くものではありません。

REALITY:実在サイトの証明書とクライアント認証

REALITYはXrayの通信セキュリティ機構です。一般的な設定では実在するTLS接続先を指定し、そのサイトに適合するサーバー名やハンドシェイクの特徴を選びます。接続先サイトの実際のハンドシェイク情報や証明書の外観を利用して、入口が通常のTLSサービスに近い動作をする一方、事前設定されたクライアントには専用の認証経路を提供します。

「証明書を借りる」といっても、証明書をダウンロードすれば任意のサイトになりすませるわけではありません。また、プロキシサーバーが接続先サイトの秘密鍵を入手するわけでもありません。REALITYクライアントはTLSハンドシェイクを処理するだけでなく、事前設定された公開鍵などを使って対応するREALITYサーバーを検証します。実在サイトの証明書は、ユーザーが設定する公開鍵の代わりにはなりません。

項目実際の役割間違えやすい点
接続先サイトREALITYのハンドシェイク先として指定します。使用する実装の要件を満たす必要があります。プロキシ経由のすべてのリクエストが最終的にアクセスするサイトではありません。
serverName / SNIハンドシェイクで指定するサーバー名です。サーバー側の設定に合わせる必要があります。接続先アドレスではありません。よく見かけるドメインを任意に入力してはいけません。
公開鍵 / pbk対応するサーバー秘密鍵とともに、REALITYの認証処理で使われます。サイト証明書の本文でも、VLESSのユーザーIDでもありません。
shortId / sidREALITYクライアントの識別に使われます。サーバー側で許可された値と一致させる必要があります。VLESSのユーザーIDを省略した表記ではありません。

認証されなかった接続は、REALITYの設定や実装に応じて接続先サイトへ転送される場合があります。ただし、どのようなプローブでもまったく同じ応答になるとは限りません。接続先サイトへの到達性、TLSの互換性、入口アドレスやネットワーク経路の特徴が結果に影響します。接続先の選択が誤っている場合、クライアントのフィンガープリントだけを変更しても解決しないことがあります。

XTLS Vision:暗号化の重複を減らせる条件

Visionで一般的に使われるflowの値はxtls-rprx-visionです。単なる設定ラベルではなく、接続初期のデータの識別やパディング、その後の転送方法も含みます。クライアントとサーバーの両方がこの動作に対応し、正しく設定されている必要があります。クライアント側の項目だけを変更すると、接続できなくなることがあります。

条件を満たし、内側のTLS 1.3トラフィックとして識別できる場合、Visionはハンドシェイク後にデータ処理経路を切り替え、内側のTLSで保護済みのアプリケーションデータに外側のTLSレコード暗号化を重ねずに転送できます。接続先サイトとのTLSはそのまま維持され、ブラウザーによる証明書検証も引き続き行われます。減らせるのは、プロキシ層での暗号文の重複処理です。

  1. 外側の接続を確立:クライアントはまずプロキシサーバーとのセキュアな接続と認証を完了します。REALITYの設定項目も必ず確認してください。
  2. プロキシリクエストを送信:VLESSでユーザー情報と接続先を伝え、Visionが初期データを処理しながら内側のプロトコルの特徴を確認します。
  3. 条件を満たすか判定:識別され、要件を満たしたTLSトラフィックのみ、外側の暗号化を減らす経路を利用できる可能性があります。
  4. 以降のデータを転送:内側のTLS暗号文はそのまま転送されます。条件を満たさないトラフィックが「平文で直接送信される」わけではありません。

通常のHTTP、識別できないトラフィック、UDP、およびQUICが使うUDP経路には、「TLS 1.3の暗号文をそのまま転送する」という説明をそのまま当てはめられません。TLS 1.2でも同じ最適化効果が得られるとは限りません。効率的な経路が使われるかどうかは、実際のコア実装、トランスポートの組み合わせ、OSにも左右されます。

確認方法:まずコアとflowを確認し、高速化はその後に検討

クライアントのノード編集画面でVLESS、REALITY、xtls-rprx-visionを確認し、実行ログでこの組み合わせに対応するコアが起動していることを確かめます。ノードの表示名だけでは、Visionが有効かどうか判断できません。

プロトコルの数値:TLSバージョン、443番ポート、性能の限界

以下の数値はプロトコルや一般的な構成に関するもので、この記事で測定した速度ではありません。「接続入口の種類」と「データの処理方法」を区別する参考にはなりますが、特定のサブスクリプションノードの実速度を示すものではありません。

TLS 1.3
REALITYのハンドシェイクの基盤。Visionが内側のトラフィックを識別する際の重要な条件です。
443
HTTPSでよく使われるポートです。REALITYの入口に必須のポートではありません。
TLS 1.2
アプリケーション通信で使われる場合もありますが、外側の暗号化も同様に減るとは限りません。

大容量ファイルの転送でクライアントまたはサーバーのCPU使用率が上限に達している場合、暗号化の重複を減らすことでCPU負荷が下がり、利用可能なスループットが向上することがあります。環境によっては、より効率的なデータ転送方式を利用できる場合もあります。ただし、Macのデスクトップクライアントとサーバーではシステムの機能が異なるため、あるプラットフォームでのゼロコピーの効果をすべてのデバイスに当てはめることはできません。

遅延の改善にも条件があります。高負荷時は処理負荷を減らすことで待ち時間が短くなる可能性がありますが、アイドル状態の接続で行う小さなリクエストでは、ネットワークの往復時間が引き続き支配的なことが多いです。Visionは圧縮方式ではなく、プロキシサーバーから接続先サイトまでの物理的な距離を縮めるものでもありません。

v2rayNとv2rayNG:サブスクリプション追加後に確認する設定項目

デスクトップでv2rayNを使う場合は、まずサブスクリプションを追加してグループを更新し、対象ノードの編集画面で各項目を確認します。Androidのv2rayNGではXrayコアを使用し、同じ設定項目を確認できます。v2flyNGはv2flyコアを使用します。一部のVLESSリンクを読み込めるからといって、XrayのREALITYとVisionの組み合わせにも対応しているとは限りません。

編集画面や翻訳、内部項目の名称はバージョンによって変わることがあるため、以下では特定バージョンのメニュー名ではなく、設定の意味に沿って確認項目をまとめます。共有リンクでよく見かけるpbkはREALITYの公開鍵情報に対応します。画面上では別のラベルで表示される場合もあるため、使用中のコアの要件を確認してください。

確認項目想定される設定誤っている場合の対処
プロトコルとトランスポートVLESS。従来のTCP設定は、新しい画面ではRAWと表示されることもあります。サブスクリプションの元の値に戻し、別のトランスポートへ安易に変更しないでください。
セキュリティ方式security=reality通常のTLSとして誤って読み込まれていないか確認します。
フロー制御flow=xtls-rprx-visionノード名から推測して入力せず、サーバーの設定と照合します。
アドレスとポートサービス提供元が指定した接続入口のアドレスとポート入口には443番ポートのほか、別のポートも使用できます。
ユーザーID、SNI、公開鍵、shortIdそれぞれサーバーの設定と一致させます。サブスクリプションを再更新します。手入力の場合は、余分な空白や文字の入力漏れを確認してください。
クライアントフィンガープリント使用中のコアがサポートし、ノードの要件にも合うフィンガープリントを選びます。ブラウザーの完全なバージョン文字列をフィンガープリント欄に入力しないでください。

共有リンクではencryption=noneもよく使われます。これはVLESSプロトコル層の設定を表すもので、接続全体が暗号化されないという意味ではありません。外側のセキュアな通信はREALITYが担い、HTTPSの通信には内側のTLSもあります。設定を「より安全に」見せるために、プロトコルがサポートしていない値へ勝手に変更しないでください。

ハンドシェイク失敗や接続後にサイトを開けない場合の切り分け

トラブル時は、接続入口のTCPに到達できるか、REALITY認証が成功するか、アプリケーションの通信がプロキシに流れているかの3段階に分けて確認します。一度に変更する項目は1つにし、対応するログを記録してください。SNI、ポート、flow、フィンガープリントを次々と変更すると、原因を特定しにくくなります。

設定の追加は成功したのに、接続するとハンドシェイクに失敗するのはなぜですか?

まずシステム時刻を自動設定にし、接続入口のアドレス、SNI、公開鍵、shortIdを確認してください。REALITYでは時刻の確認が行われるため、システム時刻が大きくずれていると認証に失敗することがあります。入口に到達でき、すべての項目が一致している場合は、サーバー側で接続先サイトへの到達性とハンドシェイクの要件を確認してください。先に証明書検証を無効にしないでください。

ログにflow非対応と表示されます。この項目は削除してもよいですか?

まず、Visionに対応するXrayコアが実際に動作していることを確認し、起動ログに設定の解析エラーがないか確認してください。クライアントとサーバーの設定は一致させる必要があります。xtls-rprx-visionの削除は、一般的な解決方法ではありません。クライアントを更新した場合はコアを再起動し、元のサブスクリプション設定でテストしてください。

ノードの接続テストは成功するのに、Macのブラウザーでサイトを開けないのはなぜですか?

v2rayNでシステムプロキシが設定されているか確認し、macOSの「システム設定」→「ネットワーク」→現在のネットワークサービス→「詳細」→「プロキシ」で、実際のアドレスとポートを確認します。システムプロキシが適用されるのは、その設定に従うアプリだけです。コマンドラインツールでは別途設定が必要な場合があります。ポートはクライアントの現在の設定に合わせてください。

TUNを有効にしても遅い場合、Visionに変更すれば解決しますか?

まず同じノードでTUNをオフにし、システムプロキシだけを使って比較します。仮想ネットワークインターフェースのルーティング、DNS、ほかのネットワークツールとの競合を切り分けてください。TUNは通信をクライアントに取り込む方法を決め、Visionは一部の送信データの処理方法を決めます。対象の通信がルーティングルールによって直接接続に振り分けられていないかも確認してください。

ログにTCP接続のタイムアウトが表示される場合は、まずネットワーク経路、入口の待ち受け状態、ファイアウォールを確認してください。認証完了後に特定のサイトだけで問題が起きる場合は、そのサイトの名前解決結果、接続先への疎通、ルーティングルールを調べます。すべての接続エラーをREALITYの問題と決めつけず、設定ミスを覆い隠すために全般モードを何度も切り替えることも避けてください。

設定を一致させてから性能を比較する

まずは1つのノード、1種類の接続方法、1つのHTTPS接続先で安定して通信できる状態にします。その後、システムプロキシとTUNを個別にテストしてください。接続経路が明確になって初めて、CPU負荷や遅延の変化を意味のある形で比較できます。

v2rayN をダウンロードお使いの環境に合ったクライアントを選択