Skip to content

Add connectivity check spoofing to prevent mobile device auto-disconnect on offline IoT APs - #2

Draft
Ataraxiall with Copilot wants to merge 5 commits into
mainfrom
copilot/modify-comitup-wifi-behavior
Draft

Ataraxiall with Copilot wants to merge 5 commits into
mainfrom
copilot/modify-comitup-wifi-behavior

Conversation

Copilot AI commented Nov 12, 2025 •

Copy link
Copy Markdown

Mobile devices (Android, iOS, Windows) auto-disconnect from WiFi networks that fail connectivity checks, breaking IoT devices that provide local services without internet. This adds spoofing for connectivity check endpoints to make devices believe they have internet.

Changes

DNS Redirection (conf/dns-hotspot.conf)

Added 22 address entries redirecting connectivity check domains to AP IP (10.41.0.1):

  • Android: connectivitycheck.gstatic.com, clients3.google.com, etc.
  • iOS: captive.apple.com, www.apple.com
  • Windows: www.msftconnecttest.com, www.msftncsi.com
  • Manufacturer-specific: Samsung, Xiaomi, Huawei, OnePlus, Oppo, Vivo variants
  • Firefox, Ubuntu/Linux checks

HTTP Endpoints (web/comitupweb.py)

Added 10 Flask routes returning expected responses:

@app.route("/generate_204")  # Android
def generate_204():
    return "", 204

@app.route("/library/test/success.html")  # iOS
def ios_success_html():
    html = "<HTML><HEAD><TITLE>Success</TITLE></HEAD>"
    html += "<BODY>Success</BODY></HTML>"
    return html, 200

@app.route("/ncsi.txt")  # Windows
def windows_ncsi():
    return "Microsoft NCSI", 200

Configuration (conf/comitup.conf, comitup/config.py)

Added enable_fake_internet option (defaults false) for future conditional activation. Currently DNS redirects are always active in hotspot mode.

Testing

  • 10 new unit tests covering all endpoints
  • Manual test script (test/test_connectivity.sh) for deployment verification

Documentation

  • doc/FAKE_INTERNET.md: User guide with troubleshooting
  • doc/SOLUCION_SPANISH.md: Spanish version for original issue reporter
  • doc/IMPLEMENTATION_NOTES.md: Implementation details and maintenance guide

Compatibility

Android 8.0+, iOS 12+, Windows 10/11, macOS 10.15+, Firefox, Ubuntu/Linux. Fully backward compatible—no impact when devices don't perform connectivity checks.

Original prompt

Quiero modificar el comportamiento de Comitup en un dispositivo IoT con Armbian para que los móviles no se desconecten automáticamente de su punto de acceso WiFi cuando no hay salida a Internet.

Contexto

  • Hardware/OS: Dispositivo IoT corriendo Armbian.
  • Software de gestión WiFi: Comitup (el clásico que crea el AP tipo comitup-XXXX cuando está en modo HOTSPOT).
  • Escenario de uso:
    • Mi dispositivo IoT no tendrá nunca salida a Internet en este escenario.
    • La WiFi del Comitup se usa únicamente para acceso local a servicios del propio dispositivo (p. ej. una página web de control, API local, etc.).
  • Funcionamiento actual de Comitup (a grandes rasgos):
    • Cuando no está conectado a una red conocida, entra en modo HOTSPOT y levanta un AP con DHCP y DNS (dnsmasq) y su propio servidor web (comitup-web) que actúa tipo portal cautivo.
    • Usa dos configuraciones de dnsmasq: una para hotspot (dns-hotspot.conf) y otra para cuando se conecta a una WiFi externa.
    • La IP típica del AP de Comitup suele ser 10.41.0.1 (pero si es necesario, detéctala dinámicamente en la solución).

