VMessとVLESSの違いを解説:暗号化方式・通信構成・クライアントの対応状況

VMessとVLESSの認証や暗号化の違い、主な通信構成、v2rayN・v2rayNGの対応状況を比較。サブスクリプションのノード設定をわかりやすく解説します。

この記事の要点

VMessとVLESSはプロキシプロトコルであり、クライアントや通信方式ではありません。サブスクリプションのノードが使えるか判断するには、プロトコル、通信方式、セキュリティ層、実際に動作するコアを確認する必要があります。サブスクリプションをインポートした方やノード設定を確認したい方、PC・Android向けクライアントを選んでいる方に向けて、UUID、TLS、REALITY、flowの役割と接続エラーの切り分け方を解説します。

VMessとVLESS:認証・暗号化・通信方式を整理

ノードの設定は「VMess」や「VLESS」というラベルだけではありません。通常はサーバーアドレス、ポート、ユーザー認証情報、通信方式、セキュリティ層も含まれます。プロトコルはプロキシリクエストの処理とユーザーの識別を担い、TCPやWebSocketなどはデータの伝送を担います。TLSやREALITYは、それぞれの方式に応じた安全なハンドシェイクと接続保護を提供します。

VMessにはプロトコル内でデータを暗号化する機能があり、現在の設定では一般にAEAD認証方式が使われます。一方、VLESSの一般的な設定ではencryptionをnoneにし、TLSやREALITYなどの外側の仕組みで接続を保護します。ここでは一般的なサブスクリプション設定を扱います。新しい拡張やすべてのコア実装が同じとは限りません。

一般的なサブスクリプション設定における役割の違い
比較項目VMessVLESS
ユーザー認証情報UUIDなどを使って認証し、現在の方式ではAEADを使用します。一般的な設定ではUUIDでユーザーを識別します。サーバー側の設定と一致させる必要があります。
データの暗号化プロトコル内でデータを暗号化できます。具体的な方式は設定とコアの実装によって異なります。一般的なencryption: none設定では、プロトコル内でデータを暗号化しません。
外側の接続保護TLSを併用できます。プロトコル自体に暗号化機能があっても、通信設定の確認は必要です。インターネットでよく使われる構成では、TLSまたはREALITYで接続を保護します。
通信方式TCPやWebSocketなどが一般的です。サーバー側の設定によって異なります。TCP、WebSocket、gRPCなどが一般的です。コアとサーバー側の設定によって異なります。
追加で確認する項目システム時刻、認証方式、旧設定に残るalterId。flow、セキュリティ層、REALITYで必要な設定項目。

確認の順序:まず構成全体を確認し、次にプロトコル名を比較

ノードを入手したら、まず「プロトコル+通信方式+セキュリティ層+flow」を確認しましょう。VLESSという表示だけを見てクライアントを変更したり、VMessのUUIDをVLESSノードにコピーしたりしても、プロトコルを切り替えることはできません。

暗号化方式:VLESSのnoneは接続全体が平文という意味ではない

「VLESSは暗号化されない」という説明には重要な前提が抜けています。通常は、VLESSプロトコル自体がencryption: noneの設定でプロキシデータを暗号化しないという意味であり、外側の接続も暗号化されないという意味ではありません。VLESS+TLSの場合、クライアントとTLS終端の間はTLSで保護されます。REALITYを使う場合は、対応するコアが所定のハンドシェイクを実行する必要があります。

一方、VLESS+TCPでセキュリティ層もnoneの場合、前述の外側の保護は得られません。アプリ自身のHTTPSが保護するのは該当するアプリケーション層のデータだけであり、プロキシ接続全体が暗号化されているとは限りません。トラブルシューティングのためにセキュリティ層をむやみに無効にしたり、証明書検証を無効にして恒久的な対処としたりしないでください。

通信構成:WebSocket、TLS、REALITY、Vision

WebSocketは暗号化プロトコルではなく、TLSも特定のプロキシプロトコルとの組み合わせに限定されません。そのため、VMess+WebSocket+TLSとVLESS+WebSocket+TLSは通信形式が似ていても、認証やプロトコルの処理は異なります。アドレスとポートが同じでも、クライアントのプロトコル選択だけを変更してはいけません。

