VMess・VLESS・Trojan・Shadowsocksの違いと用途別の選び方

VMess・VLESS・Trojan・Shadowsocksを暗号化、ハンドシェイク、通信方式、クライアント対応状況から比較。端末やネットワークに合った選び方も解説します。

この記事の要点

プロトコルを選ぶ前に、サーバー設定を確認し、クライアントのコアとネットワーク環境をチェックしましょう。この記事ではプロトコル、トランスポート、安全レイヤーを区別し、4種類の認証方式、暗号化の範囲、接続コストを比較します。デスクトップとAndroidでの確認方法も紹介。既存のサブスクリプションの互換性確認や、自前サーバーのテスト手順を決める際に役立ちます。プロトコル名だけで速度を判断しないことが大切です。

1. プロトコル・トランスポート・安全レイヤーの違い

VMess、VLESS、Trojan、Shadowsocksはプロキシプロトコルの名称です。TCP、WebSocket、gRPCはトランスポートの設定でよく使われる選択肢で、TLSとREALITYは接続を保護する仕組みです。サブスクリプションの「VLESS + TCP + REALITY」は設定の組み合わせを表しており、互いに置き換えられる3つのプロトコルではありません。

クライアントの設定はサーバー側と項目ごとに一致させる必要があります。サーバーがVMessを提供している場合、クライアントの種類だけをVLESSに変更しても接続できません。サーバーがWebSocketを使用しているなら、クライアント側を任意に生のTCPへ変更することもできません。プロトコル、ポート、認証情報、トランスポートのパラメーター、安全レイヤーのいずれかが異なると、接続に失敗する可能性があります。

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

プロトコル 主な認証情報 データの保護方法 主な確認項目
VMess UUID。システム時刻が正確であることも必要 一般的な設定ではプロトコル独自の認証・暗号化を使用。TLSを追加することも可能 UUID、AEAD設定、暗号化方式、トランスポートのパラメーター
VLESS UUID 従来の設定ではencryptionはnone。通常はTLSまたはREALITYで接続を保護 UUID、flow、安全レイヤー、サーバー側の対応パラメーター
Trojan パスワード 標準的な構成ではTLSで認証情報とプロキシデータを保護 パスワード、サーバー名、証明書の有効性
Shadowsocks 暗号化方式と対応するパスワードまたは鍵 選択した方式で共通鍵暗号を使用。AEAD方式はデータの完全性も保護 method、鍵の形式、TCP・UDPの対応状況

VMessの一般的なAEAD設定ではalterId: 0を使用します。古い共有リンクに含まれる0以外のalterIdを、現在の設定にそのまま適用しないでください。実際のモードをサーバー側に確認しましょう。システム時刻のずれもVMessの認証に影響するため、UUIDを何度も変更するのではなく、まずシステムの時刻自動同期を有効にして確認します。

VLESSのencryption: noneは、従来のVLESSプロトコル層では暗号化しないという意味です。外側のTLSやREALITYが機能していないということではありません。一方、安全レイヤーを使わずVLESSと生のTCPだけでインターネットに接続する構成は、UUIDを使っていても通信内容の機密性が保たれるとは限りません。拡張機能の対応状況は、双方のコアのバージョンを確認してください。

Shadowsocksのaes-128-gcm、chacha20-ietf-poly1305、Shadowsocks 2022の方式は、それぞれ異なる設定です。Shadowsocks 2022では鍵の形式と長さに明確な要件があり、任意のテキストパスワードをそのまま流用できません。クライアントの画面にどちらもShadowsocksと表示されていても、同じ方式に対応しているとは限りません。

確認ポイント:設定全体を照合してからプロトコルの変更を検討する

「プロトコル + トランスポート + 安全レイヤー + 認証パラメーター」を記録しておきましょう。既存ノードでタイムアウトが起きる場合は、まずこの4項目とサーバーへの到達性を確認します。プロトコル名だけを変更しても、ポートが開放されていない問題や証明書の不一致は解決しません。

3. ハンドシェイクの負荷と速度:プロトコル名だけでは比較できない

Webページを初めて開くときの待ち時間には、DNS検索、TCP接続、TLSハンドシェイク、プロキシ認証、接続先サイトの応答時間などが含まれる場合があります。TLS 1.3のフルハンドシェイクには通常1往復が必要で、TCP接続にも独自の往復時間がかかります。接続の再利用やセッション再開によって後続リクエストの負荷は変わるため、「新規接続時」と「接続後のダウンロード速度」は分けて記録しましょう。

