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

VMess・VLESS・Trojan・Shadowsocksを暗号化、トランスポート、設定の複雑さ、クライアント対応状況で比較。用途に合ったプロトコルの選び方を解説します。

この記事の概要

まず、プロキシプロトコル、トランスポート方式、セキュリティ層の違いを把握し、サーバー側のパラメーターとクライアントのコアを確認しましょう。サブスクリプションのノード選び、デスクトップとAndroidの設定移行、自前サーバーの構築を検討している方向けの記事です。VMess、VLESS、Trojan、Shadowsocksで必要な設定項目や、互換性のない組み合わせ、接続できないときに最初に確認すべき層がわかります。

1. プロキシプロトコル・トランスポート方式・セキュリティ層の違い

VMess、VLESS、Trojan、Shadowsocksは、クライアントとプロキシサーバー間の認証、リクエストのカプセル化、転送方法を定めます。TCP、WebSocket、gRPCは接続方式またはデータの運び方を示し、TLS、REALITYはセキュリティ機構です。ノード名には複数の層の情報がまとめて記載されることが多いため、先頭のプロトコル名だけでは設定全体を判断できません。

たとえば、VLESS + WebSocket + TLSとVLESS + TCP + REALITYは、どちらもVLESSを使いますが、サーバーの受け付け設定、ハンドシェイクのパラメーター、中継ネットワークの要件が異なります。前者のノードのトランスポート方式をTCPに変えても、後者の設定にはなりません。サーバー側で対応する待ち受けがなければ、クライアントは接続に失敗します。

2. 4種類のプロトコル:暗号化と設定項目の違い

暗号化方式を比べる際は、プロキシプロトコル自体がデータを暗号化するか、外側にTLSなどの保護があるかを分けて考えます。設定値がnoneでも、接続全体が暗号化されていないとは限りません。反対に、ポート番号が443だからといって、TLSが有効とは限りません。

プロトコル 認証と暗号化 一般的な組み合わせ 主な確認項目
VMess UUIDでユーザーを識別。現在の設定ではVMess AEADを使用し、データの暗号化はsecurityの設定で決まる TCP;WebSocket + TLS UUID、security、alterId、トランスポート、セキュリティ層、システム時刻
VLESS UUIDでユーザーを識別。プロトコル自体はデータを暗号化しない TCP + TLS、WebSocket + TLS、XrayでのTCP + REALITY UUID、encryption、flow、TLSまたはREALITYのパラメーター
Trojan パスワードで認証。一般的な構成ではTLSで通信を保護 TCP + TLS。ほかのトランスポート方式は双方の実装が対応している必要あり パスワード、ポート、サーバー名、証明書の検証、トランスポート
Shadowsocks methodとパスワードまたは鍵情報に基づいて暗号化。AEADと2022シリーズでは要件が異なる 標準でTCP・UDPを転送。追加のトランスポート方式には別途対応が必要 method、パスワードまたは鍵の形式、ポート、UDP対応状況

VMess:AEADと旧設定項目を確認

現在のVMess設定では、通常alterId: 0としてAEADを使用します。古い解説にあるゼロ以外のalterIdを、現在の設定にそのまま流用しないでください。VMess認証は時刻にも依存します。WindowsやAndroidのシステム時刻が大きくずれている場合は、UUIDの誤りを疑う前に自動時刻設定を有効にしましょう。TLSを併用するかどうかは、サーバーの構成に従います。

VLESS:データを暗号化しない仕様でも、通信を平文にしてよいわけではない

VLESSのencryption: "none"は一般的な設定値で、通信の保護はTLSやREALITYなどが担います。インターネット上の通常の運用では、「VLESSはオーバーヘッドが小さい」という理由だけでセキュリティ層を省かないでください。xtls-rprx-visionは特定の組み合わせで使うflow値です。すべてのWebSocketノードに流用したり、クライアント側だけで有効にしたりしないでください。

TrojanとShadowsocks:パスワード以外の設定も一致させる

Trojanではパスワードが正しくても、TLSのサーバー名が間違っていると認証前のハンドシェイクに失敗することがあります。Shadowsocksでは暗号化方式を正確に合わせる必要があります。aes-128-gcmと2022-blake3-aes-128-gcmは互換性のある名称ではありません。後者には鍵の形式に関する要件があり、一般的なパスワードをそのまま入力できるとは限りません。

要点:プロトコル名より先にセキュリティ層を確認

ノード編集画面でTLSまたはREALITYの設定と証明書の検証状態を確認しましょう。VLESSのencryptionがnoneだからといってセキュリティ層を無効にしないでください。Trojanの問題を長期的に解決する方法として、証明書の検証を無効にするのも避けましょう。

3. 速度ランキングではなく、用途に合わせて選ぶ

サブスクリプションを利用する場合、まず選択肢はサービス提供者によって決まります。プロトコルの異なる2つのノードでサーバー、回線、負荷、出口が異なれば、速度測定の結果から特定のプロトコルが常に速いとは判断できません。自前で構築する場合は、証明書、ドメイン、ネットワークの入口を確認してから、トランスポートの組み合わせを決めましょう。

VLESS:Xrayで新規構成を作る

おすすめ

サーバーとクライアントの双方が対応していることを確認し、構成に応じてTLSまたはREALITYを選びます。UUID、セキュリティ関連の設定、flowを確認し、「設定項目が少ない」ことを「セキュリティ層を省略できる」と取り違えないようにしましょう。ここでのおすすめは、サーバーを管理できる新規構成に限ります。

おすすめの用途:Xrayを使用し、サーバーを管理でき、接続に必要な設定一式を維持できる場合

VMess:動作確認済みのノードを維持する

現在のVMess AEADノードが安定して接続でき、デスクトップとAndroidの両方でインポートできるなら、そのまま使い続けられます。プロトコルを移行する前に旧設定項目と時刻設定を確認しましょう。プロトコル名を変えるだけのために、サーバーを作り直す必要はありません。

おすすめの用途:既存のサブスクリプション、WebSocket + TLSの構成、既存設定との互換性を維持したい場合

Trojan:ドメインと証明書を用意できる場合

一般的なTCP + TLS構成は設定が比較的シンプルですが、証明書の有効期限、ドメインの名前解決、サーバー名を管理する必要があります。パスワードだけでなく、TLSハンドシェイクの段階も確認しましょう。

おすすめの用途:証明書を管理でき、サーバーにTrojanの接続口が用意されている場合

Shadowsocks:明確な暗号化転送の要件がある場合

標準接続では設定項目が比較的まとまっており、method、鍵、ポートが主な確認箇所です。UDPが必要な場合は、サーバーの転送設定とネットワーク側で通信が許可されているかを個別に確認しましょう。Webページが開けるだけでは、UDPが使えるとは判断できません。

おすすめの用途:対応するサーバーがあり、標準のTCP/UDP転送構成を維持したい場合

どのプロトコルも、それだけで匿名性を完全に保証するものではありません。サーバーの運用方法、DNSの経路、アプリへのログイン状態、クライアントの通信振り分け設定も実際の利用状況に影響します。プロトコル名から安全性を推測するのではなく、選定時に構成上の制約を整理しましょう。

4. v2rayN・v2rayNG・v2flyNGの対応範囲

v2rayNはデスクトップ向けクライアント、v2rayNGはXrayコアを使うAndroidクライアント、v2flyNGはv2flyコアを使うクライアントです。クライアントはノードを管理して設定を生成し、プロトコルを実際に処理するのはコアです。サブスクリプションの項目を読み込めても、使用中のコアがすべての拡張パラメーターを受け付けるとは限りません。

クライアント 確認する場所 選ぶ際の注意点
v2rayN ノード編集画面のプロトコル、トランスポート、セキュリティ設定。起動ログのコア情報 実際に使用するコアを基準に判断。VLESS + REALITYではXrayの対応状況と各パラメーターを確認
v2rayNG ノードを長押し → 編集。ログ画面の起動エラー 基本の4プロトコルは各設定に応じて使用可能。新しい拡張機能の対応はアプリに付属するXrayのバージョンによる
v2flyNG ノード編集画面、アプリのバージョン、起動ログ v2flyコアの実際の対応状況を確認。XrayのREALITYやVisionのパラメーターをそのまま移行しない

移行手順:まずプロトコルの種類を確認し、次に拡張項目を確認

デスクトップ:v2rayN
  • インポート後、ノード編集画面でアドレス、ポート、トランスポート、セキュリティ層を確認します。
  • REALITYを使う場合は、公開鍵、shortId、サーバー名、フィンガープリントの設定を確認します。
  • 起動後にコアのログを確認し、設定の解析エラーを解消してからWebページをテストします。
Android:v2rayNGまたはv2flyNG
  • アプリ画面に表示されるプロトコル名だけでなく、サーバーの設定に対応するコアを使います。
  • v2flyNGに移行する前に、Xray専用の拡張機能が含まれていないか確認します。
  • システムのVPN権限とアプリごとの設定を確認し、通信の入口に関する問題をプロトコルのせいにしないようにします。

サブスクリプションURLを共通化すると入力の重複を減らせますが、同じノードを両方で使えるかはコアの対応状況によります。サブスクリプションの更新も各端末で個別に行う必要があります。

5. ポートとログで接続失敗の箇所を特定

以下の3つの数値は、異なる層にあるポートの意味を示す例です。すべてのクライアントの初期値や、構築時の必須値ではありません。サーバーの受け付けポートと、ローカルプロキシの待ち受けポートは接続の両端にあり、相互に置き換えられません。入力する前に、ノード設定とローカルで実際に待ち受けている値を確認しましょう。

