VMess・VLESS・Trojan・Shadowsocksの違いと選び方|用途別に比較

VMess・VLESS・Trojan・Shadowsocksを、暗号化方式・ハンドシェイク・トランスポート・クライアント対応状況から比較。用途に合った選び方を解説します。

この記事の概要

プロトコルを選ぶ前に、サーバーで提供されている設定とクライアントで使うコアを確認し、トランスポートとセキュリティのパラメーターを照合しましょう。サブスクリプションのインポート、既存ノードからの移行、接続方式の比較を考えている方に向けて、プロトコルとトランスポートの違い、UUID・パスワード・SNI・flowなどの項目を解説します。同じ回線でテストし、ネットワークの違いをプロトコルの差と混同しないためのポイントも紹介します。

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

VMess、VLESS、Trojan、Shadowsocksはプロキシプロトコルの名称です。WebSocketやgRPCはプロキシデータを運ぶトランスポート方式、TLSやREALITYは別途確認が必要なセキュリティ設定です。サブスクリプションに「VLESS + WebSocket + TLS」とあっても、3つのプロトコルを選べるという意味ではありません。1つの接続を構成する異なる層です。

クライアントとプロトコルも別物です。v2rayNはデスクトップクライアント、v2rayNGはAndroidでXrayコアを使用し、v2flyNGはAndroidでV2Flyコアを使用します。画面上で設定を保存できても、現在のコアがすべての項目に対応しているとは限りません。特にREALITY、特定のflow、新しい暗号化方式は、実際に使うコアの対応状況を確認してください。

4つのプロトコル:暗号化方式と設定の違い

ここでは一般的な構成を比較します。特定のトランスポートを、プロトコル固有の唯一の使い方として扱うことはありません。特に「プロキシプロトコル自体のデータ暗号化」と「外側のTLS」は別の層です。名称だけで接続全体が適切に保護されているか判断しないでください。

プロトコル 認証と暗号化 一般的な構成 インポート後の確認項目
VMess UUIDでユーザーを識別します。現在の一般的な構成ではAEAD認証を使い、データ暗号化はsecurityの設定で決まります。 TCP、またはWebSocket + TLS。 UUID、security、トランスポートの種類、パス、TLSを確認します。古い設定にはalterIdが含まれる場合もあります。
VLESS UUIDで認証します。一般的なencryption=noneの設定ではプロトコル層でデータを暗号化しないため、通常はTLSまたはREALITYと組み合わせます。 TCP + TLS、TCP + REALITY、またはWebSocket + TLS。 UUID、encryption、flow、サーバー名に加え、REALITYでは公開鍵とshortIdを確認します。
Trojan パスワードで認証します。従来の構成ではTLSで接続を保護します。 TCP + TLS。他のトランスポートによるカプセル化を使う場合は、両側の実装が対応しているか確認してください。 パスワード、ポート、SNI、証明書の有効性、トランスポートの種類を確認します。
Shadowsocks 暗号化方式とパスワードまたは鍵で暗号化します。AEAD方式とShadowsocks 2022では、鍵の扱いが異なります。 プロトコル自体でTCP・UDPを転送します。追加のカプセル化を使う場合は別途確認が必要です。 method、パスワードまたは鍵、サーバーアドレス、ポート、UDPが許可されているかを確認します。

VMessの認証は時刻に依存するため、端末の時計が大きくずれていると接続に失敗することがあります。まずシステムの時刻を自動同期し、次にUUIDとトランスポートの設定を確認しましょう。古い共有リンクにalterIdがあっても、古い解説に従って一律に0以外の値へ変更しないでください。現在一般的なAEAD設定では通常0を使いますが、最終的にはサーバー側の設定に合わせます。