VMessやShadowsocksが独自に暗号化するからといって、TLSを使う構成より常に速いわけではありません。端末のAESハードウェアアクセラレーション、サーバーの負荷、ネットワーク経路のパケットロス、輻輳制御も結果に影響します。TrojanはTLSを使用しますが、長時間接続を確立した後は、最初のハンドシェイクのコストがパケットごとに加算されるわけではありません。

  1. テスト条件をそろえる:同じ端末、同じネットワーク、同じ接続先サイトを使い、バックグラウンドのダウンロードを停止します。可能であれば同じ場所のサーバーを選びましょう。条件が異なると、プロトコルではなく回線を比較することになります。
  2. 新規接続と再利用を分けて測る:接続を再起動した後の最初のリクエストにかかった時間を記録し、その後、同じ接続先へ続けてリクエストします。接続再利用時の結果を初回ハンドシェイクの結果として扱わないでください。
  3. 最低5回は繰り返す:中央値、失敗回数、連続通信時の状態を記録します。最も低い遅延が一度出ても、安定性の目安にはなりません。
  4. UDPは個別に確認する:Webページが開けても、確認できるのは該当するTCP経路が使えることだけです。音声通話、ゲーム、QUICの通信が正常かどうかは別途確認してください。

4. トランスポートの組み合わせ、ポート、サーバーの要件

VMessとVLESSでは、生のTCPやWebSocketなどを組み合わせる構成がよく使われます。Trojanの標準設定はTLS接続を前提とし、ほかの通信方式への対応は実装によって異なります。Shadowsocksのネイティブプロトコルには、WebSocketや通常のHTTPSサイトと同じ仕組みはありません。リバースプロキシやCDNを利用できるかは、ポートだけでなくサーバーが対応するトランスポートを項目ごとに確認してください。

443
HTTPSでよく使われるサーバーポート。TLSの有効化を意味するものではない
80
HTTPでよく使われるポート。暗号化機能はない
1080
ローカルSOCKSの設定例で使われるポート。クライアント共通のデフォルト値ではない

サーバーのポートを443に設定しても、TLSが自動的に有効になるわけではなく、CDNとの互換性も保証されません。WebSocketを使う場合はパスも一致させる必要があります。たとえばサーバー側が/proxy-wsなら、クライアント側に/を入力することはできません。HTTP Hostは関連するHTTPリクエストに使い、TLSのSNIはサーバー名のネゴシエーションに使います。画面上でどちらもドメイン名に見えても、用途が異なるため任意に入れ替えないでください。

5. v2rayN・v2rayNG・v2flyNGの選び方

クライアントは設定画面と接続の入口であり、実際のプロトコル機能は使用するコアが提供します。デスクトップ版v2rayNでは、現在の設定でどのコアが実際に呼び出されるか確認してください。Android版v2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。共有リンクをインポートできても、flow、REALITY、Shadowsocksの暗号化方式などが正しく引き継がれているか確認が必要です。

v2rayNG:AndroidでXray設定を使う

おすすめ

サーバーがVLESS + REALITYやVisionの設定を提供している場合は、v2rayNGに含まれるXrayコアのバージョンと、インポートされた設定項目を優先して確認しましょう。ここでのおすすめは、この種の設定をAndroidで使う場合の入口としての評価であり、あらゆるネットワークで速度が上がるという意味ではありません。

おすすめの用途:サーバーが提供するXray機能を使いたいAndroid端末

v2rayN:デスクトップで実際のコアを確認

複数のノードやサブスクリプションをデスクトップで管理する用途に向いています。テスト前に、ノードの種類、呼び出されるコア、そのバージョンを確認してください。クライアントとコアのバージョンは別の情報です。クライアントを更新した後も、コアが連動して更新されたか確認しましょう。

おすすめの用途:デスクトップでの利用、サブスクリプションやルーティング設定の一元管理

v2flyNG:v2flyの対応範囲に合わせて選ぶ

既存の設定がv2flyとの互換性を明確に確認できているAndroid環境に適しています。Xray専用のREALITYやVisionの設定項目をそのまま移行しないでください。そのほかのプロトコルや暗号化方式も、実際のコアのバージョンに応じて確認しましょう。

おすすめの用途:既存のv2fly設定を使い、同じ実装環境を維持したい場合

