Android ホットスポットのポート転送: 三つの入口の考え方
スマートフォン、キャリアの経路、VPN の出口はそれぞれ別の境界を示す。ポートを開く前に、どのマシンが待ち受けソケットを持つのかを確かめよう。
ホットスポットをオンにし、VPN をつなぎ、アプリでポートを開いたのに、もう一方の端末は接続できない。足りないのはポートそのものではなく、どのマシンが待ち受けソケットを持っているのか、そして相手がどのアドレスに届くべきなのかという点である。手元の画面で、三つの入口のどれを試しているのかが分かるので、スマートフォンから外側へ順にたどる。
サービスが実際に動いている場所から始める
接続を受け取るはずのアプリを開き、その状態ページを読む。待ち受けていると書かれていれば、どのアドレスに紐づいているかを記録する。この一点が下のほとんどの場合を決めるからだ。127.0.0.1 に束縛されたアプリは本体からしか届かず、ホットスポットのクライアントも、キャリアの変換も、VPN の出口もこれを変えない。
次に、どの端末がサービスを動かしているかを確かめる。スマートフォンならそのソケットはアプリのもの、ホットスポットの後ろのノート PC なら待ち受け側とファイアウォールはノート PC のもので、スマートフォンはパケットを転送するだけになる。これは別々の設計であり、混同すると片方で開けたポートがもう片方で何もしない。
デバッグできるビルドでは adb shell が /proc/net/tcp からソケットを一覧できるが、多くの人にとってはアプリ自身の状態が正直な情報源になる。
第一の入口: ホットスポット上の別端末
これはローカルの場合で最も簡単だ。別の端末は自分がゲートウェイとして見るアドレスで、アプリが待ち受けるポートに届く。ホットスポットの外は関与しないため、キャリアの変換も事業者の機能も要らない。通信がローカル区間を出ないからだ。
壊れる原因は二つある。アプリがループバックに束縛されていること、またはスマートフォンのクライアントポリシーがローカル接続を許さないことだ。アプリが認証を行うなら、素の TCP ではなくアプリ自身のプロトコルで試す。受け入れてから拒否する待ち受けは、遠目には閉じたポートと見分けがつかない。
サービスが接続済みのノート PC で動いているなら、スマートフォンのホットスポット側アドレスは行き先ではない。ノート PC のホットスポット側アドレスと、そこでの待ち受けが必要になる。
第二の入口: キャリアの経路
モバイル網からスマートフォンへ届くかどうかは別の問題で、IPv4 では多くの場合そのままでは動かない。事業者は端末を共有変換の後ろに置く。だからこそ RFC 6598 は、まさにその構成のために共有アドレス帯を確保している。求めていない着信接続には到達する変換がなく、ローカルの設定で作ることもできない。変換を行うのは自分の端末ではないからだ。
root 権限でも変わらない。手に入るのはスマートフォンのスタックの制御であり、事業者の変換の制御ではない。事業者が公開 IPv6 プレフィックスを提供する場合は着信経路が存在し得るが、待ち受けとファイアウォールには明示的な許可が要る。
第三の入口: VPN の出口
トンネルが上がっている間にサイトが示すアドレスは、対象となる送信通信の出口アドレスである。あなたの代わりに着信接続を受け取るアドレスではない。内向きに使うには、事業者が実際に提供する機能、たとえば転送ポートやアカウントに紐づく着信マッピングが必要で、さらに出口からクライアントまでの使える経路も要る。
ローカルの許可ルールではそのマッピングを作れない。変えられるのはアプリの応答が通る経路であり、アプリがトンネルから除外されているときに効いてくる。要求と応答が別のネットワーク文脈に落ち、接続はファイアウォールの問題のように失敗する。
一つの経路を端から端まで試し、それから持ち主を名指しする
試す前に組を書き出す。意図した送信元、宛先アドレス、トランスポート、ポート、そして待ち受けソケットを持つマシンだ。どれかが推測なら、試験は役に立つことを何も教えない。
そのうえで、許可した一つの経路だけを、アプリの認証を保ったまま試す。曖昧なアドレス確認に答えさせるためだけに広い待ち受けを公開したり、無関係な制御を切ったりしない。どちらも試験の後まで残る。
Android のテザリング機構は下り通信を独自の経路で送り、通常の VPN 取り込みとは別に扱う。だから接続済みのノート PC で動くブラウザは、スマートフォン上のサービスへの着信到達性について何も語らない。動くと言う前に次を確認する。
- 待ち受けは相手が届けるアドレスにあり、ループバックではない。
- 相手はその入口のアドレスを使っており、状態ページの出口アドレスではない。
- 事業者側や提供者側のマッピングは対応機能であり、ローカルに足したルールではない。
- 要求と応答が同じネットワーク文脈を通り、認証もまだ通る。