この記事の概要

サブスクリプションURLは取得先、Base64はテキストのエンコード形式、共有リンクは単一ノードの情報、ネイティブJSONはコアの実行設定全体を記述するものです。「サブスクリプションを解析できない」「JSONを取り込めない」といった場合や、ノードを移行したい場合に向けて、実際の応答内容の確認から項目の読み解き、ローカルでの変換と接続確認まで解説します。

1. サブスクリプションURL、Base64、JSONはそれぞれ別の概念

クライアントに登録するサブスクリプションURLは、通常HTTPSのURLです。クライアントがアクセスすると、ノード一覧や設定内容が返されます。URL末尾に.jsonがあるかどうかで形式が決まるわけではありません。同じAPIでも、リクエストのパラメータやクライアント識別情報によって異なる内容を返すことがあります。確認する際はファイル名だけで判断せず、実際の応答を確認してください。

一般的なBase64サブスクリプションでは、複数の共有リンクを改行区切りで並べたUTF-8テキスト全体をBase64でエンコードします。ノードのプロトコルを変換するものではなく、情報を秘匿する機能もありません。内容を入手した人はサーバーアドレスや認証情報を復元できるため、サブスクリプションURL自体を認証情報として扱い、安全に保管してください。

クライアント対応のリンク一覧サブスクリプション

おすすめ

複数のノードを管理する場合におすすめです。内容はリンク一覧そのままの場合もあれば、外側がBase64でエンコードされている場合もあります。クライアントが解析すると、ノードとして登録されます。

おすすめの用途:日常的なノード更新、複数端末への個別登録

単一のvmess://またはvless://リンク

1つの接続設定を記述する形式で、一時的な共有や個別のトラブルシューティングに適しています。通常、DNSやインバウンド、ルーティングの設定全体は含まれず、その後の変更も自動では反映されません。

おすすめの用途:手動登録、ノード項目の照合、単一ノードの移行

コアのネイティブJSON設定

inbounds、outbounds、routing、dnsを含められます。対象のコアとバージョンが各項目に対応していることを確認してください。一般的なノードサブスクリプションとしてそのまま扱うことはできません。

おすすめの用途:固定環境での運用、独自ルーティング、実行設定全体の保持

判断の手順:まず内容を確認し、適切な取り込み方法を選ぶ

デコード後に共有リンクが1行ずつ並んでいれば、ノードまたはサブスクリプションの取り込み機能を使います。inboundsやoutboundsを含むオブジェクトなら、まずカスタム設定として確認してください。どちらもJSONが含まれているからといって、同じ取り込み方法を使わないようにしましょう。

2. vmess://:外側のBase64と内側のノードJSON

一般的なVMess共有リンクは、vmess://の後ろにBase64文字列が続き、デコードするとノード情報のオブジェクトになります。以下にデコード後の例を示します。ドメインとUUIDは構造の説明用で、実際の接続には使用できません。vの値"2"は共有形式のバージョンであり、コアのバージョンではありません。

{
  "v": "2",
  "ps": "VMess WSの例",
  "add": "node.example.net",
  "port": "443",
  "id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "node.example.net",
  "path": "/gateway",
  "tls": "tls",
  "sni": "node.example.net"
}
項目意味確認ポイント
add / port接続先アドレスとポート例では443を使用しています。HTTPS URL全体をアドレス欄に入力しないでください。
idユーザーUUIDサーバー側の設定と一致している必要があります。前後の空白にも注意してください。
aid旧式のalterIdパラメータ現在の一般的な環境では0を使用します。トラブルシューティングのために、根拠なく古い値へ変更しないでください。
scyVMessのコンテンツ暗号化オプションautoは外側のTLSを意味しません。両者は異なるレイヤーの設定です。
net / path通信方式とパスここではWebSocketを使用しています。/gatewayはサーバー側の設定と一致させてください。
host / sniWebSocketのHostとTLSのサーバー名役割は異なります。例のように同じ値であっても、自由に入れ替えることはできません。
ps表示名表示名を変更しても、認証失敗やハンドシェイクエラーは解決しません。

ここに示したJSONは、コアにそのまま渡して実行できる設定ではありません。完全なoutbounds階層がなく、項目名も共有形式用に省略されています。ネイティブ設定に変換するには、addをサーバーアドレスに割り当て、ユーザー情報を該当プロトコルのユーザー配列に設定し、通信方式とTLSの設定をそれぞれ構成する必要があります。

3. vless://:UUID、クエリパラメータ、表示名の区別

VLESS共有リンクは通常URI形式で、JSON全体をBase64に包む形式ではありません。以下はVLESS over TCP + TLSの学習用サンプルです。REALITYは使用せず、Visionのフロー制御も設定していません。

vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=node.example.net#VLESS%20TLS%20Example

REALITYノードを使用する場合は、リンク内のsecurity=reality、pbk、sid、fp、sniをそれぞれ確認してください。これらの値をUUIDやサーバーアドレスから割り出すことはできず、「VMessからVLESSへの変換」で自動的に補完することもできません。最終的に生成されるコア設定の項目は、使用するバージョンに合わせてください。

変換の範囲:再エンコードしてもプロトコルは変わらない

既存の共有リンクをまとめてBase64サブスクリプションにしたり、既知のパラメータをJSONに整理したりすることはできます。しかし、vmessをvlessに書き換えても、サーバーがVLESSに切り替わるわけではありません。プロトコルを移行するには、サーバー側で対応するインバウンドと認証情報を用意する必要があります。

4. ローカルでBase64サブスクリプションをデコード・再エンコードする

サブスクリプションにはアクセストークンや有効なUUIDが含まれる場合があります。実際のデータを扱うときは、ローカルのテキストツールや何も開いていないページのブラウザー開発者ツールを使い、正体不明の変換サイトにアップロードしないでください。以下の関数は渡された文字列だけを変換します。ネットワーク通信は行わず、サブスクリプションURLを貼り付ける必要もありません。

function decodeBase64Utf8(input) {
  let text = input.trim().replace(/\s+/g, "")
    .replace(/-/g, "+").replace(/_/g, "/");
  text += "=".repeat((4 - text.length % 4) % 4);
  const bytes = Uint8Array.from(atob(text), ch => ch.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

function encodeBase64Utf8(input) {
  const bytes = new TextEncoder().encode(input);
  let binary = "";
  for (const byte of bytes) binary += String.fromCharCode(byte);
  return btoa(binary);
}

const demoLink =
  "vless://[email protected]:443" +
  "?encryption=none&security=tls&type=tcp&sni=node.example.net#Example";

const subscription = encodeBase64Utf8(demoLink + "\n");
console.log(subscription);
console.log(decodeBase64Utf8(subscription));

このコードは一般的なBase64URLの文字置換に対応し、末尾のパディングも補います。UTF-8変換は日本語などの表示名を正しく扱うためのものです。日本語をそのままbtoa()に渡すと、エラーになることがあります。実行前にコードの内容を理解し、実際の認証情報を共有端末のコンソール履歴に残さないようにしてください。

  1. サブスクリプションの応答本文を取得したら、まずvmess://またはvless://で始まるか確認します。リンクがそのまま記載されている場合、外側をさらにデコードする必要はありません。
  2. Base64形式の場合は1回デコードし、改行で分割します。空行は削除してかまいませんが、URI内の有効な文字を消したり、大文字と小文字を区別するパスを書き換えたりしないでください。
  3. 各vmess://リンクからプレフィックスを取り除き、個別にデコード関数を実行してから、JSON.parse()でオブジェクトの構造を確認します。
  4. リンク一覧をサブスクリプションに戻すには、完全な共有リンクを改行でつなぎ、エンコード関数に渡します。画面に表示されるノード名はエンコードしないでください。

応答が<!DOCTYPE html>で始まる場合は、ログイン状態、URLの有効期限、APIがエラーページを返していないかを確認してください。デコード結果が正しいJSONでも、エラーメッセージ、ノード配列、コアの完全な設定のどれなのかを見極める必要があります。Base64のデコードに成功しただけでは、接続可能であることは確認できません。

5. 共有リンクからXrayのネイティブJSONを作成する

前述のVLESS TLSサンプルを、階層を確認できる最小限の実行設定にまとめます。ローカルの127.0.0.1:10808でSOCKSインバウンドを待ち受け、サンプル用ドメインの443番ポートへ接続します。このアドレスでは利用可能なサービスは動作していません。設定項目の確認用としてのみ使用し、実際に動かす前にサーバーから提供された値に置き換えてください。

{
  "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.net",
            "port": 443,
            "users": [
              {
                "id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "node.example.net",
          "allowInsecure": false
        }
      }
    }
  ]
}

この例ではroutingを個別に設定していません。リクエストは既定で最初のアウトバウンドを経由します。振り分けルールやシステムプロキシ設定も含まれていません。SOCKSポートを起動しても、システム上のすべてのアプリが自動的に利用するわけではありません。10808をデスクトップクライアントがすでに使用している場合は、重複したプロセスを停止するか、ポートを変更してください。

変換方法:ノード移行と設定全体の移行を分けて考える

ノードの移行:共有リンクまたはリンク一覧サブスクリプション
  • アドレス、ポート、UUID、通信方式、安全性に関するパラメータを保持する。
  • ローカルのインバウンドと実行設定はクライアントに生成させる。
  • DNSとroutingは移行先のクライアントで個別に確認する。
環境全体の構築:ネイティブJSON
  • inboundsの待ち受けアドレスとポートの使用状況を確認する。
  • アウトバウンドのタグ、ルーティング参照、外部ファイルへの依存を確認する。
  • 対応するコアで設定を検証してから、起動テストを行う。

完全なJSON設定から共有リンクを作成すると、DNS、ルーティング、複数アウトバウンドの選択、ローカルの待ち受け設定などは通常リンクに引き継がれません。

