Shadowrocketの共有リンク形式を解説:ss://・vmess://・vless://・trojan://とサブスクリプションURLの違い

単一の共有リンクとサブスクリプションURLでは構造も用途も異なります。ss://、vmess://、vless://、trojan://に含まれる情報と、インポート・更新方法の違いを解説します。

この記事の概要

この記事は、利用するサービス事業者から接続情報やサブスクリプションを入手済みで、Shadowrocketに正しく取り込みたい方を対象としています。まずリンクの先頭部分から、単一の接続情報かリモートリストかを見分け、アドレス、ポート、認証情報、通信オプションを確認します。最後に「再インポート」と「サブスクリプションの更新」の違いを説明します。本文中のドメイン、パスワード、UUIDは説明用の例であり、接続には使用できません。

1. 共有リンクとサブスクリプションURL:単一の接続情報とリモートリスト

ss://、vmess://、vless://、trojan://は共有リンクのschemeです。続く文字列をどの形式で解析するかをクライアントに示します。この形式のリンクは通常、サーバーアドレス、ポート、認証情報、必要な通信オプションなど、1つの接続情報を記述します。インポートすると、Shadowrocketはこれらの情報を端末内に保存します。リンク自体に、リモートの変更を継続的に取得する機能は通常ありません。

一方、サブスクリプションURLは通常、https://で始まるアドレスです。クライアントがアクセスすると、サーバーから接続リストを取得し、対応する形式に従って解析します。サブスクリプションURLのパス名に統一規格はなく、/subが含まれるかどうかだけでは用途を判断できません。一般のWebページ、ログインページ、サブスクリプションの応答が、いずれもHTTPSを使う場合があります。利用中のサービス事業者から提供された説明と、実際の応答内容を確認してください。

確認項目単一の共有リンクサブスクリプションURL
一般的な先頭部分ss://、vmess://、vless://、trojan://通常は https://
主な内容1つの接続先のアドレス、ポート、認証情報リモートリストへのアクセスURL。tokenが含まれる場合もある
インポート時の動作リンクを解析してローカル項目を作成リモートの内容を取得し、サブスクリプション内の項目を作成
その後の変更ローカルの項目を編集するか、新しいリンクを入手して再インポートサブスクリプションを更新し、リモートリストを再取得
取り扱いに注意が必要な情報パスワード、UUID、サーバー情報サブスクリプションURL全体。特にパスやクエリパラメータに含まれるアクセス情報

たとえば https://example.com/sub?token=xxxxは、サブスクリプションURLの形式を示す例にすぎません。接続先ではなく、実際のサブスクリプションとしても使用できません。サブスクリプションには複数のプロトコルの接続情報が含まれる場合があり、同じプロトコルの異なるアドレスだけとは限りません。「サブスクリプション」とは情報の取得・更新方法を指し、ネットワーク通信プロトコルの種類ではありません。

2. ss://:Shadowsocksの暗号化方式とパスワードを確認

一般的なShadowsocks共有リンクでは、ユーザー情報の部分に暗号化方式とパスワードが記載され、その後に@を挟んでサーバーアドレスとポートが続きます。SIP002形式のリンクでは、ユーザー情報がBase64URLでエンコードされる場合があります。また、より古い形式では、さらに多くの情報がまとめてエンコードされていることもあります。そのため、すべてのss://リンクを、単純に@で分割できるとは限りません。

ss://[email protected]:8388#SS%20Demo

ユーザー情報をデコードした例:
aes-128-gcm:password

インポート後、Homeで該当項目の編集画面を開き、プロトコルの種類、アドレス、ポート、暗号化方式、パスワードを確認します。クライアントに項目が作成されたことは、解析が成功したことを示すだけです。サーバーがパスワードを受け付けるか、ポートに到達できるかは、別途テストが必要です。

3. vmess://:エンコードされたJSONの各項目を確認

一般的なvmess://共有リンクでは、schemeの後にBase64でエンコードされたJSONが続きます。エンコードされたデータには通常、アドレス、ポート、ユーザーID、通信方式、TLSなどの項目が含まれます。以下はデコード後の説明用データであり、そのまま貼り付けてインポートできる完全な共有リンクではありません。

{
  "v": "2",
  "ps": "VMess Demo",
  "add": "server.example.com",
  "port": "443",
  "id": "123e4567-e89b-42d3-a456-426614174000",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "edge.example.com",
  "path": "/demo",
  "tls": "tls",
  "sni": "edge.example.com"
}
項目用途と確認方法
add / port接続先のアドレスとポート。例では443を使用していますが、すべてのVMessサービスが443を使うわけではありません。
id / aidユーザーのUUIDとalterId。例のalterIdは0です。実際に提供された情報を使用し、独自に別の値へ変更しないでください。
scyVMessの暗号化オプションです。TLSの有効・無効とは別の設定で、Shadowsocksのmethod項目とも異なります。
net / host / path例ではWebSocketを使用しています。Hostとパスはサーバーの指定に合わせてください。パスの大文字・小文字や先頭のスラッシュを勝手に変更しないでください。
tls / sniTLSの有効・無効と、TLSハンドシェイクに使用するサーバー名です。SNIは接続先のアドレスと異なる場合があります。
v / ps共有リンク形式のバージョン表示とメモです。ここでのvはShadowrocketアプリのバージョンではありません。

上記は一般的な共有リンク形式の例です。生成ツールによってJSONの項目が完全に同じとは限りません。インポート後は、メモが表示されたかだけでなく、解析結果を確認してください。実際の情報でWebSocketとTLSが必要なのに、インポート後にpathがない、またはTLSの状態が異なる場合は、まず元のリンクが途中で切れていないかを確認し、利用中のサービス事業者に形式とパラメータを問い合わせてください。

4. vless://とtrojan://:クエリパラメータも接続条件

VLESSとTrojanの一般的な共有形式は、直接読み取れるURIに近い構造です。@の前に認証情報、後ろにアドレスとポートがあり、疑問符以降にセキュリティ層や通信オプションが記載されます。認証情報はプロトコルごとに異なり、VLESSではUUID、Trojanではパスワードがよく使われます。先頭の文字列を置き換えるだけで、一方のプロトコルをもう一方に変換することはできません。

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=edge.example.com&path=%2Fdemo&sni=edge.example.com#VLESS%20Demo

trojan://[email protected]:443?security=tls&type=tcp&sni=edge.example.com#Trojan%20Demo
  1. まず認証情報を確認します。VLESSの例にあるUUIDと、Trojanの例にあるdemo-passwordは、どちらも説明用の値です。実際のインポートには、提供された元の情報を使用してください。
  2. 次にserver.example.com:443を確認します。ポート443はここでの具体例です。「通常はTLSを使う」という理由で、サービス事業者から指定された別のポートに変更しないでください。
  3. security=tlsとsniを確認します。これらはTLSハンドシェイクと証明書の検証に関わる設定であり、表示名だけの項目ではありません。
  4. type=wsまたはtype=tcpを確認します。VLESSの例にあるhostとpathはWebSocketの条件です。%2Fdemoをデコードすると/demoになります。
  5. 元のリンクに含まれるほかの必須パラメータも保持してください。元の情報にflowやセキュリティ層に関する項目がある場合は、クライアントが正しく認識しているか確認し、この簡略化した例を参考に削除しないでください。

VLESSの例にあるencryption=noneは、VLESS自体の暗号化オプションを示します。例にTLS保護がないという意味ではありません。プロトコルの認証、通信方式、TLSはそれぞれ異なる層の設定です。Trojanは通常TLSを使用するため、証明書の名前と信頼状態も重要です。証明書エラーが発生した場合は、証明書の検証を直接無効にするのではなく、アドレス、SNI、サーバー証明書を確認してください。

まとめ:インポート後は認証・通信方式・TLSを確認

項目が追加されたのに接続できない場合は、UUIDまたはパスワード、ポート、type、path、SNIを一つずつ照合してください。メモが一致していても、接続パラメータが同じとは限りません。差異が確認できた項目だけを修正し、変更するたびにテストしてください。一度に複数の条件を変えないようにします。

5. Homeからインポート:単一の接続情報かサブスクリプションかを選ぶ

始める前に、手元の情報がどちらに当たるかを確認してください。Homeでは接続項目の管理と選択、Configでは設定ファイルとルール、Settingsではアプリの設定を行います。接続リストのサブスクリプションはルール設定ファイルではありません。Configの設定ファイル用の欄にサブスクリプションURLを入力しても、接続用サブスクリプションのインポートにはなりません。

サブスクリプションを入手済み:Subscribeからインポート

おすすめ

Home → +でTypeをSubscribeに設定し、利用中のサブスクリプションURLを入力して保存します。その後、リモートリストを正常に取得できたか確認してください。この方法はサブスクリプションをすでに入手している方向けで、以後の更新を引き継ぐためのものです。

適しています:リモートの接続リストを利用しており、アドレス、ポート、認証情報の変更を反映したい場合

単一の接続情報:共有リンクをインポート

単一の共有リンク全体をコピーし、Shadowrocketに戻ってクリップボードのリンクを認識した通知からインポートを確定します。利用者がすでに入手している情報に含まれるQRコードを読み取ることもできます。完了後は項目を開いて各情報を確認し、名前だけで判断しないでください。

適しています:特定の接続を1つだけ保存したい場合、または接続情報を個別に確認したい場合

各項目が分かっている場合:手動で入力

Home → +で該当するTypeを選び、入手済みの情報に従ってアドレス、ポート、認証情報を入力し、通信方式とTLSのオプションを確認します。手動でローカル項目を作成しても、サブスクリプションによる更新は自動では設定されません。

適しています:項目ごとの情報しかない場合、または共有リンクの解析差異を確認したい場合

  1. 元の情報からリンク全体をコピーしてください。日本語の引用符、文末の句読点、チャットアプリの説明文、コードフェンスを含めないでください。
  2. 保存後、Homeに戻り、追加されたものが単独の項目か、サブスクリプションとその配下の項目かを確認してください。サブスクリプション名が表示されただけでは、リストを正常に取得できたとは限りません。
  3. 接続項目の編集画面を開き、種類、アドレス、ポート、認証情報を確認します。WebSocketやTLSを使う場合は、該当するオプションも確認してください。
  4. テストする接続を選択します。接続スイッチを初めてオンにするときは、システムの案内に従ってVPN構成の追加を許可し、接続先へのアクセスをテストしてください。