443
サーバー側TLSの受け付けポート例
10808
ローカルSOCKS入口のポート例
1080
別のSOCKS入口のポート例
  1. まずコアが起動しているか確認します。設定の解析失敗、不明な項目、ポートの競合がログに表示される場合は、先に設定を修正してください。この段階でプロトコルの速度を測っても意味はありません。
  2. 次にアプリから通信が送られているか確認します。デスクトップでは、システムプロキシが実際の待ち受けポートを参照しているか確認します。Androidでは、VPNが確立しているか、対象アプリが除外されていないかを確認します。
  3. サーバーに到達できるか確認します。接続がタイムアウトする場合は、アドレス、受け付けポート、ファイアウォール、サービスの稼働状況を確認します。タイムアウトだけでUUIDの誤りとは判断できません。
  4. セキュリティハンドシェイクとユーザー認証を切り分けます。証明書エラーなら、まず時刻、サーバー名、証明書チェーンを確認します。認証エラーの場合は、UUID、パスワード、鍵、暗号化方式を確認します。
  5. 最後にトランスポートの設定を確認します。WebSocketではpathとHost、gRPCではserviceName、REALITYではサーバーから提供された公開鍵やshortIdなどを確認します。

たとえば、ローカルのSOCKS待ち受けが127.0.0.1:10808であることを確認できたら、次のコマンドでリクエストがクライアントを経由するかテストできます。ここではサブスクリプションの認証情報を含まないドメインのテストページを使います。実際のポートが異なる場合は、正しい値に置き換えてください。

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 https://example.com/

socks5hは、接続先のドメイン名の処理をSOCKSプロキシに任せる指定です。このテストではシステムプロキシの設定を経由しませんが、コアのルーティングは適用されます。対象ドメインがルールによって直接接続に振り分けられている場合、リクエストが成功してもリモートプロキシから外部へ接続できる証明にはなりません。ログで適用されたルールと出力先も確認して判断しましょう。

6. 性能を比較するときに揃える条件

回線が異なると、遅延、混雑、パケットロス、サーバー負荷は、プロトコルのカプセル化による差より大きく影響することがよくあります。VMess、VLESS、Trojan、Shadowsocksという名前から、通信速度を直接推測することはできません。暗号化アクセラレーションに対応する機器か、追加のトランスポートを使うか、テスト通信が同じ出口を通るかによっても結果は変わります。

要点:安定した構成を残し、条件を一つずつ変えて測定

復元可能な設定を先にエクスポートし、サーバー側が対応する項目を一度に一つだけ変更します。3回連続のテストで改善し、ログから同じ出口を通っていると確認できたら、普段使うノードの置き換えを検討しましょう。

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

VLESSのencryptionがnoneの場合、手動でAESに変更する必要はありますか?

必要ありません。この項目はVMessやShadowsocksの暗号化方式を選ぶものではありません。ノード編集画面で、セキュリティ層がサーバーの要件に合わせてTLSまたはREALITYに設定されているか、関連するパラメーターが正しいかを確認してください。encryptionに別のプロトコルのアルゴリズム名を入力しないでください。

Trojanで443を使っているのに、証明書エラーになるのはなぜですか?

ポート番号ではサーバーの身元を検証できません。まず端末の自動時刻設定を有効にし、TLSのサーバー名がサーバー証明書の対象ドメインと一致するか確認します。証明書の有効期限とチェーンも確認してください。接続先アドレスとサーバー名は異なる場合がありますが、サーバー名は構成要件に沿っている必要があります。検証を無効にしたまま使い続けないでください。

同じサブスクリプションがv2rayNGでは使えて、v2flyNGでは使えない場合は?

まず該当ノードの編集画面を開き、REALITYやxtls-rprx-visionが含まれているか確認します。これらのXray拡張機能は、汎用的なVLESS設定として移行できません。サーバーから別途提供された互換ノードを使うか、対応するコアを選んでください。エラー項目を削除するだけでは解決しない場合があります。サーバー側でその設定が必須の可能性があるためです。

ShadowsocksでWebページは開けるのにゲームの通信が失敗します。プロトコルの選択が間違っていますか?

まずゲームがUDPを使うか確認し、次にサーバーでUDP転送が有効か、ファイアウォールで該当ポートが許可されているか、クライアントの通信取り込み設定がゲームを対象にしているかを確認します。TCPのWebページが開けても、UDPのテストにはなりません。これらの条件を確認したうえで、ほかのサーバーが提供するプロトコル構成と比較してください。

現在のVMessノードが安定しています。すべてVLESSに移行する必要はありますか?

プロトコル名だけを理由に移行する必要はありません。現在の設定が新しいAEAD方式であること、システム時刻が正しいこと、セキュリティ設定がサーバーの構成要件を満たしていることを確認してください。新機能や保守上の理由で移行する場合は、対応するVLESSサーバー設定を追加し、テストに成功してから切り替えましょう。唯一使えるノードをそのまま上書きしないでください。

v2rayN をダウンロードデスクトップ・Android向けクライアント