ブログ

「接続中」ではルールは動きません。

ホーム画面上部のスイッチが起動するのは iOS の Network Extension です。端末の送信は仮想 NIC に入ります。レコード、ルール、Data はそのインタフェースのあとで起きます。ステータスバーの VPN アイコンは、この層が生きていることだけを示します。

許可

初めてスイッチを入れるとき

Shadowrocket ホーム:スイッチオフ、Global Routing は Config
上部のスイッチがトンネルです。Global Routing で Config / Proxy / Direct を選びます。App Store 掲載画面。端末の版に従ってください。

システムは VPN 構成の追加を求めます。許可すると、「設定」の VPN 一覧に Shadowrocket が出ます。これは OS が個人 VPN を認可する手続きであり、ノード提供者へのログインでも、本アプリのアカウントでもありません。アプリにアカウントはありません。拒否すると仮想 NIC は作られず、スイッチの対象がありません。あとからシステム設定でこの構成を消す、スクリーンタイム / MDM で VPN を禁じると、スイッチは再び効かなくなり、再許可が必要です。再インストールでこのシステム構成が消えることがあり、「急に繋がらなくなった」ように見えます。許可が消えたのであり、レコードの期限切れではありません。

許可の対象は端末上の拡張です。その先の行き先は、選んだレコードと現在のポリシーが決めます。ストアのライセンスが覆うのはここまでです。アプリがシステム VPN を申請できる、という層です。出口は含まれません。開発者と買い切りの範囲は ストア で確認します。ハイライト行がないままスイッチを入れる結果はバージョン次第です。「未選択でも繋がる」に頼らないでください。一覧には出口にできるレコードが必要です。オブジェクト を見てください。

接続中

トンネルが生きていることだけを示す

ステータスバーに VPN アイコンが出て、スイッチがオンのままなら、拡張は動いています。そのときでも接続は DIRECT と判定され、セルラーや Wi-Fi の元の経路で出て、ハイライトしたレコードを一切通らないことがあります。だから「もう繋がった」を「すべての要求がノードに入った」にしてはいけません。バイトがレコードに入ったかは Data のふたつのカウンタ を見ます。ルールがホストを直通に残したかは ルール を見ます。

スイッチが点滅して何度も戻るのは、拡張が安定して起きなかった、ということです。よくある原因は、現在のレコードのハンドシェイク失敗(タイプ、トランスポート、証明書、UUID が対向と不一致)、またはシステムに使える VPN 構成がないことです。レコードを替える前に、ポリシーが Direct でないことを確認してください。Direct ではトンネルは点いたままで、対向へのハンドシェイクはしません。スイッチが戻ることと「ノードが壊れた」は別の失敗です。ポリシーとレコードは別々に選びます。レコードを替えても Config / Proxy / Direct は変わりません。ポリシーを替えてもハイライト行は変わりません。両方間違っていても、画面は接続中のままです。

ポリシー

トンネルに入ったあと、ルールをまだ問うか

Config / Proxy / Direct は現在の構成全体を覆い、1 行のルールより先に見えます。答えるのは、トラフィックがトンネルに入ったあと、ルールを問うかどうかです。Config: 各接続を現在のルールファイルに渡します。ドメイン、IP、GEOIP はここで計算されます。日常の振り分けはこの項です。Proxy: ルールは関与しません。送信はすべてハイライト中のレコードへ行きます。「ルールが間違っている」のか「このレコード自体のハンドシェイクや転送が失敗している」のかを切り分けます。Proxy で開き、Config で開かないならルールを見ます。どちらも開かないならレコードか対向を見ます。Direct: ルールは関与しません。送信はすべてシステムの元経路です。アイコンは点いたままにできます。転送を外したあと、この端末自体に網があるかを切り分けます。Captive Portal、ネットバンキング、端末の LAN は、先に Direct へ落とさないと完了しないことがよくあります。

接続がトンネルに入ったあと、おおよそこの順で処理します。ポリシーが Direct なら: システムの元経路へ戻し、ルールは問わず、現在のレコードへはハンドシェイクしません。ポリシーが Proxy なら: ルールは問わず、ハイライト中のレコードへ送ります。ハンドシェイクが失敗すると、この段で止まります。ポリシーが Config なら: 現在の構成のリストを上から照合し、DIRECT / PROXY / REJECT を得ます。DIRECT は元経路へ戻り、REJECT は捨て、PROXY は現在のレコードへ行きます。リライトが有効なら、要求が見えたあとに URL やヘッダを変えます。リライト を見てください。振り分け結果をさかのぼって書き換えません。照合の前後のどの段で名前解決するかが、ルールが見るのが名前かアドレスかを決めます。DNS を見てください。

UDP も TCP もトンネルに入りますが、すべてのレコードタイプが UDP を同等に転送するわけではありません。あるアプリが UDP だけで失敗する(ゲーム、一部の通話)なら、先にそのレコードが対応を宣言しているかを見、次にルールがポートで REJECT していないかを見ます。対照は Direct → Proxy → Config の順で、一度に動かすのはポリシーだけです。Config の下で FINAL をいじりながらレコードも替えるのは、対照ではありません。展開はマニュアルの トンネル 章です。

「接続中」は、一覧のプローブと一緒に読まれることも多いです。プローブが通ると「経路全体が通った」と思い、赤だと「端末に網がない」と思います。どちらも違います。プローブが問うのはこのホップだけです。Direct なら、プローブが赤でもページは元経路で開けます。Config でホストが DIRECT なら、プローブが赤でもそのサイトが開くのは正常です。文を三つに分けます。トンネルがあるか、このホップがプローブできるか、今回のアクセスはどちら側を通ったか。一文目はスイッチ、二文目はミリ秒、三文目は Data です。ルールが入るのは三文目だけで、しかもポリシーが Config のときだけです。三文目で Proxy が増えているのにページが失敗するなら、問題はすでにトンネルの層を離れています。対向、名前解決、その App 自身のポリシーを見てください。三文目が Direct だけ増えるなら、ポリシーが Direct か、ルールが先に DIRECT と書いていないかを戻って見てください。スイッチ自体は、この二問に答えられません。

システムは個人 VPN を同時に 1 本しか維持しない

別の VPN アプリが接続中のとき、iOS は通常、トラフィックを Shadowrocket に渡しません。本アプリのスイッチが点いていても、バイトはこの拡張に入っていないことがあります。障害を対照するときは、先にシステムの VPN 一覧で今効いているのがどれかを見てください。機内モード、ネットワーク切替、低電力モードもトンネルを壊します。フレームワークの挙動であり、レコードが急に期限切れになったのではありません。ポータルのログインページが終わるまで、端末自身に本当の送信はありません。Direct なら、先にそのページが開けるはずです。その状態でスイッチを入れ、コンテナを更新し、ルールを直すのは、ネットがない前提での操作です。許可を拒否した、または構成を消したときも、スイッチの対象はありません。ルールをもう一つ入れるのではなく、システム VPN を再度許可してください。