「ネイティブJSON」だからといって、すべてのコアで共通に使えるわけではありません。XrayとV2Flyには共通する設定構造もありますが、プロトコルの対応状況や項目の変更は完全には一致しません。たとえばREALITYを含むXray設定は、ファイル名を変えるだけではV2Flyで使えません。変換ツールでは入力形式、出力先のコア、変換対象となるパラメータを明示してください。

6. v2rayNへの取り込み:サブスクリプションURLとクリップボードのリンクを使い分ける

以下では、v2rayN 7.xの中国語UIで一般的なメニューを例にします。マイナーバージョンによって表記やメニューの場所が異なる場合があります。まず、手元のデータがHTTPSサブスクリプションURL、単一の共有リンク、完全な設定ファイルのどれかを確認し、適切な取り込み方法を選んでください。ノード取り込み画面にウェブページのURLを貼り付けると、「有効な内容がありません」といった結果になることがあります。

  1. サブスクリプションURLを登録:「サブスクリプショングループ」→「サブスクリプショングループ設定」を開き、グループを新規作成します。提供元から指定された表示名とサブスクリプションURLを入力して保存し、そのグループを選択してください。
  2. ノード一覧を取得:「サブスクリプショングループ」メニューから、現在のサブスクリプションを更新する操作を選びます。直接接続できる場合は、まずプロキシを経由しない更新を試します。直接接続がタイムアウトし、利用可能なプロキシがある場合は、プロキシ経由で更新してください。
  3. 単一リンクを取り込む:vmess://またはvless://から始まる完全なリンクをコピーし、「サーバー」→「クリップボードから一括URLをインポート」を選びます。複数のリンクを取り込む場合は、1行に1つずつ並べ、各リンクを省略せずに貼り付けてください。
  4. 完全な設定を取り込む:「サーバー」メニューでカスタム設定のインポート項目を探し、ローカルのJSONファイルを選択して必要なコアを指定します。通常のノードのように項目ごとに編集できる状態へ、自動で分割されるとは限りません。
  5. 実際の動作を確認:ノードを有効にして再読み込みし、ログで設定の解析エラー、ポートの競合、TLSハンドシェイクエラーなどがないか確認してから、実際にウェブページへ接続します。

手動で取り込んだノードは、通常その時点の設定のスナップショットです。提供元が後からアドレスやUUIDを変更しても、コピー済みのリンクは自動更新されません。サブスクリプションを更新すると、そのグループ内のノードが上書きされる場合があります。手動変更を長期間保持する場合は専用グループに分け、サブスクリプション管理のノードと混在させないようにしましょう。

7. サブスクリプションの解析・形式変換でよくある質問

Base64をデコードできるのに、v2rayNで取り込めないのはなぜ?

まず、デコード結果が本当に共有リンクの一覧か確認してください。HTML、エラーメッセージ、ネイティブ設定オブジェクトであれば、対応する取り込み方法を選びます。リンク一覧の場合は、まず1件だけ取り込み、プレフィックス、改行、UUIDを確認して問題の範囲を絞り込みましょう。

JSONファイルを受け取ったら、そのまま再エンコードしてサブスクリプションにできますか?

エンコードするだけでは形式を変換できません。完全なコア設定の場合は、まずアウトバウンドを1つ選び、共有形式に合わせてプロトコル、サーバー、ユーザー、通信方式のパラメータを取り出してリンクを作成します。ファイル全体をBase64でエンコードしても、クライアントが期待するノード一覧にはならないのが一般的です。

サブスクリプションの更新がタイムアウトします。形式が間違っていますか?

タイムアウトは、まず取得段階の問題として確認します。サブスクリプションURLが完全か、ドメインを名前解決できるか、現在のネットワークからアクセスできるかを確認してください。利用可能なノードがある場合は、プロキシ経由での更新も試します。応答を受け取った後に解析エラーが出た場合に、Base64やノード形式を確認してください。

取り込みには成功したのにウェブページを開けません。どのパラメータを変更すればよいですか?

まず、有効なノードが選択されているか、システムプロキシが有効かを確認し、ログを確認します。接続拒否の場合はアドレスと443などのサーバーポートを優先して確認してください。TLSエラーの場合はSNI、証明書、システム時刻を確認し、認証エラーの場合はUUIDを確認します。証明書検証を無効にして、正しいTLS設定の代わりにしないでください。

日本語の表示名が文字化けすると、ノードの接続に影響しますか?

表示名は通常、接続に影響しません。ただし文字化けは、変換時にUTF-8が正しく処理されなかった可能性を示します。VMess JSONはUTF-8にしてからBase64にエンコードします。VLESSの表示名とクエリパラメータはURIの規則に従ってエンコードしてください。リンク全体を何度もエンコードすると、コロン、疑問符、区切り文字が構造上の役割を失うため避けてください。

形式変換後は、内容を解析できること、項目を対応付けられること、コアが起動すること、リクエストが通ることの順に確認します。元のサブスクリプションや設定を参照用に保存し、複製したデータだけを編集してください。項目の詳細は設定リファレンス、プロトコル名や通信方式の用語は用語集をご覧ください。