Esto fue doloroso, pero lo resolví:
Cuando Android se conecta a una nueva red, intenta autodetectar si realmente puede llegar a Internet a través de esta red. Si no es así, mostrará una ventana del navegador y abrirá una dirección http aleatoria con la esperanza de que aparezca el portal cautivo de la red (es decir, la página de acceso al wifi de su hotel, etc.).
La detección se realiza solicitando http://clients3.google.com/generate_204
(o similar) y esperando una respuesta determinada. (Deliberadamente no he convertido esta dirección en un enlace, porque si intentas abrirlo, no pasa nada ya que devuelve HTTP Status 204: No Content
que la mayoría de los navegadores ignoran).
Ahora, mi confusión vino del hecho de que tenía un servidor HTTP funcionando para servir esta respuesta y tenía un servidor DNS configurado para dirigir la petición a ese servidor. Pero el servidor no estaba recibiendo ninguna solicitud de este teléfono en particular (otros teléfonos Android funcionaban).
Resulta que este teléfono en particular hace dos cosas diferentes:
- Simplemente desactiva el WiFi en lugar de abrir la página del portal cautivo si no se detecta ninguna red, lo que hace que sea realmente difícil incluso entender lo que está pasando.
- No utilizó una búsqueda de DNS para
clients3.google.com
pero, en cambio, utilizó una IP codificada para ello.
Así que, finalmente, pude resolver el problema estableciendo un iptables
-regla que simplemente reenvía todas las peticiones HTTP a mi servidor HTTP, independientemente de la IP a la que vayan dirigidas. Después de eso, el teléfono obtuvo su generate_204
-respondió y todo funcionó como estaba previsto...