よくある構成と確認が必要な設定項目
構成主な設定項目よくある誤解
VMess+WebSocket+TLSUUID、暗号化オプション、WebSocket Path、Host、TLSのサーバー名。WebSocketのHostとTLSのサーバー名を同じ設定項目だと思い込む。
VLESS+WebSocket+TLSUUID、encryption、Path、Host、TLSの設定。別のノードのパスをそのまま使ったり、不要なflowを追加したりする。
VLESS+TCP+TLSUUID、TLSのサーバー名。サーバーがVisionを要求する場合はflowも一致させます。すべてのVLESSノードにxtls-rprx-visionの設定が必要だと思い込む。
VLESS+TCP+REALITYUUID、公開鍵、shortId、サーバー名、フィンガープリント、サーバーが要求するflow。アドレスとUUIDだけをインポートし、REALITYの設定を見落とす。

xtls-rprx-visionはflowの設定値であり、あらゆる通信方式で使える汎用の高速化スイッチではありません。一般的なVision構成では、TCPとTLSまたはREALITYを組み合わせます。WebSocketノードに経験則だけで追加しないでください。サーバーが要求していない項目は、サブスクリプションの値をそのまま使うのが基本です。

443
TLS用ポートの例。ポート番号だけでTLSが有効とは限りません
10808
ローカルSOCKSの受け入れポート例。リモートポートとは異なります
0
現在のVMess AEAD設定で一般的なalterIdの値

これらの数値は各項目の役割を見分けるためのもので、すべてのノード設定を変更する指示ではありません。リモートポートはサーバー側で決まり、ローカルポートはクライアントの現在の設定で確認します。リモートポートが443でも、それだけでセキュリティ層を判断することはできません。古い解説にある0以外のalterIdは、過去の設定として確認が必要です。サーバー側に確認せず、そのまま適用しないでください。

クライアントの互換性:インポートできてもコアで動作するとは限らない

v2rayNはデスクトップクライアントで、ノードの実行には選択したコアを使用します。v2rayNGはXrayコアを使うAndroidクライアント、v2flyNGはv2flyコアを使うAndroidクライアントです。クライアントはサブスクリプション、画面表示、ルーティングなどを管理しますが、プロトコル構成を利用できるかどうかは、実際に使うコアのバージョンと機能の対応状況で決まります。

PC・Androidでの確認方法:同じサブスクリプションで動作を検証

デスクトップ:v2rayN
  • サブスクリプションをインポートしたら、対象ノードの編集画面を開き、プロトコル、通信方式、セキュリティ層を確認します。
  • VLESS+REALITYまたはVisionを使う場合は、その構成に対応するXrayコアが実際に動作していることを確認します。
  • 起動時の出力を確認し、設定の解析エラーと接続段階のエラーを切り分けます。
Android:v2rayNG / v2flyNG
  • v2rayNGでは、アプリに付属するXrayコアがサブスクリプションの設定項目に対応しているか確認します。
  • v2flyNGでは、v2flyコアの対応範囲に合わせてノードを選び、Xray専用の構成をそのまま使わないでください。
  • サブスクリプションを更新した後、対象ノードを再確認し、以前に手動でインポートした複製を選んでいないか確認します。

同じサブスクリプションに複数のプロトコル構成が含まれることがあります。ノード一覧が同じでも、すべてのクライアントが全ノードに同じように対応するとは限りません。

v2flyNGでは、画面に「VLESS」と表示されているだけでREALITYやVisionが使えると判断しないでください。アプリとコアの実際の対応状況を確認しましょう。VMessも互換性の問題がないとは限りません。古い共有形式、認証方式、通信設定が原因で、インポート後に接続できないこともあります。

  1. まずクライアントの「バージョン情報」またはコア情報で、アプリとコアのバージョンを記録し、サービス提供元に必要な構成を確認します。
  2. サブスクリプションの更新後、同じ名前のノードが複数のグループにないか確認し、テスト対象を特定します。
  3. エラーの詳細を保存します。起動直後に終了する場合は、ルーティングを変更する前に未対応の設定項目を確認してください。

サブスクリプションのインポート:プロトコル名ではなく設定項目から確認

一般的なVMess共有リンクはvmess://、VLESS共有リンクはvless://で始まります。前者は設定データをエンコードして含むことが多く、後者はURIのクエリパラメーターで通信方式やセキュリティ設定を渡すことがよくあります。サブスクリプションでは、複数のノードがまとめて返される場合があります。リンクの先頭を認識できても、確認できるのは解析の入口までです。

