VMess・VLESS・Trojan・Shadowsocksの違いと選び方|各プロキシプロトコルの仕組みと用途を比較

暗号化方式、ハンドシェイクの負荷、トランスポートとの組み合わせ、検出されにくさを比較。デスクトップとAndroid向けの選び方も解説します。

この記事の要点

プロトコル選びでは、まずサーバー側で提供されている方式を確認し、次にクライアントのコアが必要な機能に対応しているかを確認します。既存のVMessノードは、名前が古いという理由だけで変更する必要はありません。新しい設定では、対応状況を確認したうえでVLESSとTLSまたはREALITYを検討できます。証明書とドメインをすでに運用している場合はTrojan、シンプルな暗号化プロキシが必要ならShadowsocksの方式を確認しましょう。この記事ではプロトコル、トランスポート、安全性を分けて解説し、macOS・Androidでサブスクリプション設定を確認する手順と、同じ条件で使用感を比較する方法を紹介します。

1. プロトコル・トランスポート・セキュリティ層を整理する

v2rayNはデスクトップ用クライアントであり、プロキシプロトコルではありません。V2RayとXrayは接続、ルーティング、DNSなどの設定を処理するプロキシコアです。VMess、VLESS、Trojan、Shadowsocksは、クライアントとサーバー間で認証やデータのカプセル化・暗号化を行う方式を定めています。設定をインポートできても、現在のコアがすべての機能を実行できるとは限りません。

ノード名の「VLESS + WebSocket + TLS」は3つの層を表しています。VLESSはプロキシ要求と認証情報を扱い、WebSocketはデータを運び、TLSは接続を暗号化してサーバーの身元を確認します。これらをひとまとめに「プロトコル」と捉えると、ノードの変更時にパス、ドメイン、セキュリティ設定を見落としやすくなります。

プロキシプロトコル
VMess、VLESS、Trojan、Shadowsocksのどれを使うか確認します。クライアントとサーバーで同じプロトコルを指定する必要があり、クライアント側の名称だけを変更しても接続できません。
トランスポート方式
TCP、WebSocket、gRPCなど、実際に設定されている方式を確認します。プロトコル、コア、バージョンによって対応する組み合わせは異なります。
接続のセキュリティ
TLSやREALITYなどの設定を確認します。REALITYはXrayに関連するセキュリティ機構で、独立したプロキシプロトコルではありません。一般的な証明書の設定と同じように置き換えることもできません。

2. 4種類のプロトコルにおける暗号化と認証の違い

暗号化の有無はプロトコルの項目だけでなく、接続全体で判断します。VLESSでよく使われるencryption=noneは、プロトコル自体がペイロードを暗号化しないことを示します。外側でTLSまたはREALITYが正しく有効になっていれば、接続は保護されます。反対に、ポートを443にしただけではTLSが有効とは限りません。

プロトコル 認証と暗号化 一般的な組み合わせ 確認が必要な項目
VMess UUIDで認証します。現行の設定ではAEAD認証方式を使用し、ペイロードの暗号化はセキュリティ設定によって異なります。 VMess + TCP、またはWebSocket + TLS。 UUID、ペイロードのセキュリティ設定、システム時刻、トランスポート設定。
VLESS UUIDで認証します。プロトコル自体はペイロードを暗号化しないため、通常は外部のセキュリティ層と組み合わせます。 VLESS + TLS、またはXrayが対応するREALITYの組み合わせ。 UUID、セキュリティ層、flow、REALITYで必要な公開鍵などの設定値。
Trojan パスワードで認証し、認証情報とプロキシデータの保護にTLSを使用します。 Trojan + TCP + TLS。 パスワード、証明書のドメイン、SNI、証明書の検証状態。
Shadowsocks 選択した暗号化方式で保護します。従来のAEAD方式と2022シリーズでは、鍵のルールが異なります。 TCP/UDPに対応したネイティブな暗号化プロキシ。 暗号化方式の正式名称、パスワードまたは鍵、コアの対応状況。

VMessのalterIdは互換性に関わる設定です。現行のAEAD設定では通常0を指定します。古い解説を参考に、別の値を安易に入力しないでください。VMessの認証には時刻情報も使われます。時刻が大きくずれている場合は、まずmacOSの「システム設定」→「一般」→「日付と時刻」で自動設定を有効にし、その後ノードを確認してください。

Shadowsocksには単一の暗号化方式があるわけではありません。aes-128-gcmと2022-blake3-aes-128-gcmは別の設定です。後者では形式に合った事前共有鍵が必要で、任意の短いパスワードをそのまま鍵として入力することはできません。方式を変更する場合はサーバー側も同じ設定にします。

