トンネル
スイッチが扱うのはシステムのインタフェースであり、ある 1 本のレコードではない。
ホーム画面上部のスイッチが起動するのは iOS の Network Extension です。端末の送信は Shadowrocket の仮想 NIC に入ります。レコード、ルール、Data はそのインタフェースのあとで起きます。プラットフォームの制限は システム です。
01
初めてスイッチを入れるとき
システムは VPN 構成の追加を求めます。許可すると、「設定」の VPN 一覧に Shadowrocket が出ます。これは OS が個人 VPN を認可する手続きであり、ノード提供者へのログインでも、本アプリのアカウントでもありません。アプリにアカウントはありません。
拒否すると仮想 NIC は作られず、スイッチの対象がありません。あとからシステム設定でこの構成を消す、スクリーンタイム / MDM で VPN を禁じると、スイッチは再び効かなくなり、再許可が必要です。再インストールでこのシステム構成が消えることがあり、「急に繋がらなくなった」ように見えます。許可が消えたのであり、レコードの期限切れではありません。
許可の対象は端末上の拡張です。その先の行き先は、選んだレコードと現在のポリシーが決めます。ストアのライセンスが覆うのはここまでです。アプリがシステム VPN を申請できる、という層です。出口は含まれません。
02
「接続中」はトンネルがあることだけを示す
ステータスバーに VPN アイコンが出て、スイッチがオンのままなら、拡張は動いています。そのときでも接続は DIRECT と判定され、セルラーや Wi-Fi の元経路で出て、ハイライトしたレコードを一切通らないことがあります。
だから「もう繋がった」を「すべての要求がノードに入った」にしてはいけません。バイトがレコードに入ったかは Data のふたつのカウンタ を見ます。ルールがホストを直通に残したかは ルール を見ます。
スイッチが点滅して何度も戻るのは、拡張が安定して起きなかった、ということです。よくある原因は、現在のレコードのハンドシェイク失敗(タイプ、トランスポート、証明書、UUID が対向と不一致)、またはシステムに使える VPN 構成がないことです。レコードを替える前に、ポリシーが Direct でないことを確認してください。Direct ではトンネルは点いたままで、対向へのハンドシェイクはしません。スイッチが戻ることと「ノードが壊れた」は別の失敗です。
ハイライト行がないままスイッチを入れる結果はバージョン次第です。「未選択でも繋がる」に頼らないでください。一覧には出口にできるレコードが必要です。オブジェクト を見てください。
03
Config · Proxy · Direct
この三項は現在の構成全体を覆い、1 行のルールより先に見えます。答えるのは、トラフィックがトンネルに入ったあと、ルールをまだ問うかです。
-
Config
各接続を現在のルールファイルに渡します。ドメイン、IP、GEOIP はここで計算されます。日常の振り分けはこの項です。ルールの書き方はルールページです。
-
Proxy
ルールは関与しません。送信はすべて今ハイライトされているレコードへ行きます。「ルールが間違っている」のか「このレコード自体のハンドシェイクや転送が失敗している」のかを切り分けます。Proxy で開き、Config で開かないならルールを見ます。どちらも開かないならレコードか対向を見ます。
-
Direct
ルールは関与しません。送信はすべてシステムの元経路です。VPN アイコンは点いたままにできます。転送を外したあと、この端末自体にネットがあるかを切り分けます。Captive Portal、ネットバンキング、端末の LAN は、先に Direct へ落とさないと完了しないことがよくあります。
ポリシーとレコードは別々に選びます。レコードを替えても Config / Proxy / Direct は変わりません。ポリシーを替えてもハイライト行は変わりません。両方間違っていても、画面は接続中のままです。
切り分けは Direct → Proxy → Config の順で、一度に動かすのはポリシーだけです。Data を見てください。Config の下で FINAL をいじりながらレコードも替えるのは、切り分けではありません。
04
接続がトンネルに入ったあと
拡張が送信を受けたあと、おおよそこの順で処理します。細部は現在のバージョンに従います。
- ポリシーが Direct なら: システムの元経路へ戻し、ルールは問わず、現在のレコードへはハンドシェイクしません。
- ポリシーが Proxy なら: ルールは問わず、今ハイライトされているレコードへ送ります。レコードのハンドシェイクが失敗すると、この段で止まります。
- ポリシーが Config なら: 現在の構成のリストを上から照合し、DIRECT / PROXY / REJECT を得ます。
- DIRECT の接続は元経路へ戻り、REJECT は捨て、PROXY の接続は現在のレコードへ行きます。
- リライトが有効なら、要求が見えたあとに URL やヘッダを変えます。リライト を見てください。振り分け結果をさかのぼって書き換えません。
UDP も TCP もトンネルに入りますが、すべてのレコードタイプが UDP を同等に転送するわけではありません。あるアプリが UDP だけで失敗する(ゲーム、一部の通話)なら、先にそのレコードが対応を宣言しているかを見、次にルールがポートで REJECT していないかを見ます。
照合の前後のどの段で名前解決するかが、ルールが見るのが名前かアドレスかを決めます。DNS を見てください。
05
システムは個人 VPN を同時に 1 本しか維持しない
別の VPN アプリが接続中のとき、iOS は通常、トラフィックを Shadowrocket に渡しません。本アプリのスイッチが点いていても、バイトはこの拡張に入っていないことがあります。障害を切り分けるときは、先にシステムの VPN 一覧で今効いているのがどれかを見てください。
機内モード、Wi-Fi とセルラーの切替、低電力、システムのバックグラウンド回収は、いずれもトンネルを壊します。フレームワークの挙動であり、レコードが急に「期限切れ」になったのではありません。ポータル認証の網は、先に端末自身にログインページを終わらせてから、スイッチを入れてください。これらの境界の展開は システム です。