V2Rayのサブスクリプション形式を解説:Base64、ネイティブJSON、vless://共有リンクの相互変換

Base64形式のサブスクリプション、VLESS共有リンク、JSON設定の違いと変換方法を解説。v2rayN・v2rayNGへの読み込みや、失敗時の確認ポイントも紹介します。

この記事の要点

まず、サブスクリプションURL、取得したレスポンス、単一ノードの共有リンクを区別し、VLESS over TCP + TLSの例で各フィールドの対応を確認します。サブスクリプション更新後にノードが表示されない、クリップボードからJSONを読み込めない、ノードを読み込めても接続できない場合に役立ちます。記載のアドレス、UUID、ポートは形式の説明用で、接続可能なサービスではありません。

3つの形式:URL、ノード一覧、完全な設定

「V2Rayのサブスクリプション」は単一のファイル形式を指すものではありません。一般にサブスクリプションURLはHTTPSのURLで、クライアントがアクセスするとノード一覧を取得します。レスポンスは共有リンクを1行ずつ並べたテキストの場合もあれば、その一覧をBase64でエンコードしたものの場合もあります。URLは取得・更新に使い、レスポンスの内容はノードを記述します。両者は置き換えられません。

形式一般的な構造読み込み方法保持される情報
Base64形式のサブスクリプションデコードすると複数行の共有リンクになるサブスクリプショングループに登録するURL主にノードの接続パラメーター
VLESS共有リンクvless://UUID@ホスト:ポート?パラメーター#名前クリップボードから読み込み通常は1つのノードを記述
ネイティブJSONinbounds、outboundsなどのキーを含むカスタム設定から読み込みインバウンド、DNS、ルーティング、複数のアウトバウンドを設定可能

Base64はエンコード方式であり、暗号化ではありません。デコードできれば、通常はサーバーアドレスや認証情報も確認できます。サブスクリプションURL、デコードしたノード一覧、完全な設定を公開の場に貼り付けないでください。URL内のトークンを使うと他人が更新情報を取得し続けられる場合もあります。パスワードのように見えなくても公開は禁物です。

見分け方:まずデコード後の内容を確認

複数行のプロトコルリンクがあればノード一覧、インバウンドやアウトバウンドを含むオブジェクトがあれば完全な設定として扱います。拡張子やテキストの長さだけで形式を判断しないでください。

v2rayNとv2rayNG:適切な読み込み方法を選ぶ

v2rayNはデスクトップクライアント、v2rayNGはXrayコアを使用するAndroidクライアントです。どちらも一般的なサブスクリプション機能はノード一覧を対象としています。対応するプロトコルやパラメーターは、クライアントとコアのバージョンによって異なります。「JSONに対応している」からといって、サブスクリプション更新機能で任意のJSONを読み込めるわけではありません。

サブスクリプションURL

推奨

提供元から受け取ったサブスクリプションURLをグループに登録します。以後も同じURLから更新できるため、ノードが変更されるサービスに適しています。

おすすめ:定期的に更新するノード一覧

単一の共有リンク

vless://またはvmess://から始まるリンクを全体コピーし、クリップボードから読み込みます。一度読み込んでも、更新可能なサブスクリプションが作成されるわけではありません。

おすすめ:単一ノードのテストやパラメーターの確認

カスタムJSON

クライアントのカスタム設定機能を使い、選択中のコアに対応した設定であることを確認します。完全な設定ではDNSやルーティングも変更される場合があるため、サーバーアドレスだけを確認して済ませないでください。

おすすめ:ルーティングや特殊なアウトバウンド設定を保持したい場合

  1. サブスクリプショングループを作成

    v2rayNのメイン画面で「サブスクリプショングループ」→「サブスクリプショングループの設定」を開き、グループを追加してサブスクリプションURLを入力します。ここに入力するのはURLです。Base64の本文全体を貼り付けないでください。

  2. ノードを更新

    「サブスクリプショングループ」メニューに戻り、「すべてのサブスクリプションを更新(プロキシを使用しない)」を選びます。既存のプロキシ経由でアクセスする必要がある場合は、「プロキシを使用して更新」に相当する項目を試してください。画面によって表記や句読点が異なる場合があります。

  3. 単一リンクをテスト

    v2rayNでは「サーバー」→「クリップボードからURLを一括インポート」を選択します。v2rayNGではメイン画面の「+」→「クリップボードからインポート」を選びます。プロトコルリンクだけをコピーし、引用符や説明文は含めないでください。

  4. Androidでサブスクリプションを設定

    v2rayNGのメイン画面右上のメニューから「サブスクリプショングループの設定」を開き、「+」でURLを追加して保存します。メイン画面に戻り、メニューから「サブスクリプションを更新」を実行してください。バージョンによってメニュー名が異なる場合は、グループ設定と更新の機能を目印にしてください。