443
HTTPSでよく使われるTCPポートであり、TLSが有効であることを示すものではありません
128ビット
UUIDの識別子の長さであり、暗号強度を表すものではありません
16バイト
2022-blake3-aes-128-gcmで使用する元のマスターキーの長さ

3. ハンドシェイクの負荷と速度:テスト条件をそろえる

Webページを初めて開くときは、DNS検索、接続確立、セキュリティハンドシェイク、プロキシ要求、サイトからの応答が発生します。Trojanは通常、TLS接続を確立してからプロキシ要求を送ります。VMessとVLESSの実際の負荷は、TLS、WebSocketなどのトランスポートを重ねるかどうかで変わります。Shadowsocksのネイティブ接続にはTLS証明書のハンドシェイクがありませんが、どのネットワークでも速いとは限りません。

一般的なHTTP/1.1環境でWebSocketを使う場合、アップグレードのハンドシェイクも必要です。接続を再利用すると、後続のリクエストで接続を確立するコストを抑えられる場合がありますが、輻輳や障害の影響範囲も変わります。そのため、プロトコル名だけから遅延を決めつけることはできません。また、1回の「レイテンシ測定」のミリ秒数を、Webページ全体の読み込み時間と同一視しないでください。

  1. 回線をそろえる:同じサーバー、同じ出口、近い時間帯の設定を比較します。地域の異なるノードではプロトコルの差だけを比べられません。
  2. プロキシの入口をそろえる:テスト中はシステムプロキシまたはTUNモード、ルーティングルール、DNS設定を統一し、一方だけがプロキシを通らず直接接続する状況を避けます。
  3. 項目ごとに記録する:ページを初めて開くまでの時間、継続的なダウンロード速度、失敗回数をそれぞれ記録します。各設定を最低5回テストし、最良値だけでなく中央値を確認してください。
  4. UDPを個別に確認する:通話、ゲーム、QUICを使う場合は、実際のアプリで動作を確認します。Webページが開けても、UDPが正しく転送されているとは限りません。

結論:不安定な設定を先に除外してから速度を比べる

5回のテストでタイムアウトが繰り返し発生する場合は、まず回線とトランスポートの適合性を確認してください。すべての設定で安定してリクエストを完了できて初めて、所要時間の中央値を比較する意味があります。同じ条件で記録していない場合、プロトコル名だけで速度を順位付けしないでください。

4. TLS、REALITYと検出されにくさの注意点

TLSは通信内容を保護しますが、「TLSを使っている」だけで通常のWeb通信と完全に同じ見た目になるわけではありません。ハンドシェイクの特徴、ドメイン、IPアドレスの評価、パケット長や送信間隔、異常な要求に対するサーバーの応答などが検出結果に影響する場合があります。VMessもTLSと組み合わせた場合、プロトコル名だけを見て他の方式より弱いと判断することはできません。

TrojanはTLS上でプロキシ通信を行いますが、運用には正しい証明書、ドメイン、サーバー側の動作設定が必要です。VLESSとREALITYを組み合わせる場合は、両側のコアが対応していることを確認し、公開鍵、serverName、shortIdなどを正しく設定してください。特定のflowが必要な構成もあります。項目を増やせばよいというものではありません。

5. 用途に合わせた選び方:新規設定、既存サブスクリプション、Android端末

以下の「おすすめ」は、新しい設定を作成でき、サーバー側を調整でき、クライアントが該当機能に対応している場合に限ります。すでに使えているサブスクリプションがあるなら、事業者が指定する組み合わせを維持するのが基本です。プロトコルは上位・下位の順に並ぶものではありません。現在のネットワーク環境と管理できる範囲に合う設定を選びましょう。

VLESS + TLSまたはREALITY

おすすめ

新規設定でまず検討できる方式です。VLESS自体はペイロードを暗号化しないため、セキュリティは正しく設定された外側の保護に依存します。REALITYや特定のflowを使う前に、Xrayコアとサーバー設定の組み合わせを確認してください。

おすすめのユーザー:サーバー設定を管理でき、セキュリティ層の設定を自分で確認できる方。

Trojan + TLS

ドメインと証明書の運用体制がすでにある場合、設定の流れを把握しやすい方式です。パスワード、SNI、証明書の検証を重点的に確認してください。接続エラーの対処として、証明書検証を長期間無効にしないでください。

おすすめのユーザー:TLSの運用経験があり、サーバーがTrojanを明示的に提供している方。

VMess AEAD

安定して使えているVMessサブスクリプションは、そのまま利用できます。既存のトランスポートとTLS設定を維持し、時刻同期を確認してください。現在の構成に問題がある証拠がなければ、プロトコル名だけを理由に再構築する必要はありません。

おすすめの場面:既存のサブスクリプションやサーバーを使い、互換性を優先する場合。

Shadowsocks AEAD / 2022

