この記事の概要

サブスクリプションの内容確認、単一ノードの移行、インポート失敗の原因調査を行う v2rayN、v2rayNG、v2flyNG ユーザー向けの記事です。統合サブスクリプション、完全設定、共有リンクの違いと変換範囲を理解し、各クライアントからインポートして検証できます。

3種類の形式は、それぞれ解決する課題が異なる

「サブスクリプション」は広い意味で使われがちですが、実際の内容は3つの階層に分かれます。base64統合サブスクリプションは複数の共有リンクをまとめたもの、VMessまたはVLESS共有リンクは通常1つの出力ノードだけを記述したもの、ネイティブJSONはインバウンド、アウトバウンド、DNS、ログ、ルーティング規則を含む完全な実行設定です。まず階層を見極めてからインポート方法を選ぶほうが、ボタンを何度も試すより確実です。

ブラウザーでサブスクリプションURLを開いたとき、長い英字や数字と少数のイコール記号が表示されても、内容が壊れているとは限りません。テキスト全体をbase64エンコードした結果の可能性があります。デコード後、各行が vmess:// または vless:// で始まっていれば、一般的な統合サブスクリプションです。ここでのエンコードはテキストを包むためのもので、暗号化ではなく、ノードのパラメーター自体も変わりません。

base64 統合サブスクリプション

おすすめ

1つのURLで複数ノードを取得でき、クライアント更新時にはサーバー一覧をまとめて置き換えられるため、継続的な管理に向いています。

適している用途:日常的なサブスクリプション更新、複数デバイス間でのノード一覧同期

VMess または VLESS 共有リンク

1つのリンクで1つのノードを記述するため、一時的なインポート、別のデバイスへのコピー、パラメーターの差分確認に便利です。

適している用途:単一ノードの移行、手動テスト、パラメーター確認

ネイティブ JSON 設定

インバウンドの待受、複数のアウトバウンド、DNS、ルーティングを同時に表現できる最も完全な形式ですが、カーネルのフィールド互換性に依存します。

適している用途:細かなルーティング、サーバー設定、高度なトラブルシューティング

