REALITYはプロキシ接続の認証とハンドシェイクの外観を担い、XTLS Visionはトンネル内のデータ処理と二重暗号化を扱います。VLESSノードをすでに追加し、安全設定やFlowの意味を確認したい方に向けた記事です。読み終えると、接続先アドレスとSNIの違い、クライアント設定の確認方法、速度低下が本当に暗号化によるものかを見分けられます。
まず整理したい3つの名称:VLESS、REALITY、Vision
v2rayNやv2rayNGでよく使われるノード構成は「VLESS + REALITY + XTLS Vision」です。これらは互いに置き換えられる3つのプロトコルではありません。VLESSはユーザー情報や接続先アドレスを含むプロキシ要求を定義し、REALITYは接続時の外側のハンドシェイクと認証を担います。VisionはXrayのフロー制御機能で、トンネル内のデータ処理方法を決めます。それぞれの役割を分けて考えると、エラー時にどの項目を確認すべきか判断しやすくなります。
| レイヤー | 該当する設定 | 主な役割 | 代替できないもの |
|---|---|---|---|
| プロキシプロトコル | VLESS | ユーザー情報、接続先アドレス、リクエスト情報を伝達する | 単独では通信全体を暗号化できない |
| セキュリティレイヤー | reality | 認証済みの安全な接続を確立し、認証されなかったハンドシェイクを処理する | ルーティングルールを代替できない |
| フロー制御 | xtls-rprx-vision | 条件に合うTLS通信を識別し、その後のデータ転送を最適化する | あらゆる回線のパケットロスや混雑を改善できるわけではない |
VLESSのencryptionで一般的な値はnoneです。これはVLESS自体がペイロード暗号化を追加しないという意味で、接続全体が平文になるわけではありません。REALITYを使う場合も接続確立にはセキュリティレイヤーが関わります。また、ブラウザーでHTTPSサイトにアクセスする際は、アプリケーション側のTLS暗号化も維持されます。
HTTPS通信をプロキシ経由にすると、なぜ暗号化が2層になるのか
ブラウザーでHTTPSサイトを開くと、まず接続先サイトとTLSハンドシェイクを行います。その後、ウェブページの内容やログイン情報、応答データはアプリケーション層のTLS暗号文になります。プロキシはこの接続を接続先サイトまで中継するだけで、サイトとの通信を復号する鍵を得るわけではありません。
プロキシトンネル自体にもTLSを使う場合、ブラウザーが生成した暗号文は、さらにプロキシ接続のTLSレコードに包まれます。クライアントが外側を暗号化し、サーバーが外側を復号してから、内側の暗号文をサイトへ転送します。この「二重のラッピング」は一般的で、実用上の意味もありますが、大量の通信では追加の暗号化・復号、バッファー処理、データコピーのコストが発生します。
Visionの目的はHTTPSを無効にすることではありません。内部TLSの段階を識別し、条件を満たす場合に後続データの転送方法を変えます。TLS 1.3の通信を識別できた場合は、適切な段階から直接転送モードに移行し、暗号化済みのアプリケーションデータに外側のTLS暗号化・復号を重ねずに済むことがあります。初期ハンドシェイクや必要なプロキシ情報は引き続き保護されるため、接続成立後にすべてのデータを無防備に送るわけではありません。
- 接続先サイトの暗号化は維持:ブラウザーは引き続きサイトの証明書を検証します。サイト証明書の検証を無効にするようユーザーに求めるべきではありません。
- 最適化には識別条件がある:すべてのTCP通信やTLSバージョンが同じ最適化経路を使えるわけではありません。
- 通常のHTTPがHTTPSになるわけではない:Visionがアプリケーションに代わって接続先サイトとのエンドツーエンド暗号化を追加することはありません。
- ハンドシェイク中にはパディングがある:Visionは初期段階のデータにパディングを加えます。「すべてのパケットが小さくなる」とは言えません。
REALITYが実在サイトのハンドシェイクを利用する仕組み
一般的なTLSプロキシサービスでは、独自ドメインと証明書を用意する必要があります。REALITYは異なる仕組みを採用しており、サーバー側で適切な実在のTLS接続先を設定し、クライアントは合意された認証情報を添えてハンドシェイクを開始します。認証に成功すると、クライアントとREALITYサーバーの間にプロキシ経路が確立されます。認証されなかった接続は、設定された接続先へ転送し、実在サイトとの通常のTLS通信のように見せることができます。
「実在サイトを利用する」は理解しやすくするための表現であり、そのサイトの秘密鍵を取得することでも、プロキシ通信のすべてがいったんそのサイトを経由することでもありません。認証後のプロキシデータは、サーバーが接続先アドレスに応じて転送します。設定された実在サイトは、主にハンドシェイクの外観や未認証接続の処理などに関わります。また、クライアントがREALITYサーバーを信頼する根拠は、接続先サイトの公開証明書をそのままローカルにコピーすることではありません。
接続先アドレス、SNI、実際の接続先は別の項目
- サーバーアドレス:クライアントが実際に接続するプロキシサーバーのIPアドレスまたはドメイン名です。ハンドシェイク先のサイトに置き換えてはいけません。
- SNI / Server Name:ハンドシェイクでクライアントが使用する名前で、サーバーが許可する値と一致している必要があります。アドレスに接続できても、この項目が正しいとは限りません。
- サーバー側の実際の接続先:サーバーの管理者が選択します。TLS 1.3やHTTP/2などの対応条件に加え、サーバーから接続先への遅延や到達性も確認が必要です。
- クライアントフィンガープリント:
chromeなど、ClientHelloの構成に影響します。正しい鍵、SNI、認証情報の代わりにはならず、実際のブラウザーと完全に同じ挙動を保証するものでもありません。
v2rayN・v2rayNGで確認する設定項目
まず信頼できるサブスクリプションからノード情報をまとめてインポートし、ノード編集画面で項目を確認します。クライアントのバージョンによってメニュー名は異なりますが、プロトコル、トランスポート、セキュリティレイヤー、Flowの意味は変わりません。以下の2つのカードは、同じ接続のクライアント側とサーバー側の対応を示したもので、そのまま使えるノード設定一式ではありません。ポート443はよくある例にすぎず、実際にサーバーが待ち受けているポートを使ってください。
クライアント側のノード設定
- プロトコル
VLESS- トランスポート
- TCP。新しいバージョンではRAWと表示される場合もあります
- セキュリティレイヤー
reality- Flow
xtls-rprx-vision- フィンガープリント
chrome。サーバー設定に合わせて確認
ノード提供元から正しいアドレス、ポート、ユーザーID、SNI、鍵情報、Short IDを入手する必要があります。
サーバー側の対応設定
- インバウンドプロトコル
VLESS- 待ち受けポート
443、または実際に指定されたポート- ユーザーのFlow
xtls-rprx-vision- セキュリティ設定
- REALITYの秘密鍵と許可する名前
- ハンドシェイク先
- 条件を満たし、サーバーから接続できるTLSサイト
秘密鍵はサーバーに保管します。クライアントの認証情報はサーバー設定と一致させ、適当に生成して置き換えてはいけません。
REALITYの鍵情報は、クライアント画面やXrayの設定バージョンによって項目名が異なる場合があります。古い設定ではpublicKey、新しい設定ではpasswordが使われることがあります。項目名だけを見てJSONを手作業で移し替えず、実際に動作しているコアのドキュメントとクライアントのインポート仕様に従ってください。サーバーの秘密鍵を一般ユーザーに渡してはいけません。
Short IDには16進文字列を使います。空でない場合、文字数は偶数で、最大16文字です。空欄を許可するかどうかはサーバー設定によります。ユーザーIDや適当なメモではありません。サブスクリプションにShort IDが記載されている場合は、その値を変更しないでください。1文字変えるだけでも認証に失敗することがあります。
まとめ:まず設定項目の組み合わせを確認し、その後でフィンガープリントを調整
まずアドレス、ポート、ユーザーID、Flow、SNI、認証情報を確認してください。基本設定が一致し、コアが対応していると確認できてから、フィンガープリントを調整すると原因究明に役立ちます。複数の項目を同時に変更すると、次のエラーの原因を特定できなくなります。
暗号化を1層減らすと速くなる理由、速くなるとは限らない理由
暗号化だけが処理負荷の原因ではありませんが、高スループットの接続では大きな負荷になることがあります。Visionは条件に合うデータの二重暗号化・復号を減らし、実装が対応していれば効率的な転送経路を使うことで、CPU使用率とデータコピーの負担を抑えます。サーバーで大容量通信を複数処理する場合、短いウェブリクエストより効果が表れやすくなります。
ボトルネックがモバイル回線のパケットロス、サーバーのアップリンク帯域、通信事業者の混雑、接続先サイトの速度制限にある場合、暗号化を1層減らしてもダウンロード速度は変わらないかもしれません。TCPの輻輳制御はそのまま働き、REALITYが回線の物理帯域を増やすこともありません。あるノードが速かったからといって、「REALITYのノードはすべて他の構成より速い」とは言えません。
| 観測された症状 | 優先して確認する項目 | Visionで改善する可能性 |
|---|---|---|
| ダウンロード中、単一コアの使用率が常に上限近くまで達する | クライアントとサーバーのCPU、コアのバージョン、実際のFlow設定 | 最適化条件を満たせば、処理負荷を軽減できる可能性があります |
| CPU使用率は低いのに速度が安定しない | パケットロス、混雑、アップリンク帯域、接続先の速度制限 | 通常、回線のボトルネックを直接解消することはできません |
| ウェブページの初回表示は遅いが、継続ダウンロードは正常 | DNS、ハンドシェイクの往復時間、接続の再利用、接続先の応答 | 長時間の通信に対する最適化で、初回表示の遅延が必ず短縮されるわけではありません |
| ノードを変えると速度が大きく変わる | 2台のサーバーで回線と負荷の条件が同じか | この結果だけではフロー制御が原因とは判断できません |
条件をそろえて比較テストを行う方法
- 同じ端末、ネットワーク、サーバー、ダウンロード先を使い、他の大容量通信を停止します。Wi-Fiの電波状況の変化を、プロトコルの効果と誤認しないようにしましょう。
- サーバーが明確に対応している2種類のテスト設定を使います。比較のためにFlowを単純に空欄にせず、クライアントとサーバーの設定を一致させてください。
- 各設定で60秒間連続してダウンロードし、3回繰り返します。平均スループット、クライアントとサーバーのCPU使用率、接続エラーを記録してください。
- 大容量ファイルのダウンロードとウェブページの初回表示をそれぞれテストします。CPU使用率だけが下がり、スループットが変わらない場合、最適化は機能していても、速度のボトルネックは別の場所にある可能性があります。
まとめ:スループットとCPU使用率で判断する
まず回線、接続先、負荷の条件をそろえてから、速度と処理負荷を比較してください。端末の性能、コアの実装、ネットワーク環境によって結果が異なるため、この記事では一定の高速化率を示しません。単一の数値ですべてのノードを評価することはできません。
接続できない場合は、ハンドシェイクの段階ごとに確認
「ハンドシェイク失敗」はセキュアな接続が完了しなかったことを示すだけで、証明書の問題とは限りません。REALITYの認証情報の不一致、許可されていないSNI、サーバー側の接続先に到達できないこと、端末の時刻ずれなども接続失敗の原因になります。まずTCP接続が確立できるかを確認し、次にREALITYの認証、最後にVLESSのユーザー情報とFlowを調べましょう。暗号化の設定を何度も切り替えるより、効率的に原因を絞り込めます。
- まず接続先アドレスを確認:クライアントがハンドシェイク先ではなく、プロキシサーバーに接続していることを確認します。ログにタイムアウトや接続拒否がある場合は、待ち受けポート、ファイアウォール、ネットワークからの到達性を調べてください。
- 次にシステム時刻を確認:Windowsの「設定」→「時刻と言語」→「日付と時刻」で、自動時刻設定と同期状態を確認します。Androidでも日付と時刻の自動設定を有効にしてください。REALITYではサーバーのポリシーにより時刻のずれが制限されることがあります。
- 認証情報を照合:SNI、クライアントの認証鍵情報、Short IDを1項目ずつ比較します。サーバーで鍵が更新されると、アドレスが同じでも古いサブスクリプションでは接続できない場合があります。
- ユーザー情報とFlowを確認:VLESSのユーザーIDがサーバーに登録されていることと、クライアント・サーバーのVision設定に互換性があることを確認します。REALITYのセキュリティ設定とFlowの項目を混同しないでください。
- 実際に使われているコアを確認:v2rayNで、現在選択されているXrayコアがこの組み合わせに対応しているか確認します。画面上でノードを保存できても、選択中のコアがすべての項目を受け付けるとは限りません。
- 最後に接続先と転送を確認:ハンドシェイクに成功してもページを開けない場合は、サーバーのDNS、アウトバウンドルーティング、接続先への到達性、クライアントが対象の通信をプロキシ経由にしているかを調べます。
allowInsecureを有効にするとREALITYの認証失敗を直せる?
一般的な修復方法として使うことはできません。通常のTLS証明書検証をスキップしても、誤ったREALITYの鍵、Short ID、SNIが一致するようにはなりません。ノード提供元の完全な設定に戻し、ハンドシェイクログから原因を特定してください。また、テスト目的でブラウザーの接続先サイトに対する証明書検証を無効にしないでください。
REALITYノードにWebSocketや中継をそのまま組み合わせられる?
この記事で扱う構成はTCP/RAWです。クライアント側でWebSocketに変更したり、パスを入力したりするだけでは動作しません。一般的なHTTPS中継では、TLSをいったん終端して再確立すると、エンドツーエンドのハンドシェイク条件が変わります。別のトランスポートや転送構成に対応しているかどうかは、使用するXrayのバージョンとサーバー全体の設計に基づいて確認してください。
サブスクリプションのインポート後にルーティングも確認する理由
サブスクリプションはノードの接続情報を提供し、ルーティングはどのリクエストにそのノードを使うかを決めます。接続テストに成功しても特定のサイトが直接接続される場合は、REALITYの問題ではなく、ルールで先にdirectへ振り分けられている可能性があります。まず対象リクエストの実際のアウトバウンドを確認してからルールを変更し、ルーティングの問題をセキュリティレイヤーの障害と誤認しないようにしましょう。