問題を調べるときは、元のサブスクリプションのノードを残し、確認用に複製することをおすすめします。共有リンクやサブスクリプションURLには有効な認証情報が含まれることが多いため、他の人にトラブル対応を依頼する際はUUID、トークン、アカウントを特定できる情報を隠してください。サブスクリプションURL全体を公開ログやスクリーンショットに載せないでください。

同じサブスクリプションでVMessは使えるのに、VLESSが使えないのはなぜ?

接続できないノードの編集画面を開き、まずセキュリティ層がREALITYか、flowがxtls-rprx-visionか、現在のコアが対応しているかを確認します。次に公開鍵、shortId、サーバー名が正しくインポートされているか確認し、最初からアカウントの無効化を疑わないようにしましょう。

ノードに遅延が表示されるのにブラウザーで開けない。プロトコルの互換性が原因?

必ずしもそうとは限りません。TCPの疎通確認に成功しても、ポートに到達できたことしかわかりません。まず何をテストしたのかを確認し、システムプロキシとローカルの受け入れポートを調べてください。ローカルSOCKSポートが10808なら、下記のコマンドでブラウザーのプロキシ選択を介さずに直接テストできます。

VMessで突然認証に失敗したら、VLESSに切り替えるべき?

まずシステムの時刻を自動調整し、UUIDを確認してからサブスクリプションを更新してください。VMessの認証は時刻情報に依存するため、システム時刻が大きくずれていると失敗することがあります。サーバー側の設定を合わせずにプロトコル名を変更しても、認証の問題は解決しません。

どちらのプロトコルでも接続できるなら、速いのはどっち?

近い時間帯に同じテスト先を使い、接続確立までの時間、ダウンロードの継続的な速度、失敗の有無をそれぞれ記録します。回線、サーバー負荷、通信方式、テスト条件が近い場合に限り、比較に意味があります。サーバーが異なる速度差をプロトコルの違いだけに結びつけることはできません。

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 -I https://example.com/

このコマンドは、ローカルで127.0.0.1:10808のSOCKSポートが実際に待ち受けていることを前提としています。クライアントで別のポートを使っている場合は、実際の値に置き換えてください。socks5hを指定すると、接続先ドメインの名前解決をプロキシ側で行います。--connect-timeout 10は接続時のタイムアウトを秒単位で設定し、-Iはレスポンスヘッダーを要求します。これは接続確認用で、帯域測定ではありません。リクエストはコアに渡された後、現在のルーティング設定に従います。

選び方:使えるノードを維持し、サーバーの構成に合わせて設定

プロトコルの選択は、名前のアップグレードではありません。VMessノードが安定して使えているなら、VLESSという表示だけを理由に設定を手動で置き換える必要はありません。サーバーから完全なVLESS+TLSまたはREALITYのノードが提供されている場合も、「互換性のため」にVMessへ変更する必要はありません。両端のプロトコル実装と接続設定全体を一致させることが重要です。

動作確認済みのサブスクリプション設定をそのまま使う

おすすめ

サーバーから提供されたプロトコル、通信方式、セキュリティ層を維持し、コアが対応していることを確認してから接続をテストします。サブスクリプションの更新とルーティングの変更を別々に行うと、トラブルシューティング時の確認項目を減らせます。

おすすめ:普段使い、複数デバイスへのインポート、すでに使えるノードがある場合

既存環境との互換性を保つためVMessを使用

サーバーでVMessを使用しており、クライアントがその認証方式と通信方式に対応している場合は、元の設定を維持します。問題が発生したら、まず時刻、UUID、通信設定を確認してください。

おすすめ:既存のVMess環境、互換性が確認済みの設定でトラブルを調べたい場合

要件に合わせてVLESSのセキュリティ構成を使用

サーバーからTLSまたはREALITYの設定が明示されている場合は、その構成に対応するコアを選びます。Visionのflowはサーバーから指定された場合に限って設定し、不要な項目を追加しないでください。

おすすめ:VLESSの設定一式を入手済みで、コアの対応範囲が明確な場合

v2rayNをダウンロードプラットフォームとインストーラーの選び方