設定項目が比較的まとまっており、対応方式を明示しているサーバーに向いています。選択前に正確な方式名と鍵の形式を確認してください。UDPを使うアプリでは、サーバー側とローカルの入口の両方が転送に対応している必要があります。

おすすめの場面:軽量な暗号化プロキシを使い、暗号化方式と鍵が分かっている場合。

macOSでv2rayNを使う場合は、クライアントのバージョンだけでなく、現在選択しているコアを確認してください。Android版のv2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。REALITY、特定のflow、Shadowsocks 2022を使う場合は、各コアのバージョンが実際に対応しているか確認が必要です。3つのクライアントで、すべての設定を共通して使えるとは限りません。

6. インポート後の確認:プロトコル設定からローカルプロキシの入口まで

クライアントにノードが表示されていても、アプリの通信がノードを通っているとは限りません。インポート後はノードの編集画面でサーバー側の設定を確認し、次にローカルプロキシの入口を確認してください。1080はSOCKS5のテスト用ポートの例で、v2rayNの固定デフォルト値ではありません。コマンドを実行する前に、現在の待ち受けポートに置き換えてください。

  1. プロトコルと認証情報:VMess/VLESSのUUID、Trojanのパスワード、またはShadowsocksの方式名と鍵を確認します。コピー時に先頭や末尾に空白が入っていないかも確認してください。
  2. アドレスとポート:サーバーのアドレスとポートを確認します。ローカルの待ち受けポートと、接続先サーバーのポートは別のものです。
  3. トランスポートとセキュリティ:WebSocketではpathとHost、gRPCではserviceNameを確認します。TLSではserverNameを確認し、REALITYでは公開鍵とshortIdも確認してください。
  4. ローカルの待ち受け:v2rayNの「設定」→「パラメータ設定」から、ローカルの待ち受けポートまたはインバウンドポートを確認します。画面上の名称はバージョンによって異なるため、現在の設定と起動ログを確認してください。
  5. アプリの接続経路:システムプロキシが設定されているか、必要に応じてTUNが有効になっているか確認します。入口を1つだけテストするときは、ルーティングやDNSのルールを同時に変更しないでください。
# 1080 を現在のクライアントの SOCKS5 待ち受けポートに置き換える
curl --proxy socks5h://127.0.0.1:1080 --connect-timeout 10 --max-time 30 -I https://example.com/

socks5hを使うと、接続先のドメイン名をSOCKSプロキシ側で解決できるため、テスト時にローカルでの名前解決が影響するのを抑えられます。ただし、その後のDNS通信が特定の暗号化経路を通るとは限りません。コマンドの結果はクライアントのルーティングルールにも左右されるため、アウトバウンドログも確認してください。127.0.0.1に接続できない場合は、まずローカルの待ち受け設定を確認します。ハンドシェイクや認証のエラーが出る場合は、サーバー側の設定を確認してください。

7. プロトコル選びでよくある質問

VLESSの暗号化がnoneと表示されます。変更したほうがよいですか?

安易に変更しないでください。ノードの編集画面を開き、TLSまたはREALITYの設定がサーバー側と一致しているか確認します。ここでのnoneはVLESSプロトコル層の設定です。外側にも保護がない場合は、安全なインターネット接続とみなさず、サーバー側に設計を確認してください。

VMessノードはまだ使えます。すべてVLESSに変更する必要がありますか?

プロトコル名だけを理由に変更する必要はありません。まず時刻同期、現在のコア、トランスポート設定を確認し、同じネットワーク条件でテストします。サーバーから利用可能なVLESS設定が提供されている場合に限って比較用にインポートしてください。既存ノードのプロトコルを直接切り替えることはできません。

Trojanで証明書エラーが出ます。検証をスキップすればよいですか?

まずシステム時刻とノードのserverNameを確認し、サーバー側で証明書の有効期限、証明書チェーン、ドメインとの一致を確認してもらいます。検証をスキップしたままにしないでください。証明書またはドメインの設定を修正したら、検証を有効に戻してテストします。

Shadowsocksをインポートできたのに、認証エラーが続くのはなぜですか?

方式名を一字ずつ確認し、入力欄に必要なのがパスワードか、指定形式の鍵かを確認してください。2022方式では通常、Base64エンコードされた固定長の鍵を使います。従来のAEAD方式のパスワードと自由に置き換えることはできません。コアが該当方式に対応しているかも確認してください。

同じサブスクリプションがPCでは使えるのに、Androidではタイムアウトするのはなぜですか?

まず両端で実際に選択しているノード、ネットワーク、セキュリティ設定を比較してください。v2rayNGとv2flyNGではコアが異なります。REALITYや特定のflowを使う場合は、先に互換性を確認します。その後、同じWi-Fiに接続してテストし、設定の問題とモバイルネットワークの違いを切り分けてください。

V2Rayクライアントをダウンロード