無料 Wi-Fi なんかでよくある、接続時にログインさせられるやつ。あれの名前は Captive portal というやつらしい。各OSともにこれを検出したときはログインダイアログを表示するような実装になっている。
Captive portal が出る条件は (OSによって違うだろうけど)
- OS 側が用意するドメインへの http アクセスをリダイレクトすること
のようだ。OS側が用意するドメインとは例えば
- captive.apple.com (macOS)
- connectivitycheck.gstatic.com (Android)
みたいなやつ
やることとしては
- DNS サーバを立てる。全ての A レコードクエリに対し captive portal の IP アドレスを返すようにする
- DHCP の DNS サーバに自分の IP アドレスを指定
- captive portal は HTTP サーバを立て、自分以外のホストへのリクエストをすべて自分のホストへリダイレクトする
これで macOS と Android でダイアログが出ることは確認した。
メモ
自力で DNS Server を実装するとOSの違いに気付くことがある
- macOS は DNS response に QUERY が含まれていなくても (ANSWER だけで) 認識する
- Android は DNS response にQUERY が含まれていないと認識しない