二つのVPNを使うことは、一つの要求ではない。二つの組織に順番に到達すること、仕事用と個人用のアプリを分けておくこと、あるいは一方のトンネルをもう一方の中で走らせることを意味しうる。Androidはこの三つの場合をまったく異なる方法で扱い、スマホにインストールされたVPNアプリの数はアーキテクチャではない。両者を分ける問いは単純で、同じアプリのために、二つの経路が同じ瞬間に存在する必要があるのか。

三つの構成、一つの問い

二つのネットワークを別々の時間に使うために答えが「いいえ」なら、意図的な切り替えが必要だ。アプリ自体が別だから答えが「いいえ」なら、プロファイル分離が必要であり、各アプリは自分のトンネルを所有するコンテキストに置かれる。答えが「はい」で、一方の経路がもう一方を物理的に運ぶ必要があるなら、チェーンが必要であり、順序が設計の一部になるのは三つのうちこれだけだ。

それ以外のすべてはこの選択から導かれる。切り替えには移行の窓があり、分離にはポリシーの境界があり、チェーンにはオーバーヘッドと依存のコストがある。誤ったものを選んでもきれいに失敗せず、つながっているように見えるスマホと、どこにも届かないアプリが生まれるだけだ。

一つのユーザーコンテキスト内での切り替え

Androidはユーザーごとに一つの有効なVPNサービスしか許さない。同じコンテキストで二つ目のVPNアプリを起動すると、一つ目は置き換えられるか、きっぱりと拒否され、二つの経路集合が合成されることはなく、ましてや暗号化が積み重なることもない。一人のユーザーの中では、二つのトンネルは和ではなく順序である。

アクセスが本当に逐次的なら、これは実用的だ。どのプロファイルが有効か分かるように名前を付け、切り替える前に機密の用事を済ませ、どちらの経路も完全には確立していない短い窓を想定しておく。ブラウザのタブを閉じることはセッションを終えることと同じではなく、タブはアカウントの状態を保ったまま、次の要求を新しく選んだネットワークで送るだけであり、それが後から人が気づく漏れそのものだ。

切り替えが与えられないのは、同時に両方のネットワーク上にあるマシンだ。アプリが両側からプライベートアドレスを必要とするなら、クライアントの規律では決して生み出せない。

プロファイルによる分離

管理された仕事用プロファイルは、独自のアプリ、キーストア、ネットワークポリシーを持つ別のユーザーだ。仕事用のメールクライアントが組織のトンネルを使い、個人用のブラウザが個人用のトンネルを使うことができ、両者は同じコンテキストで枠を奪い合っていないため同時に接続できる。

分離は限界でもある。個人用のブラウザは仕事のトンネルを借りず、仕事のDNSサフィックスも見えず、二つのサービスが接続済みに見えるからといって仕事のネットワークに届くわけではない。リンクが開かないと誰かが報告したら、どちらのVPNに触れる前に、アプリのどのコピーがそれを処理したのか、そのアカウントをどのプロファイルが所有しているのかを確認する。

境界は固定されたものとして扱う。雇用主のルーティング判断を避けるために二つ目のプロファイルを作ったり仕事用プロファイルを削除したりすると、その構成を機能させていた分離そのものを壊してしまい、管理された端末では、それは通常、設定の調整ではなくポリシー違反だ。

順序が設計であるチェーン

チェーンとは、両方を同時にと言うときに人が通常意味する構成であり、スマホのトンネルがルーターのトンネルの中を通る。機能することはあり、制約は具体的だ。外側のプロバイダーはスマホのVPNエンドポイントへの動作する経路を許可しなければならず、UDPベースのプロトコルでは、外側のサービスがそのトラフィックを遮断も制限もしないことを意味する。

誰が何を見るのかを理解する。外側のプロバイダーは内側のエンドポイントへの接続を見る。内側のプロバイダーは外側の出口からスマホのトラフィックを受け取り、先へ転送する。最終的な宛先は通常、内側のサービスの出口を見ており、チェーン上のどのプロバイダーも盲目ではなく、アプリのアカウントは経路にかかわらず利用者を識別する。

実際のコストを想定する。層が増えるたびにカプセル化が加わるため、実効MTUは下がり、一つのトンネルなら問題なかった値が、内側のトンネルのMTUを控えめに設定するまで断片化したり止まったりする。二つの層は二つの故障依存と二組のキープアライブも意味し、損失のある外側リンク上のTCPベースの内側トンネルは、死んだサーバーのように見える形で止まることがある。

最も重要なのは、チェーンは二つのプライベートネットワークを統合しないということだ。経路、重複するプレフィックス、DNS解決、アクセス規則は別々の判断のままであり、一方のVPNを載せたルーターと他方のVPNを載せたスマホがあっても、スマホに両方のアドレス空間が与えられるわけではない。

デバッグする前に設計を確認する

構成を一文で書き、失敗したアプリに対して試す。逐次アクセスなら一度に一つのトンネルが見え、プロファイル分離なら各アプリがそれぞれのユーザーに見え、チェーンなら内側のトンネルが物理インターフェースではなく外側のインターフェース越しに確立するはずだ。

adb shell ip -br addr
adb shell ip route get 10.20.0.8
adb shell dumpsys connectivity | grep -i vpn

アプリがトンネルを期待しているのに経路検索が物理インターフェースを挙げるなら、設計とアプリのコンテキストが一致しておらず、VPNアプリを追加しても両者は和解しない。ポリシーの詳細が必要でルーティングの詳細が要らないなら、管理プロファイルのドキュメントが分離の規則を扱っている。

関連記事