v2flyNGはv2flyコアを使用するため、Xray向けの拡張パラメーターをそのまま流用できるとは限りません。特にREALITYや特定のフロー制御などは、コアの対応状況を事前に確認してください。この記事のフィールド変換例はXray向けであり、異なるコア間の互換性を保証するものではありません。

Base64のデコードと再エンコード:外側の形式だけを変換

一般的なBase64形式のサブスクリプションは、各ノードのリンクを1行ずつ並べたUTF-8テキスト全体をエンコードして作成します。そのため、正しくデコードできれば通常はJSONではなくリンク一覧が表示されます。提供元がリンク一覧を平文で返す場合は、再度デコードする必要はありません。

Macでは、まずBase64形式のサブスクリプション本文をコピーし、ターミナルで次のコマンドを実行します。コマンドはクリップボードの内容を読み取り、ターミナルに出力するだけで、サブスクリプションURLへアクセスするものではありません。出力には認証情報が含まれるため、ターミナル画面を共有しないよう注意してください。

pbpaste | base64 -D

逆に変換する場合は、共有リンクをローカルのテキストファイルに1行ずつ保存してから、ファイルをエンコードします。次のコマンドは、現在のディレクトリにnodes.txtがあることを前提とします。生成されるのは静的なテキストファイルであり、クライアントから更新できるサブスクリプションURLではありません。

base64 -i nodes.txt -o subscription.txt

vless://からJSONへ変換:フィールドごとに対応付け

以下ではTCP + TLSの最小構成を例に、各フィールドの対応を示します。サーバーのドメイン名は説明用、UUIDは形式の例で、実際には接続できません。利用時はサービス提供元から、対応するアドレス、ポート、UUID、TLSパラメーターを入手してください。ドメイン名だけを置き換えても使えるとは限りません。

vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=node.example.com#Example-TLS
443
例示用のリモートTLSポート
10808
例示用のローカルSOCKSポート
36
ハイフンを含むUUIDの例の文字数

これらの数値は設定の説明用で、速度測定の結果でも、すべてのクライアントの初期値でもありません。リモートポートとローカルの待ち受けポートは接続の両端にあるため、同じ値である必要はありません。以下はフィールドの説明用に作成したXray設定で、待ち受けアドレスはローカルのループバックアドレスに限定しています。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "local-socks",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "node.example.com",
            "port": 443,
            "users": [
              {
                "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "node.example.com"
        }
      }
    }
  ]
}
リンクのフィールドJSON内の場所注意点
UUIDsettings.vnext[0].users[0].id認証情報。任意に変更しない
ホストとポートsettings.vnext[0].addressとportJSONのポートは数値で指定
encryption=noneusers[0].encryptionVLESSのフィールド。TLSを無効にする設定ではない
type=tcpstreamSettings.networkトランスポートの種類。サーバー側と一致させる
security=tlsstreamSettings.securityここではTLSをトランスポートのセキュリティとして選択
snitlsSettings.serverName接続先アドレスと異なる場合がある
#Example-TLSクライアントに表示するノード名プロトコルのハンドシェイクには使用しない

WebSocket、gRPC、REALITY、Visionを使う場合は、パス、サービス名、公開鍵、短縮ID、フィンガープリント、flowなど、該当するフィールドも対応付ける必要があります。TCPの例にflow=xtls-rprx-visionを追加するだけで変換が完了するわけではありません。トランスポート方式、サーバー設定、コアの対応状況を合わせて確認してください。

JSONから共有リンクへ変換:引き継がれない情報