形式 一般的な先頭部分 格納できる内容 代表的なインポート結果
base64 統合 固定のプロトコルヘッダーなし 複数の共有リンク サーバー情報を複数生成
VMess 共有リンク vmess:// 単一の VMess ノード サーバー情報を1件生成
VLESS 共有リンク vless:// 単一の VLESS ノード サーバー情報を1件生成
ネイティブ JSON { 完全または部分的なカーネル設定 カスタム設定として実行または解析

結論:まず格納階層を見極め、変換方法を決める

長期的に複数ノードを更新するならサブスクリプションURLを保持し、1つのノードだけを移行するなら共有リンクを使います。DNS、インバウンドポート、ルーティング規則が関係する場合はネイティブJSONを保存してください。3つは単なるファイル拡張子の違いではありません。

base64 統合サブスクリプションの内部構造

一般的な統合サブスクリプションの元のレスポンスは、base64テキストです。デコードすると通常はUTF-8テキストになり、各行に1つの共有リンクが置かれます。改行コードはLFまたはCRLFの場合があります。クライアントは更新時にURLへアクセスし、テキストをデコードしてから、プロトコルヘッダーに基づいて各行を解析します。認識できない行は通常スキップされるため、「更新は成功したのにノード数が0」という場合は、デコード後のプロトコルが現在のクライアントに対応していないか、サーバーがログインページや案内ページなどサブスクリプション以外の内容を返している可能性があります。

dmxlc3M6Ly9mNDdhZDQ4YS1hZWMxLTQwZTQtYTgzOC0wNjE2N2VhZDc4OTVA
ZXhhbXBsZS5pbnZhbGlkOjQ0Mz9lbmNyeXB0aW9uPW5vbmUmc2VjdXJpdHk9
dGxzJnR5cGU9d3MmcGF0aD0lMkZhcGkjVExTLVdTLUV4YW1wbGU=

上記は形式の例にすぎません。base64かどうかを判断するには、まず文字が主に A-Za-z0-9、プラス、スラッシュ、イコールの範囲に収まっているか確認し、その後デコードします。文字の見た目だけでは有効性を判断できません。通常のランダムなテキストでも同じ範囲に入ることがあるためです。より確実なのは、デコード結果が読めるテキストか、各行に対応プロトコルのヘッダーがあるかを確認する方法です。

1行
通常は1つの共有リンクに対応
UTF-8
デコード後によく使われるテキストエンコーディング
10808
ローカル SOCKS 待受ポートの一般的な例
2層
統合エンコードと単一ノードのエンコードが重なる場合がある

VMess共有リンク自体にもbase64エンコードが含まれることが多く、内部には通常、アドレス、ポート、ユーザー識別子、トランスポート方式、TLSパラメーターを記述したJSONオブジェクトがあります。そのため、VMess統合サブスクリプションでは、まず単一ノードのJSONをエンコードして vmess:// リンクを生成し、複数のリンクを連結してから全体をエンコードする場合があります。調査時は階層ごとに処理し、サブスクリプション全体を単一のVMessノードとして直接デコードしないでください。

VMess と VLESS の共有リンクはノードをどう表現するか

共有リンクの目的は、クライアントが1つのアウトバウンドノードを再構築できるようにすることです。VMessはプロトコルヘッダーの後にbase64エンコードされたJSONが続く形式が一般的です。VLESSは標準URIに近く、ユーザー識別子はユーザー情報部分、サーバーアドレスとポートはホスト部分、トランスポート・セキュリティ・フロー制御のパラメーターはクエリ文字列、ハッシュ以降のテキストはノード名として扱われます。どちらのリンクにも接続に必要な機密情報が含まれる可能性があるため、公開ページや公開ログに貼り付けないでください。

  1. プロトコルヘッダーを読み取り、VMess用とVLESS用のどちらのパーサーを使うか決めます。
  2. サーバーのドメイン、ポート、ユーザー識別子を取り出し、ポートが1〜65535の整数か確認します。
  3. TCP、WebSocket、gRPCなどのトランスポート方式を読み取り、方式に応じてパスまたはサービス名を解析します。
  4. TLS、サーバー名、アプリケーション層プロトコルのパラメーターを読み取り、アドレスとポートだけを移行しないようにします。
  5. ノード名をデコードし、パーセントエンコードを処理してからサーバー一覧に表示します。

VLESS URI の構造例

以下の例では、解析できない予約ドメインを使用しています。重要なのは各フィールドの位置です。security=tls はトランスポートのセキュリティ設定、type=ws はWebSocket、path はリクエストパス、sni はTLSハンドシェイクで使用するサーバー名を表します。パラメーター名の大文字・小文字を区別するかどうかは、クライアントの実装に従ってください。不明なフィールドを手作業で書き換えることはおすすめしません。

vless://[email protected]:443?encryption=none&security=tls&sni=edge.example.invalid&type=ws&path=%2Fproxy#TLS-WS-Example

VMessとVLESSは、プロトコル名を置き換えるだけでは相互変換できません。認証モデルとパラメーターの構成が異なり、VLESSの flow などにはVMessへ直接対応する項目がありません。サーバー側が両方のインバウンド設定を提供している場合に限り、接続可能な共有リンクをそれぞれ生成できます。URIを書き換えるだけで、サーバーに別のプロトコル対応が追加されるわけではありません。

ネイティブ JSON とクライアントサブスクリプションの関係

ネイティブJSONはV2RayまたはXrayカーネル向けで、トップレベルには logdnsinboundsoutboundsrouting などのフィールドがよく使われます。共有リンクから対応付けられるのは、多くの場合、特定の outbounds 項目だけです。JSONにドメイン、IP、ポート、インバウンドのタグに基づくルーティング規則が含まれていても、単一ノードのリンクに書き出すと元の動作は維持できません。

おすすめの構成:ノードはサブスクリプション、ローカルポリシーはクライアントで管理

デスクトップ版 v2rayN
  • サブスクリプショングループでサーバー一覧を管理する
  • ローカル SOCKS ポートは必要に応じて 10808 に設定する
  • ルーティング規則は個別に保存し、適用結果をテストする
Android版 v2rayNG または v2flyNG
  • 同じサブスクリプションURLをインポートする
  • クライアントの対応範囲に従ってノードを解析する
  • ルーティングとDNSはデバイスごとに個別設定する

ノードパラメーターはサブスクリプションで同期し、ローカルの待受、適用するアプリ、ルーティングポリシーは各デバイスで個別に管理してください。

最小構成はサブスクリプションとは限らない

以下のJSONでは、ローカルSOCKSインバウンドとVLESSアウトバウンドを1つずつ定義しています。アウトバウンド部分を共有リンクに変換しても、待受アドレス 127.0.0.1、ポート 10808、ルーティング動作はリンクには入りません。移行先のクライアントは、自身のデフォルト値または既存の設定でこれらを補います。

{
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "example.invalid",
            "port": 443,
            "users": [
              {
                "id": "f47ad48a-aec1-40e4-a838-06167ead7895",
                "encryption": "none"
              }
            ]
          }
        ]
      }
    }
  ]
}
  • inbounds は、ローカルのプログラムがトラフィックをどのようにカーネルへ渡すかを決めます。
  • outbounds は、トラフィックがどのリモートプロトコルを経由するか、または直接接続で外へ出るかを決めます。
  • routing は、ドメイン、IP、ポート、タグに基づいてアウトバウンドを選択します。
  • dns は名前解決の方法を決めますが、ノードの共有パラメーターになるわけではありません。