Problema

  • Los móviles (Android, iOS y otros) al conectarse al AP del IoT:
    1. Hacen sus comprobaciones de conectividad (por ejemplo, URLs tipo:
      • Android: http://connectivitycheck.gstatic.com/generate_204, http://clients3.google.com/generate_204, etc.
      • iOS: http://www.apple.com/library/test/success.html, o equivalentes.
      • Además, algunos fabricantes como Samsung, Xiaomi, Huawei y otros pueden usar sus propios dominios o URLs adicionales para verificar conectividad, no siempre documentados ni idénticos a los de Android “puro”.
    2. Como el dispositivo no tiene salida real a Internet, esas peticiones fallan o llegan al portal cautivo/redirección de Comitup.
    3. Entonces el sistema marca la red como “Sin Internet” / “captive portal” y, en muchos Android y algunos iOS:
      • Aparece un aviso de que no hay Internet.
      • Se cambian automáticamente a datos móviles o a otra WiFi con Internet.
      • En algunos casos llegan incluso a desconectarse solos de esta red, lo cual rompe por completo la experiencia con el IoT.

La consecuencia práctica es que, aunque el AP funciona bien a nivel de red local, los clientes móviles no permanecen conectados porque insisten en que la red “no sirve” al no ver Internet.

Objetivo

Quiero modificar Comitup (preferentemente cambiando su configuración y/o su propio código, por ejemplo en comitup-web y los ficheros de dnsmasq que usa) para conseguir alguno de estos comportamientos (tú puedes proponer la mejor opción):

  1. Modo “red local pero considerada con Internet”

    • Hacer que Android, iOS, etc. interpreten que la red sí tiene Internet, aunque en realidad todo el tráfico relevante sea local.
    • Idea aproximada:
      • Redirigir (vía DNS/iptables) las URLs de comprobación de conectividad hacia el propio IoT (por ejemplo, la IP del AP).
      • Responder con los códigos/respuestas que esperan (por ejemplo, HTTP 204 sin contenido para Android, “Success” para iOS en la ruta que corresponda).
      • Tener en cuenta que fabricantes como Samsung, Xiaomi, Huawei, etc. pueden usar dominios y rutas adicionales propios, por lo que la solución ideal debería:
        • O bien contemplar una lista amplia/extensible de dominios conocidos.
        • O bien ofrecer algún mecanismo más genérico o dinámico para manejar este tipo de peticiones de conectividad.
    • De esta forma, los móviles marcan la red como “OK” y no intentan desconectarse ni cambiar a datos móviles.
  2. Modo “red local estable sin molestar al usuario”

    • Alternativamente, si conoces otra manera más limpia/estándar de indicar a los clientes que se trata de una red sólo local (por ejemplo, mediante opciones DHCP, desactivando comportamiento de portal cautivo, u otro mecanismo), también me sirve.
    • Lo importante es que:
      • El móvil no se desconecte solo.
      • No esté constantemente mostrando ventanas de “inicie sesión en la red” o “no hay Internet”.

Idealmente me gustaría que:

  • Siga existiendo una interfaz web o similar para configurar redes (o se reemplace por otra solución sencilla).
  • El comportamiento en modo HOTSPOT pueda:
    • Configurarse fácilmente (por ejemplo, un flag tipo “fake-internet = true/false”).
    • Respetarse aunque en el futuro el dispositivo tuviera Internet, o al menos que no rompa el caso estándar de Comitup si lo quiero usar de forma tradicional.

Lo que me gustaría que hicieras

  1. Analiza cómo funciona Comitup:

    • Cómo monta el AP.
    • Cómo configura dnsmasq (dns-hotspot.conf y dns-connected.conf o equivalente).
    • Cómo responde comitup-web a las peticiones (incluyendo las usadas por portales cautivos o comprobaciones de conectividad tipo /generate_204, /hotspot-detect.html, etc., si las tuviera).
  2. Propón una o varias soluciones técnicas, y elige la que consideres más robusta/man...


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI self-assigned this Nov 12, 2025
Copilot AI and others added 4 commits November 12, 2025 21:59
Co-authored-by: Ataraxiall <67580921+Ataraxiall@users.noreply.github.com>
Co-authored-by: Ataraxiall <67580921+Ataraxiall@users.noreply.github.com>
Co-authored-by: Ataraxiall <67580921+Ataraxiall@users.noreply.github.com>
Co-authored-by: Ataraxiall <67580921+Ataraxiall@users.noreply.github.com>
Copilot AI changed the title [WIP] Modify Comitup behavior for IoT device WiFi connectivity Add connectivity check spoofing to prevent mobile device auto-disconnect on offline IoT APs Nov 12, 2025
Copilot AI requested a review from Ataraxiall November 12, 2025 22:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants