ポリシーは一文だけです。このアプリは業務サービスに到達してよく、それ以外には何も届いてはいけない。次の問いは製品選びに見えますが、実は置き場所の問いです。強制できる候補点はどれも、端末の通信の別の部分しか見ていないからです。ゲートウェイが見るのはトンネルに入る通信だけです。端末側のフィルタが見るのは、見ることを許された範囲だけです。一つの要求を両方に通せば、答えは明らかになります。

製品ではなく、まず一文から始める

何かを選ぶ前に要件を展開します。まずパッケージと、それが動くプロファイルです。業務プロファイルのアプリは、個人プロファイルの同じアプリとは別のユーザーだからです。次に宛先です。ホスト、ポート、プロトコルであり、サービス名ではありません。名前を解決する DNS の経路も含まれ、トンネルが使えないときに何が起きるべきかも含まれます。

書き下すと、例のポリシーは四行になります。業務アプリは業務サービスに到達できる。業務アプリはそれ以外に到達できない。他のアプリは変更しない。トンネルがなければ、業務アプリは直接経路に落ちるのではなく拒否される。各行には所有者があり、すべてが同じ所有者ではありません。

ステップ 1: 端末自身が強制できること

root を取らない Android のファイアウォールは VpnService であり、背後に遠隔のトンネルがなくても通信を端末内で捕まえます。Android はユーザープロファイルごとに一つの VPN サービスしか同時に動かせません。そのため二つ目のファイアウォールアプリは一つ目の後ろに連なるのではなく、それを置き換えます。置き換わった時点で、一つ目が絞り込んでいたインターフェースは消えます。

VPN クライアントの隣にファイアウォールを入れて期待した組み合わせにならないのは、このためです。ファイアウォールが起動して VPN が切れるなら、統合ではなく場所の入れ替えです。インターフェースの置き換えは協調ではなく、症状はもう一方のアプリを開くたびにトンネルが落ちることです。

対応している構成は存在します。すでに使っている VPN クライアントに組み込まれた絞り込み、デバイス ポリシー コントローラや業務プロファイルによる管理されたプラットフォーム制御、ベンダーが文書化したアーキテクチャです。それ以外は、アプリの更新のたびに再検証が必要な実験です。

ステップ 2: ゲートウェイが強制できること

遠端で通信が復号された後、ゲートウェイは転送するパケットを承認済みのアドレス、サービス、認証済みの VPN 識別子に制限できます。そこから出るものすべてに対する本物の強制であり、プライベートサブネットへの到達を絞るのに適した場所です。

受け取らないのは、通常の IP パケットに付いている端末のアプリ識別子です。一つのトンネルアドレスを共有する複数のアプリは、設計が別々のアドレスや別々の認証済み識別子を与えない限り、ゲートウェイにとって一つの主体です。したがってゲートウェイのユーザー単位のルールは、端末のアプリ単位のルールではありません。管理コンソールの呼び方に関係なく。

ステップ 3: 決して届かないものを列挙する

VPN から除外されたアプリが近くの機器と通信しても、ゲートウェイには決して届きません。受け取らないパケットを出口のファイアウォールは拒否できません。障害時の意図しない直接経路や、ローカルアクセスネットワークへの着信も同じです。これらは定義上ローカルの境界です。

逆も成り立ちます。接続を許可するローカルルールは、ゲートウェイのプライベートネットワーク ACL を通した到達を与えません。一つの要求が両方の境界の対象になることがあり、片方を満たしても他方については何も言えません。

ステップ 4: 各ルールを経路に割り当てる

何かを設定する前に判断を表にします。空欄こそが設計の破綻する場所だからです。

経路誰が強制できるか盲点
業務アプリから業務サービスへ、トンネルありアドレスとサービスによるゲートウェイ ACL、加えて他の経路のローカル遮断ゲートウェイはどのアプリが送ったかを知らない
業務アプリから他の宛先へ、トンネルありアプリを認識するローカルフィルタ、またはその宛先がそこで宛先指定されていればゲートウェイローカルフィルタが稼働中の VpnService である必要がある
トンネルなしの業務アプリローカル拒否。アプリが直接経路を取れないようにするトンネルが消えてもフィルタが生き残る必要がある
近くの LAN 機器ローカルポリシーのみゲートウェイは決して見ない

機能する形は、二つの仕事を持つ二つの境界です。アプリを認識するローカル境界が端末の振る舞いを支配し、直接の落ちこぼれも含みます。ゲートウェイ境界は遠隔の資源を支配します。ゲートウェイ側は業務サービスを許可し他のプライベートサブネットを拒否でき、端末側のポリシーは、アプリが取りうる直接経路について自分で判断します。

ステップ 5: 転送を生かしたまま検証する

どのローカルポリシーを選んでも、VPN を確立し維持する転送を許可しなければなりません。その転送を遮断すると、端末はトンネルもポリシーも持たない状態になります。一貫して何も強制できず、アプリには通信手段がないので診断も難しくなります。

そのうえで、全体の印象ではなく元の一文の各行を検証します。業務アプリは業務サービスに到達する。同じアプリは別の宛先で拒否される。業務でないアプリは以前と同じように振る舞う。トンネルを止めると業務アプリは直接接続に落ちない。DNS の経路は別に確認します。プライベート DNS や暗号化されたリゾルバは、アドレスだけを見るフィルタを迂回できるからです。

これらの手順のどれかが端末で満たせないなら、要件はファイアウォールの設定ではなくアーキテクチャの問いです。管理下の機器と管理下のゲートウェイにポリシーを分けるのが、たいていは正直な答えです。Android の VPN 接続のドキュメントは、プラットフォームが一つのサービスに何を許し何を許さないかを確かめる場所です。

関連記事