この記事は、サービス提供元からTrojanの接続情報またはサブスクリプションを受け取り、Shadowrocketの設定を確認したい方を対象としています。接続先、TLSで使うサーバー名、認証パスワードを区別し、Add Serverの各項目を順に確認します。タイムアウト、証明書エラー、認証失敗が起きた場合は、すべての設定を手当たり次第に変更せず、失敗した接続段階から原因を絞り込みます。
Trojan設定の3要素:接続・TLS・認証
一般的なTrojan接続では、まずTCPで指定ポートのサーバーに接続し、続いてTLSセッションを確立します。その後、暗号化された通信路でTrojanの認証情報を送信し、プロキシリクエストをやり取りします。つまり、接続先に到達できてもTLSが成功するとは限らず、TLSが成功してもパスワードが正しいとは限りません。設定時は、この3段階を分けて確認してください。
TLSは通信を保護し、接続先のサーバーを認証するためのものです。Trojanのパスワードはアプリケーション層での認証に使われ、互いに代用できません。サーバー証明書が有効でも入力したパスワードが正しいとは限らず、パスワードが正しくても証明書の名前が一致しない問題は解決できません。この記事では一般的なTrojan over TLSの設定を扱います。その他の通信設定は、現在のサブスクリプションまたはサービス提供元の案内に従ってください。
判断のポイント:まず失敗した段階を特定
証明書名のエラーが出た場合は、パスワードを変更する前にSNIと証明書を確認します。接続がタイムアウトする場合は、TLSのセキュリティ設定を変更せず、まずAddress、Port、現在のネットワークを確認してください。
Add Serverの項目:Address・Port・Passwordの入力方法
Home画面右上の「+」からAdd Serverを開き、TypeでTrojanを選択して各項目を入力します。既存のサブスクリプションから項目を追加できる場合は、比較用として元の項目を残しておきましょう。手動で確認する際は別の項目を作成すると、一時的な変更がサブスクリプションの更新で上書きされるのを防げます。画面上の項目の配置は変更される場合があるため、英語の項目名と用途を基準に確認してください。
| 項目 | 入力する値 | よくある入力ミス |
|---|---|---|
| Type | 既存の設定と同じプロトコルになるようTrojanを選択します。 | 項目名だけを見て、実際のプロトコルを確認していない。 |
| Address | サービス提供元から指定されたサーバーのドメイン名またはIPアドレス。 | サブスクリプションURL全体を貼り付ける。または、https://やパス、クエリパラメーターを入力する。 |
| Port | サーバーが実際に待ち受けているポート。例:443、8443。指定された値を使用します。 | TLSを見て一律に443へ変更する。またはPortをAddressにも入力する。 |
| Password | このTrojan設定に対応する完全な認証パスワード。 | サービス提供元のWebサイトのログインパスワードを使う。記号を抜かす。先頭または末尾に空白を入れる。 |
| SNI | サービス提供元が指定したTLSサーバー名。通常はドメイン名です。 | URL、ポート、任意のWebサイト名を入力する。 |
| Allow Insecure | 通常はオフのままにして、証明書の検証を有効にします。 | タイムアウトやパスワードエラーを解決する万能スイッチだと思って有効にする。 |
たとえば、指定されたAddressがedge.example.com、Portが8443の場合は、それぞれ別の項目に入力します。ここに記載したドメイン名は入力形式の例であり、接続先として利用できるサーバーではありません。一般的なHTTPSのポートが443だからといって、サーバー指定のPortを独自に変更しないでください。
- パスワードは大文字と小文字を区別します。この設定用にサービス提供元から指定された値をそのままコピーし、短縮や変更はしないでください。
- Passwordを手動で入力する場合は、元のパスワードを使います。エンコードされた共有情報を受け取った場合は、アプリのインポート機能を利用し、エンコード部分をそのままパスワードとして入力しないでください。
- サブスクリプションURLのtokenは、サブスクリプションの内容を取得するためのものです。Trojanのパスワードとは限らないため、見た目だけで同じ値だと判断しないでください。
SNIとTLS:接続先とサーバー名が異なる場合
SNIは、TLS ClientHelloに含まれるサーバー名拡張です。同じアドレスを共有するサーバーが、適切な証明書とサイト設定を選ぶために使います。Addressはクライアントの接続先を指定し、SNIはTLS接続でのサーバー名の選択に使われます。一般的な設定では両方に同じドメイン名を指定しますが、AddressにIPアドレスを使う場合や、サーバー側で特定の接続口を使用する場合は異なることがあります。
たとえば、設定でAddressに特定のIPアドレス、SNIにtls.example.comが指定されている場合は、その違いを維持してください。SNIを自動的にIPアドレスへ変更したり、別の項目から「似ている」ドメイン名をコピーしたりしないでください。証明書の検証では、信頼チェーン、有効期限、名前の一致も確認されます。端末の日時が大きくずれていると、有効な証明書がまだ有効でない、または期限切れと判定されることがあります。
- SNIにプロトコルの接頭辞は入力しません:
tls.example.comのような名前を入力します。https://tls.example.com/pathではありません。 - SNIにポートは入力しません:ポートはPortに入力します。
tls.example.com:443のようには記載しないでください。 - サーバー名を任意に置き換えないでください:有名なWebサイトのドメイン名に変更しても、そのサーバーが対応する証明書を自動的に取得するわけではなく、接続が成功する保証もありません。
- SNIが個別に指定されていない場合は、まず元の設定を確認してください:Addressにドメイン名を入力したからといって、すべてのサーバーが同じデフォルトの動作を受け入れるとは限りません。
元の設定にALPNや通信方式に関する項目がある場合は、それらも一致させてください。トラブル対処の記事に記載された設定の組み合わせを、既存の項目にそのまま適用しないでください。特に、標準的なTrojanの設定方法を別のプロトコルに当てはめないでください。プロトコルによって認証方法と通信方式が異なるため、Typeを変更するだけでは切り替えられません。
入力から接続確認まで:5つの手順
入力前に元の接続情報を用意し、現在のネットワークがWi-Fiかモバイル通信かを記録します。同じ接続先、同じネットワーク、同じ設定項目を使って確認すれば、変更の効果を判断しやすくなります。Password、SNI、ルーティングモードを同時に変更すると、接続が回復しても原因を特定しにくくなります。
-
追加画面を開く
Home → 右上の「+」 → Add Server → Typeの順に進み、Trojanを選択します。既存のサブスクリプションを使っている場合は、生成済みの項目と照合し、プロトコルを間違えて選んでいないか確認してください。
-
接続情報を入力する
Address、Port、Passwordをそれぞれ入力します。貼り付けた後に先頭と末尾の空白を確認し、AddressにURLのパスが含まれていないこと、Portが指定値と一致していることを確かめます。
-
TLS設定を確認する
元の設定に従ってSNIを入力し、TLS関連の項目を確認します。Allow Insecureはオフのままにしてください。保存する前に、ドメイン名にポートが含まれていないことを再確認します。
-
ルーティングの影響を切り分ける
Homeに戻り、保存した項目を選択します。テスト中はGlobal Routingを一時的にProxyに設定し、テストリクエストがこの項目を経由することを確認できます。テスト後は、元のConfigまたはSceneの設定に戻してください。
-
実際のアクセスを確認する
接続スイッチをオンにし、システムの案内に従って必要な確認を完了します。次にConnectivity Testを実行し、普段利用するHTTPSページにアクセスしてください。接続スイッチがオンかどうかだけでなく、エラーや実際の状況も記録します。
Global RoutingがDirectの場合、リクエストが直接接続されることがあります。Webページが開いても、Trojanの設定が有効だとは限りません。Configでは現在の設定ルールに基づいて接続先が選択されるため、使用中のルールを確認してください。Sceneの場合は、該当シーンの設定を確認します。一時的にProxyを使うのはルーティングの条件を減らすためで、普段からそのモードにする必要があるという意味ではありません。ルールによる振り分けについてはルールマニュアルをご覧ください。
- Connectivity Testの成功は、そのテスト条件での結果を示すにすぎません。すべてのWebサイトや通信方式が利用できることを保証するものではありません。
- 接続スイッチがオンでも、システムで接続設定が有効になったことを示すだけで、サーバー側の認証や個々のリクエストの成功を保証するものではありません。
- ネットワークを切り替えて再テストする場合は、まず設定を変更せずに確認します。特定のネットワークだけで失敗する場合は、そのネットワークの接続状況を優先して確認してください。
よくある症状:タイムアウト・証明書エラー・接続後に通信できない
「つながらない」という症状だけで判断せず、実際に表示されたエラーに応じて切り分けてください。以下は確認の手順であり、決めつけた診断結果ではありません。同じ症状でも複数の原因が考えられるため、元の接続情報と再テストの結果を照らし合わせてください。
タイムアウトが続く場合、まずパスワードを変更すべきですか?
まずHomeで選択中の項目のAddressとPortを確認し、別の利用可能なネットワークでもう一度テストしてください。ドメイン名を解決できない、ポートに到達できない、サーバーから応答がない場合もタイムアウトになります。サーバーに接続できることを確認してから、パスワードを調べてください。タイムアウトだけではパスワードが間違っているとは判断できません。
証明書エラーが表示された場合、SNIはどう変更すればよいですか?
設定項目の編集画面を開き、元の設定と照らし合わせてSNIのスペルを確認します。次にiPhoneまたはiPadの「設定 → 一般 → 日付と時刻」で、日時とタイムゾーンを確認してください。それでも証明書エラーが続く場合は、エラー内容を利用中のサービス提供元に伝えて確認を依頼します。Allow Insecureを有効にして問題を隠さないでください。
遅延時間が表示されるのに、Webページが開かないのはなぜですか?
表示される遅延時間はテスト方法によって異なり、TLS、Trojan認証、接続先へのアクセスまでをすべて確認しているとは限りません。まずGlobal RoutingがDirectになっていないことを確認してから、Connectivity Testを実行してください。接続後すぐに切断される場合は、パスワードとサーバーの状態も確認します。
手動で修正した設定が、サブスクリプション更新後に使えなくなりました
サブスクリプションを更新すると設定項目が再生成され、端末上で行った変更が上書きされる場合があります。更新後のAddress、Port、SNIを確認済みの接続情報と照合し、サブスクリプションの内容は利用中のサービス提供元に修正を依頼してください。一時的なテストには別の手動設定項目を使い、同じサブスクリプション項目を繰り返し変更しないようにします。
確認結果を記録し、サブスクリプション情報を保護する
問い合わせ時は、失敗した時刻、ネットワークの種類、テスト方法、内容を伏せたエラーメッセージを記録すると、設定全体を送るより原因を特定しやすくなります。PasswordやサブスクリプションURLには認証情報が含まれている場合があります。特にクエリパラメーター内のtokenは、公開スクリーンショット、チャットグループ、ログなどで共有しないでください。実際のサブスクリプションURLを、信頼できないページに貼り付けて検証しないでください。
- 各項目が元の設定と一致しているか記録し、完全なパスワード、サブスクリプションtoken、直接インポートできる共有情報は公開しないでください。
- 接続に成功した設定は、手動入力か既存のサブスクリプションかを明記して安全に記録し、項目を取り違えないようにしてください。
- テスト後は普段使用しているGlobal Routingの設定に戻してください。トラブル対処のためにSettings → On Demandを変更した場合も、通常の使い方に合わせて元に戻します。
- 接続情報が漏えいした場合は、利用中のサービス提供元が用意する管理手段で該当する認証情報を変更し、端末上の設定も更新してください。
Shadowrocketはクローズドソースの商用アプリです。アプリの購入とサーバーへのアクセスに使う認証情報は別のものです。アプリの買い切り購入は、接続サービスの契約を含みません。この記事では、利用中のサービス提供元とサブスクリプションがあることを前提に、設定の確認方法を説明しています。