Cómo personalizar la resolución de dominios en iOS, como si editaras el archivo hosts
En un trabajo anterior, sufrí con los problemas de resolución DNS.
Nuestro proyecto usaba el mismo dominio tanto para el entorno de producción como para el de pruebas. Cuando necesitábamos redirigir el tráfico de la app al entorno de pruebas, teníamos que cambiar la resolución del dominio. En un ordenador es muy fácil: editas el archivo hosts del sistema y listo. Pero en iOS, debido al sandboxing y a las restricciones de seguridad, no es posible modificar directamente los hosts.
En su momento lo resolvíamos configurando el servidor DNS del Wi-Fi con un DNS personalizado. Pero nos topábamos siempre con estos problemas:
- La caché DNS obliga a limpiarla y reiniciar la app tras cada cambio.
- Por culpa de la caché, solo puedes saber si la nueva resolución ha hecho efecto inspeccionando las respuestas de la API.
- Cambiar el servidor DNS del Wi-Fi cada vez es muy tedioso.
- Modificar el DNS puede afectar al uso normal de otras apps en el móvil.
Para resolver todos estos inconvenientes, añadimos a ApiCatcher una funcionalidad de suplantación DNS llamada "Mapeo DNS", que básicamente nos permite tener un "archivo hosts personalizado" en iOS, redirigiendo los dominios que queramos a las IPs que necesitemos.
Cómo funciona el Mapeo DNS
Si no se puede modificar el archivo hosts del sistema iOS, ¿cómo consigue ApiCatcher cambiar el resultado de la resolución de un dominio?
El truco está en interceptar y redirigir el tráfico durante la fase de establecimiento de la conexión TCP en la capa proxy:
- Captura de tráfico: Al iniciar la captura de paquetes en ApiCatcher, todas las peticiones HTTP/HTTPS de las apps pasan por un túnel VPN local y atraviesan el servidor proxy local de ApiCatcher.
- Interceptación del host en la capa proxy: Cuando una app intenta conectarse a un dominio de destino (p. ej.,
echo.apicatcher.net), el servidor proxy consulta primero sus reglas locales de mapeo DNS antes de iniciar la conexión TCP real. - Sustitución de la IP física: Si se encuentra una regla que coincide, el servidor proxy se salta la resolución DNS pública y establece la conexión TCP directamente hacia la IP que hayas especificado.
- Transparente para el handshake TLS: Como la IP solo se sustituye a nivel de conexión TCP, la cabecera
HostHTTP y la información SNI (Server Name Indication) del handshake TLS se mantienen intactas. Por lo tanto, en handshakes HTTPS estrictos, la validación de certificados del lado del cliente sigue funcionando con normalidad — completamente transparente e imperceptible para la app.
Cómo se configura
-
Abre la app ApiCatcher, toca el botón 「+」 en la parte superior de la pantalla de inicio y selecciona Mapeo DNS en el menú emergente para acceder a la página de configuración de "Mapeo DNS".
-
Toca el botón 「+」 en la esquina superior derecha para crear una regla nueva:
- Dominio: Introduce el dominio que quieres mapear. Se admiten comodines (p. ej.,
*.apicatcher.netcoincide con todos los subdominios). - Dirección IP: Introduce la IP del servidor de destino o de tu ordenador local.
- Dominio: Introduce el dominio que quieres mapear. Se admiten comodines (p. ej.,
-
Inicia la captura y se aplica al instante Vuelve a la pantalla de inicio y pulsa el botón de inicio para lanzar el servicio proxy. A partir de ese momento, todas las peticiones del móvil que coincidan con las reglas se dirigirán automáticamente a la IP configurada. Si solo necesitas el mapeo DNS sin capturar paquetes, puedes configurar reglas de lista blanca/negra de hosts.
Los cambios en las reglas de Mapeo DNS se aplican de inmediato mientras la captura esté activa.