クライアントが書き出したJSONには、プログラムが生成したタグ、統計ポリシー、特定カーネル向けのフィールドが含まれることもあります。別のクライアントへインポートする前に、移行先が採用するカーネルとバージョンでそれらのフィールドを認識できるか確認してください。v2rayNGはXrayカーネル、v2flyNGはv2flyカーネルを使用します。基本的なVMess、VLESS、一般的なトランスポートには共通部分がありますが、新しいフィールドや拡張機能まで完全に一致すると考えないでください。

インポート、変換、更新の実際の手順

日常利用では、手動でデコードして1件ずつインポートするより、クライアントにサブスクリプションURLを直接読み込ませる方法を優先してください。直接登録なら更新経路を維持でき、サーバー側でノード名、アドレス、ポートが変更されても、クライアントは一覧を再取得できます。手動変換は、内容の確認、少数ノードの移行、特定レコードの解析失敗の原因調査に適しています。

目的 推奨する入口 完了後の確認
v2rayN にサブスクリプションを追加 「サブスクリプショングループ」→「サブスクリプショングループ設定」→「追加」 サブスクリプション更新後、グループ名とノード数を確認する
v2rayN に単一ノードをインポート 共有リンクをコピーし、「サーバー」→「クリップボードから一括URLインポート」を実行する アドレス、ポート、トランスポート、TLSパラメーターを確認する
v2rayNG にサブスクリプションを追加 サイドメニューの「サブスクリプショングループ設定」を開き、URLを追加して更新する 現在のグループが新しいサブスクリプションに切り替わっていることを確認する
v2rayNG に単一ノードをインポート リンクをコピーし、右上の「+」をタップして「クリップボードからインポート」を選択する ノード詳細を開き、サーバー名とトランスポート方式を確認する
v2flyNG にサブスクリプションをインポート サブスクリプショングループ設定を開き、名前と完全なURLを入力して更新する ノードのプロトコルがv2flyカーネルの対応範囲に含まれることを確認する

メニューの文言はクライアントのバージョンによって変わることがありますが、操作の流れはほぼ同じです。まずサブスクリプションURLを保存し、手動で更新してからノードを選択し、接続を開始します。テストでは「起動済み」と表示されるかだけでなく、コアログ、実際の遅延、目的のWebページへのアクセス結果も確認してください。遅延テストに失敗しても、ノードが完全に利用できないとは限りません。テスト先に到達できない、またはDNS解決に問題がある可能性もあります。