確認するには、まずクライアントのノード編集画面を開き、「アドレス」「ポート」「トランスポート」「TLS」などの項目を順に確認し、その後で実行ログを見ます。バージョンによってメニュー名は変わるため、古いスクリーンショットだけを頼りにスイッチを探さないでください。共有リンクのvmess://、vless://、trojan://、ss://は、それぞれ異なる形式で設定を読み込むためのものです。接頭辞を書き換えるだけでプロトコルを変換することはできません。

6. 既存のサブスクリプションと新規構築で選び方を分ける

選定の手順:まず接続を確立し、その後でテスト条件をそろえる

既存のサブスクリプションやサービスを使う場合
  • サーバーが指定するプロトコルとパラメーターを使い、プロトコルの種類を独自に変更しない。
  • クライアントのコアが十分に対応し、実際のリクエストが成功する設定を優先する。
  • ルーティングとDNSの方針を統一し、同じ地域のノードで安定性を比較する。
  • 更新前に使える設定を保存し、サブスクリプションのURLや認証情報を公開しない。
新規構築、またはサーバーを自分で管理できる場合
  • 通常のTLS証明書を使って構築する場合は、TrojanまたはVLESS + TLSを検討する。
  • 既存のVMess設定が安定している場合は、まず互換性と運用コストを確認する。
  • 共通鍵暗号を使うプロキシが必要なら、Shadowsocksの方式とUDP対応を確認する。
  • REALITYを使う場合は、双方のXray実装とパラメーターが一致することを先に確認する。

まず再現可能な動作設定を一つ作り、その後は一度に一つのパラメーターだけを変更しましょう。プロトコル、トランスポート、回線を同時に変えると、問題の原因を特定できなくなります。

通常のWeb閲覧では、回線品質や初回接続にかかる時間が結果を左右しやすくなります。継続的なダウンロードでは、帯域幅、輻輳、サーバーのリソースがより重要です。音声通話やゲームでは、UDP転送とジッターを確認しましょう。「VLESSはVMessより新しい」「Shadowsocksは設定が短い」といった理由だけで、共通の優劣を決めることはできません。

システムプロキシに従わないアプリをプロキシ経由にしたいだけなら、まずTUNやAndroidのVPNが対象アプリを取り込んでいるか確認してください。プロトコルを先に変更する必要はありません。プロキシプロトコルはクライアントとサーバー間のデータ交換を担いますが、アプリの通信がクライアントに入っているかどうかは別の問題です。詳しくはクライアントの使い方ガイドも確認してください。

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

VLESSのencryptionはnoneですが、AESに変更すべきですか?

従来のVLESS設定では、サーバーが指定するnoneのままにし、VMessの暗号化設定を適用しないでください。代わりに、サーバーの要件どおりTLSまたはREALITYが有効になっているか、サーバー名と認証パラメーターが正しいかを確認します。サーバーが特定の拡張機能を使う場合は、双方のコアのドキュメントに従って設定してください。

Trojanのポートに接続できるのに、証明書エラーが出るのはなぜですか?

ポートに接続できても、TLSの検証に成功したとは限りません。ノード編集画面でサーバー名を確認し、証明書の対象ドメイン、有効期限、システム時刻も照合してください。サーバーの証明書チェーンが不完全な場合はサーバー側を修正し、証明書の検証を長期間無効にしないでください。

Shadowsocksの暗号化方式を変更したら接続できなくなりました。

methodとパスワードまたは鍵がサーバー側と一致するか確認してください。特に従来のAEAD方式から2022方式に切り替える場合は、クライアントがその方式に対応しているか、要件に合う鍵を使っているかを確認します。選択肢だけを変えて古いパスワードを使い続けても、移行できないことがほとんどです。

同じVLESSリンクなのに、一方のクライアントでは接続できて、もう一方では失敗するのはなぜですか?

双方のコアのバージョンと、インポート後のトランスポート、安全レイヤー、flow、公開鍵、shortIdを比較してください。リンクにXray固有の機能が含まれる場合は、対応する実装を使用します。ログでどの段階に失敗したかを確認してから調整し、インポートに成功しただけで互換性があると判断しないでください。

4種類のプロトコルすべてでタイムアウトします。順番に切り替えて試すべきですか?

切り替えをいったん止め、ローカルネットワーク、システム時刻、サーバーのアドレスとポートが正しいか確認します。そのうえで、サーバーが稼働しているか、ファイアウォールで通信が許可されているかを調べてください。複数のプロトコルで同じ回線に問題がある場合、プロトコルを変えても根本的な到達不能は解決しません。基本的な確認手順はトラブルシューティングもご覧ください。

クライアントをダウンロードv2rayN / v2rayNG