QRコードはリンクを別の形で記録したものであり、追加のプロトコルではありません。QRコードにサブスクリプションURLが含まれている場合、インポート後もサブスクリプションとして扱います。単一のss://が含まれている場合は、QRコードからインポートしてもリモート更新機能は追加されません。iPhoneとiPadでは実際の画面を確認してください。システム要件はApp Storeのページに記載された内容をご確認ください。

6. 更新とトラブル対処:取得失敗と接続失敗を切り分ける

サブスクリプションの更新はリモートリストを再取得する操作であり、ShadowrocketアプリのアップデートやConfig内のルールの更新とは異なります。リモート項目が追加、削除、置き換えられることがあります。サブスクリプション内の項目に加えたローカル編集が、次回の更新後もすべて残るとは限りません。比較テストを行う場合は、変更前の項目と結果を記録してください。

メンテナンス方法は2通り:ローカル項目とリモートサブスクリプション

ローカルの単一接続
  • アドレスやパスワードが変更された場合は、新しい共有リンクを入手して再インポートするか、既存の項目を編集します。
  • 再インポート後、同じ名前の項目が重複していないか確認し、アドレスとポートで見分けてください。
  • テストに成功してから、使わなくなった古い項目を削除してください。現在使用中の接続を誤って削除しないよう注意します。
登録済みのリモートサブスクリプション
  • Homeで該当するサブスクリプションを更新し、配下の項目を取得できたか確認します。
  • 更新後、選択中の接続が残っているか、接続情報に変更がないかを確認します。
  • アクセス情報が変更された場合は、先にサブスクリプションURLを差し替えてからリストを再取得してください。

ローカル編集で変更されるのは、現在保存されている項目です。サブスクリプションの更新で読み込まれるのは、リモートの情報です。相互に置き換えることはできません。

トラブル対処では、URLへのリクエスト、応答の解析、解析後の接続という3つの段階を分けて確認してください。たとえばHTTP 401や403はアクセス認証の問題を示すことがありますが、サービス事業者の応答内容も確認が必要です。HTTP 200が返っても、ログイン用のHTMLページの場合があります。リストが表示されてもWebページにアクセスできない場合は、同じリンクを何度も再インポートするのではなく、接続、Global Routing、Config内のルールを確認してください。

リンクをコピーしたのに、Homeに項目が追加されないのはなぜですか?

リンクがschemeから始まる完全な形式か確認し、改行、全角コロン、チャットの説明文が混ざっていないか確認してください。ほかのアプリからのペーストを許可するか尋ねられた場合は、必要に応じて許可します。元のリンクをコピーし直してからインポートしてください。試しにBase64の内容を手動で書き換えないでください。

サブスクリプションの更新がタイムアウトしました。含まれる接続はすべて使えなくなったのでしょうか?

必ずしもそうとは限りません。まず、現在のネットワークからサブスクリプションURLにアクセスできるか確認してください。利用可能な既存の接続を経由して取得する必要がある場合は、Settings → SubscribeでUpdate via Proxyを確認し、Homeで利用可能な接続を選択してスイッチをオンにしてから更新します。このオプションは更新リクエストのアクセス経路を変えるだけで、無効なtokenや誤った応答形式を修正するものではありません。

インポートできたのに、Webページを開けないのはなぜですか?

まず、選択した項目のアドレス、ポート、パスワードまたはUUIDを確認し、続いてTLSと通信オプションを確認します。次にHome → Global Routingを確認してください。Directは直接接続、Proxyはプロキシ可能な通信を選択中のプロキシポリシーに渡し、Configは現在の設定ルールに従って処理し、Sceneは設定済みのシーンに従って処理します。必要であれば、一時的にProxyにして比較テストを行い、テスト後は元の設定に戻してください。

メモを変更してからサブスクリプションを更新したら、名前が元に戻りました。どうすればよいですか?

まず、リモートリストから古いメモが引き続き配信されているか確認してください。サブスクリプションの更新で項目が再作成または上書きされることがあり、ローカルのメモ変更はリモートには反映されません。比較用の記録を残す必要がある場合は、テスト対象を別に記録するか独立した項目として保存し、その項目はサブスクリプションによる自動更新の対象外であることを明記してください。

実際のリンクやQRコードを送って、ほかの人に確認してもらってもよいですか?

情報全体を公開しないでください。問い合わせの際は、プロトコルの種類、ポート、通信方式、個人情報を伏せたエラー情報を伝え、パスワード、UUID、token、URL全体、QRコードを隠してください。情報がすでに漏えいした場合は、利用中のサービス事業者の管理画面で該当する認証情報を変更してから、ローカルの接続項目またはサブスクリプションを更新してください。

App Storeで正規版を確認