サブスクリプションの更新に成功したのに、一覧が空なのはなぜ?

まずサブスクリプショングループで現在選択されているグループを確認し、更新結果が0件として解析されていないか確認します。0件の場合は、レスポンスをコピーしてローカルのテキストツールで調べてください。base64をデコードした後に、ログインページ、エラー表示、HTMLソースではなく、行ごとの共有リンクが現れる必要があります。

VLESSリンクをコピーすると形式エラーになる場合の対処法は?

リンクが vless:// で始まっているか、ユーザー識別子、ドメイン、ポートが完全に含まれているか、クエリパラメーター内の & がチャットツールで切り詰められていないか確認します。元のプレーンテキストをもう一度コピーし、パーセントエンコードを手動で削除しないでください。

base64をデコードすると文字化けするのは、エンコードの互換性がないため?

まず入力末尾の文字が欠けていないことを確認し、標準base64とURLセーフな変種をそれぞれ試します。デコード後のバイト列は通常UTF-8として読み取ります。それでも読めない場合は、圧縮されている、別のサブスクリプションプロトコルを使っている、または統合テキスト以外の内容が返されている可能性があります。

完全なJSONをそのままサブスクリプションURL欄に貼り付けられる?

設定本文をURLとして扱うことはできません。サブスクリプション欄にはリクエスト可能なURLが必要です。完全なJSONは、クライアントが提供するカスタム設定のインポート入口から処理し、インバウンドポートが既存のプログラムと競合していないか確認してください。

同じサブスクリプションなのに、2つのクライアントで表示されるノード数が違うのはなぜ?

更新後の合計数をそれぞれ記録し、スキップされたノードのプロトコルとトランスポートパラメーターを確認してください。v2rayNGとv2flyNGは異なるカーネルを使用するため、一方だけが対応するフィールドでは、解析結果や実行結果が異なることがあります。プロトコル名を変更して無理に変換しないでください。

変換時に保持すべきフィールドと安全上の境界

信頼できる変換では、文字列の検索置換ではなく、まず構造化オブジェクトとして解析し、対象形式に合わせて再シリアライズします。少なくともプロトコル、サーバーアドレス、ポート、ユーザー識別子、トランスポート方式、TLSの状態、サーバー名、パスまたはサービス名、フロー制御パラメーター、ノード名を保持してください。接続に必要なフィールドが1つでも欠けると、「インポートはできるが接続できない」設定になる可能性があります。

  1. 元の内容を管理されたローカル環境へコピーし、サブスクリプションレスポンス、共有リンク、完全なJSONのどれかを判定する。
  2. デコードしてフィールドオブジェクトとして解析し、ポート、ユーザー識別子、必須パラメーターの型を確認する。
  3. 対象クライアントとカーネルの機能に基づいて表現可能なフィールドを選別し、対応付けられない項目を記録する。
  4. 対象形式を生成した後、もう一度解析し、アドレス、ポート、セキュリティ層、トランスポート層が一致しているか比較する。
  5. クライアント内に独立したテストグループを作成し、まだ利用できる元のサブスクリプションを上書きしない。
  6. 接続後にコアログを確認し、DNS、TCP、必要なUDPのケースを個別に検証する。

結論:変換前に元のサブスクリプションを保存し、変換後にフィールドを再読み込みして確認する

最も確実な受け入れ確認は「インポート成功」と表示されることではなく、生成結果を再解析して項目ごとに比較することです。アドレス、ポート、ユーザー識別子、TLSサーバー名、トランスポートパスがすべて一致してから、接続テストへ進んでください。

サブスクリプションURLと共有リンクには、アクセス認証情報が直接含まれている場合があります。スクリーンショットで問題を共有する際は、完全なサブスクリプションURL、ユーザー識別子、認証フィールドを隠してください。ログを共有する場合は、エラー種別、時刻、必要なネットワーク状態だけを残します。サブスクリプションURLが公開記録に入ってしまった場合は、サービス提供者の管理画面でサブスクリプション認証情報を変更し、クライアントから古いURLを削除して完全更新を1回実行してください。