VLESSでよく使われるencryption=noneは、「接続全体が平文」という意味ではありません。外側でTLSやREALITYを使う場合があるためです。一方で、VLESSが自動的にそれらの保護を提供するわけでもありません。新しいVLESS暗号化拡張を使う場合は、両端の実装とバージョンが対応しているか確認してください。従来の設定項目の解釈をそのまま当てはめることはできません。

まとめ:パラメーター一式で選ぶ

比較するときは「プロトコル + トランスポート + セキュリティ層 + コア」を記録しましょう。たとえば「VLESS + TCP + REALITY + Xray」です。「VLESSノード」とだけ記録すると、互換性を左右する条件が抜けてしまい、問題の再現も難しくなります。

ハンドシェイクと速度:正しく比較する方法

ハンドシェイク回数はダウンロード速度のランキングではありません。接続時にはTCP、TLS、プロキシ認証、トランスポートのカプセル化で待ち時間が増えることがあります。接続を再利用した大容量転送では、回線速度、輻輳、サーバー負荷、パケットロスの影響が大きくなります。VLESSのプロトコルヘッダーが簡潔だからといって、どのVLESSノードもVMessノードより速いとは限りません。

WebSocketやgRPCは既存の接続環境に合わせて使われることが多く、それ自体が速度を上げる機能ではありません。TLSセッション再開、接続の再利用、サーバー構成によっても実際の動作は変わります。以下の2つのポート番号は接続方向の説明例です。クライアントの標準ポートを示すものでも、速度を示すデータでもありません。

443
TLSを使うリモートサーバーでよく使われるポート(実際の設定を確認してください)
1080
ローカルSOCKSの入口の例(リモートポート欄には入力しないでください)

用途に合わせたプロトコルの選び方

以下の推奨は「新規構築で、両端がXrayに対応し、設定一式を入手できる」ことを前提としています。すでに安定稼働しているサービスでは、プロトコル名を理由に移行するより、互換性を保つことが重要です。サーバーを管理できない場合、手元だけで新しいプロトコルを追加することもできません。

VLESS:新規設定の候補

おすすめ

両端が必要な機能に対応している場合は、VLESS + TLSまたはREALITYを検討できます。flow、サーバー名、鍵のパラメーターを個別に確認し、すべてのVLESSノードでREALITYが必須だと思い込まないようにしましょう。

向いているケース:Xrayを使い、サーバー側の設定一式を入手できる新規構築。

VMess:既存設定を継続

既存のVMess + WebSocket + TLSが正常に動作しているなら、そのまま使い続けられます。まず時刻の同期とAEAD関連の設定を確認しましょう。他のプロトコルが登場したからといって、サービスを再構築する必要はありません。

向いているケース:VMessサーバーをすでに運用しており、既存の接続設定を継続したい場合。

Trojan:TLS設定済みの環境向け

ドメイン、証明書、TLSインバウンドを管理できる環境に適しています。証明書の期限切れ、SNIの誤り、パスワードの誤りは、それぞれ分けて確認してください。証明書の検証を無効にするのは、通常の解決策ではありません。

向いているケース:ドメインと証明書の管理体制があり、サーバーがTrojanを明示的に提供している場合。

Shadowsocks:暗号化方式が明確な接続

主な設定項目はアドレス、ポート、方式、パスワードです。双方が対応している暗号化方式を選びましょう。Shadowsocks 2022を使う場合は、方式と鍵の形式の両方がクライアントとサーバーに対応しているか確認してください。

向いているケース:サーバーから互換性のあるShadowsocks設定が直接提供されている場合。

クライアント側では、v2rayNはノードの機能に対応するコアを選んでください。v2rayNGはXrayを使用しますが、新しい項目に遭遇した場合は現在のコアが対応しているか確認が必要です。v2flyNGはV2Flyを使用します。関連するエコシステムのクライアントだからといって、XrayのREALITYや特定のflowに対応しているとは限りません。サブスクリプションの更新に成功したことは設定を取得できたという意味であり、すべてのノードが起動できる保証ではありません。

インポートと確認:共有リンクから接続まで

