A solução que encontrei foi configurar meu dnsmasq para continuar a resolver tudo para 192.168.30.1, mas ter algumas exceções para servidores de teste de portal cativos:
10.45.12.1 clients3.google.com
10.45.12.1 clients.l.google.com
10.45.12.1 connectivitycheck.android.com
10.45.12.1 connectivitycheck.gstatic.com
10.45.12.1 play.googleapis.com
Basicamente, se qualquer coisa tentar resolver os domínios acima usando nosso servidor dns, eles receberão uma resposta de 10.45.12.1.
10.45.12.1 é um IP aleatório que não pertence a nada. Só não tem que ser 192.168.30.1.
A lista de domínios veio de aqui .
Com isso, assim que você se conectar ao WiFi do RPi, aparecerá a página do navegador mostrando meu site.
Esta é uma solução, mas não é realmente uma resposta para a questão de por que isso acontece. Se alguém puder explicar, eu agradeceria.
Editar:
Com essa solução, se eu me conectar e desconectar do Wi-Fi no dispositivo várias vezes, às vezes o Android abre a página de login, e às vezes não. Para alguém fazendo algo semelhante, no final, para uma solução melhor, eu fui com isso:
- O DNSmasq resolve tudo para 10.45.12.1 (ou qualquer coisa fora da sub-rede 192.168.30.0/24)
- DEVE estar fora da sub-rede 192.168.30.0/24 (ou qualquer que seja sua sub-rede LAN) ou o cliente tentará usar o ARP para descobrir o endereço MAC do dispositivo especificado e falhará, porque o dispositivo não na verdade existe
- O iptables encaminha a porta 80, vindo da interface wifi para o localhost
Isso funciona para Android, OS X e Windows. Eu não tenho um dispositivo iOS para testar isso. De acordo com este , os dispositivos iOS podem exigir algum trabalho adicional.
Ainda estou curioso para saber por que isso foi necessário, e por que resolver tudo para 192.168.30.1 não funcionou em primeiro lugar.