逆変換では、まず対象のアウトバウンドを特定し、プロトコル、サーバー、ユーザー、トランスポートの設定を確認します。上のJSONにはVLESSのアウトバウンドが1つだけあるため、対応するリンクに変換できます。サーバーやユーザーが複数含まれる場合は、それぞれ個別にリンクを作成する必要があります。1つのURIで複数のオブジェクトを表すことはできません。

  1. 対象のprotocol: "vless"を確認し、vnext内のアドレス、ポート、ユーザーUUIDを読み取ります。
  2. トランスポートのネットワーク方式とセキュリティ種別を、それぞれtypeとsecurityに設定し、プロトコルに必要なクエリパラメーターを追加します。
  3. クエリパラメーターの値とノード名はパーセントエンコードします。たとえばパス/edge?x=1は%2Fedge%3Fx%3D1と記述し、疑問符が誤って解析されるのを防ぎます。
  4. サーバーアドレスがIPv6の場合、URI内のアドレスは角括弧で囲みます。アドレス全体をコロンで分割しないでください。
  5. 対象のクライアントに再度読み込み、ノードの編集画面で各項目を確認してから実際に接続をテストしてください。

まとめ:ノードの相互変換と設定の移行は別もの

DNS、ルーティング、複数のアウトバウンド間の選択ルール、ローカルのインバウンドを保持する必要がある場合は、元のJSONを保存してください。共有リンクで移行できるのは、リンク形式で表現できるノードのパラメーターに限られます。

リンクを正常に読み込めても、クライアントは独自のシステムプロキシ、TUN、DNS、ルーティング設定を使用します。元のJSONにある「中国本土の通信は直接接続し、それ以外はプロキシ経由」といったルールは、VLESSノードを1つ読み込んだだけでは引き継がれません。システムプロキシはどのアプリのリクエストをクライアントに渡すかを決め、ルーティングルールは受け取ったリクエストの接続先アウトバウンドを決めます。両者は異なるレイヤーの設定です。

読み込み失敗・接続失敗を段階ごとに切り分ける

まず、サブスクリプションへのリクエスト、本文の解析、ノード表示後の接続のどの段階で問題が起きるか確認します。ノードが表示されるなら、少なくとも一部の形式解析は成功していますが、UUIDやTLSパラメーター、接続先サーバーが正しいとは限りません。

サブスクリプションの更新は成功するのに、ノードが表示されないのはなぜ?

選択中のサブスクリプショングループと一覧の絞り込み条件を確認し、更新ログに有効なノード数が0と表示されていないか確認します。レスポンス本文がログインページ、期限切れの案内、完全なJSONだった場合は、まず提供元にそのクライアント向けの形式か確認してください。同じ内容を繰り返しエンコードしないでください。

JSONを貼り付けても有効な設定がないと表示されるのはなぜ?

通常のクリップボードからのノード読み込み機能は、共有リンクを解析します。完全なJSONはカスタム設定機能から読み込んでください。あわせて、カンマ、二重引用符、トップレベルの構造も確認します。JSONではコメントや末尾の余分なカンマは使えません。構文が正しくても、選択中のコアに対応した設定か確認が必要です。

リンクを読み込めても、TLSハンドシェイクに失敗するのはなぜ?

まずリモートポート、security、SNI、システム時刻を確認し、トランスポート方式がサーバーの要件に合っているか照合してください。証明書検証を無効にする方法を通常の対処として使わないでください。アドレスの名前解決と証明書名の一致は、別々に確認する項目です。

サブスクリプションURLがタイムアウトする場合、まずTUNを有効にするべき?

先にTUNを変更する必要はありません。利用可能なノードがある場合は、クライアントの「プロキシ経由で更新」機能を試してください。使えるノードがない場合は、現在のネットワークからサブスクリプションURLにアクセスできるか確認します。ログにローカルポートの使用中と表示される場合は、重複して起動しているクライアントを終了するか、待ち受けポートを変更してください。

変換したノードで接続できるのに、アプリが通信できないのはなぜ?

アプリがシステムプロキシを使っているか、設定されているプロキシポートがクライアントと一致しているか確認してください。コマンドラインツールはシステムプロキシを参照しない場合があります。ブラウザーでのテストだけで、すべてのアプリが使えるとは判断できません。TUNを有効にする前に、権限、ルーティング、DNSを確認してください。複数の設定を同時に変更すると、原因を特定しにくくなります。

v2rayN をダウンロードプラットフォームに合ったクライアントを選択