サブスクリプションURLと個別ノードの共有リンクは、別の接続方法です。サブスクリプションURLは通常HTTPS経由で複数のノードを取得します。個別の共有リンクはvmess://、vless://、trojan://、ss://などで始まります。先頭部分でプロトコルの種類は分かりますが、コアが拡張項目すべてに対応しているとは限りません。

  1. リンクの種類を確認

    まず、サブスクリプションURLと個別の共有リンクを区別します。ここでは個別リンクを使う手順を説明します。サブスクリプションのWebページの内容をノードのパスワードとして扱わないでください。また、UUID・パスワード・鍵を含む完全なリンクを公開の掲示板などに投稿しないようにしましょう。

  2. ノードをインポート

    v2rayNでは通常、「サーバー」→「クリップボードから共有リンクをインポート」を選びます。v2rayNGではメイン画面右上の「+」→「クリップボードからインポート」を選択します。画面の文言はバージョンによって異なる場合があるため、サブスクリプション設定ではなく、共有リンクのインポート項目を選んでください。

  3. 設定項目を確認

    v2rayNではノードを選択して編集画面を開き、v2rayNGではノードの編集アイコンをタップします。アドレス、リモートポート、UUIDまたはパスワード、トランスポートの種類、TLSまたはREALITYの順に確認します。WebSocketではHostとパスも確認してください。

  4. 起動してログを確認

    まずノードを起動し、必要なプロキシ入口を有効にします。v2rayNでは画面下部の「システムプロキシ」から「システムプロキシを自動設定」を選べます。v2rayNGでは起動後、システムの案内に従ってVPN接続を許可します。失敗した場合は、ログから設定の解析、ハンドシェイク、接続タイムアウトのどこで問題が起きているかを確認し、該当する項目だけを変更してください。

よくある質問:接続に失敗したときの確認箇所

VLESSのインポートには成功したのに、起動時にエラーが出るのはなぜですか?

未対応の項目、flow、セキュリティ方式がないか確認します。現在使っているコアを確認し、UUID、REALITYの公開鍵、shortIdをサーバー側の設定と照合してください。設定を保存するために、意味が分からない項目を削除しないでください。その項目がサーバー接続に必要な条件である可能性があります。

Trojanで証明書エラーが出ます。検証をそのまま無効にしてもよいですか?

まず端末の時刻、SNI、証明書の有効期限を確認してください。接続先アドレスがIPでも、サーバーから指定された名前を設定する必要があります。検証を無効にするとサーバーの身元確認が弱くなるため、正しい証明書とサーバー名の設定の代わりにはなりません。

Shadowsocksのパスワードは合っているのに、接続できないのはなぜですか?

methodとポートも確認してください。方式によってパスワードや鍵の要件は異なるため、パスワードだけをコピーしても接続できないことがあります。Webページは開くのにUDPを使うアプリが動かない場合は、サーバー側のUDP設定、ファイアウォール、クライアントの転送設定を確認してください。

ノードの遅延は正常なのに、ブラウザーでページを開けないのはなぜですか?

まずブラウザーの通信が実際にクライアントを経由しているか確認し、次にDNSとルーティングを確認します。TCPの疎通確認に成功しても、プロキシ認証やTLSハンドシェイクが成功したとは限りません。デスクトップでは、まずシステムプロキシだけでテストしてください。問題の切り分け中にTUN、ルーティング、プロトコルを同時に切り替えるのは避けましょう。

最終的な選択は、検証可能な条件に基づいて決めましょう。サーバーが実際に提供していること、クライアントのコアが対応していること、設定一式をインポートできること、実際のアプリで安定して通信できることが重要です。プロトコル名は確認項目の一つにすぎません。動作する設定を保存し、変更は一度に一項目だけにすると、プロトコルを何度も切り替えるより問題を特定しやすくなります。

v2rayNをダウンロードOSとインストール形式を選択