社内 VPN に接続すると、Android Studio が実行中のエミュレーターを見失い、adb start-server が止まり、Wi-Fi 上の実機がデバイス一覧から消えます。一つのトンネルが一つの製品を止めているように見えます。実際には三つの別々の経路が三通りの仕方で失敗します。adb のデバイス検出、エミュレーターの仮想ネットワーク、ホストのリゾルバーです。トンネルが持つのは通常最後の一つだけで、しかもその一部だけです。

三つのソケット、三つの所有者

adb サーバーはホストのポート 5037 で待ち受け、USB または TCP でデバイスと通信し、ネットワーク検出には mDNS を使います。エミュレーターは独自の仮想ルーターの内側で動きます。ゲストは 10.0.2.15、ゲートウェイは 10.0.2.2、DNS サーバーは 10.0.2.3 で、いずれもエミュレーターのプロセスがホストのソケットに変換します。ホストのリゾルバーは、VPN クライアントが DNS と検索ドメインを設定する場所です。

この分離が、一つの修正が一つのツールで効いて別のツールで効かない理由を説明します。ホストのリゾルバーを変えるクライアントは、起動時に読んだリゾルバーの状態のまま実行中のエミュレーター プロセスを残します。multicast を絞り込むクライアントは DNS に触れずに検出を壊します。仮想アダプターを絞り込むクライアントは、ホストのブラウザーが動いたままエミュレーターを拒否します。症状ごとに原因が違うので、設定を変える前に失敗している経路を特定してください。

adb が見えるものから始める

VPN に触れる前に adb devices を実行します。空の一覧は転送の問題で経路の問題ではなく、サーバーが一度も列挙しなかったデバイスをトンネルの設定で直すことはできません。サーバーをきれいに再起動します。まず adb kill-server、次に adb start-server を実行し、どのポートを掴んだかを出力で確認します。起動自体が止まる場合、multicast を絞り込むネットワークでは mDNS 検出が定番の容疑者です。文書化された回避策は検出を無効にしてサーバーを起動することです。

ADB_MDNS_OPENSCREEN=0 adb start-server
adb devices

実機なら USB が最短です。TCP が必要なら、adb tcpip 5555 でデバイスを待ち受けモードにし、デバイスのアドレスとポートに接続します。adb connect 192.0.2.10:5555。ポート 5037 はホストのサーバーのポートで、デバイスが待ち受けるポートではありません。

エミュレーターを内側から試す

エミュレーターは 10.0.2.3 から DNS に応答し、そのリゾルバーはホストのプロセスが供給します。VPN クライアントがホストのリゾルバーを変えるとエミュレーターは継承できますが、クライアントがエミュレーターのプロセスを絞り込む場合や、起動後にホストのアダプター一覧が変わる場合は継承できません。同じシェルから数値の宛先と名前で両者を切り分けます。adb shell ping -c 2 10.0.2.2 は仮想ネットワークがホスト側に届くことを示します。その後の名前解決で、解決が境界を越えたか分かります。

次に同じ名前解決をホストで実行します。ホストが解決してエミュレーターが解決しないなら、断絶はホストのリゾルバーとエミュレーターの仮想ネットワークの間で、トンネルの中ではありません。両方失敗するならホストのリゾルバーを見るべきです。VPN 接続後にエミュレーターを再起動する価値は一度あり、一部のクライアントは実行中のエミュレーター プロセスが取り込まないリゾルバーの状態を設定します。

ホストのリゾルバーとクライアントの絞り込みを確認する

フル トンネルのクライアントはホストのリゾルバーを自前のものに置き換え、split-DNS のクライアントは検索ドメインと条件付きフォワーダーを追加します。内部名はしばしばその split-DNS 構成に依存するので、接続中にホストが何を使うかを確認します。リゾルバーのアドレス、検索ドメイン、内部ゾーンが社内 DNS にルーティングされているかです。公開名には答え内部名には答えないリゾルバーはポリシーの問題で、壊れたトンネルではありません。

一部の社内クライアントは仮想アダプターからの通信も遮断します。フィルター ドライバーにはエミュレーターが仮想アダプターに見えるため、ホストは完璧に動いたままポリシーがエミュレーターを拒否できます。そのポリシーはワークステーションからは見えず、プロキシ設定を推測しても分かりません。ホストが解決し、リゾルバーの設定に関係なくエミュレーターが遮断されるなら、正しいエスカレーション先はクライアント ポリシーを持つチームです。

確認の順序と各結果の意味

上から下へ進み、最初に失敗した行で止まります。各結果は別の所有者を指し、どれも Android Studio の再インストールでは直りません。

ResultLikely ownerNext check
adb devices is empty with USB attachedUSB, driver or adb servercable, authorization prompt, adb kill-server
adb start-server hangsmDNS discoveryADB_MDNS_OPENSCREEN=0
Emulator reaches 10.0.2.2, names failHost resolver to emulator boundaryhost lookup of the same name
Host resolves, emulator still failsEmulator process or client filterrestart emulator, ask IT about virtual adapters
Both fail for internal names onlySplit DNS or search domainresolver and zone configuration

通常の意味で VPN の問いになるのは最後の二行だけで、DNS の中身に関わるのは最後の一行だけです。adb のドキュメント はサーバーのポートとここで挙げた環境変数を扱っており、残りを試す間、転送側を正確に保つのに十分です。

関連記事