✦Ingeniería

NAT traversal explicado: cómo el escritorio remoto P2P atraviesa tu router.

Tienes una IP pública y una docena de dispositivos detrás de tu router. Tu iPad está en datos celulares, a tres redes de distancia. De algún modo, una app de escritorio remoto abre una conexión directa de uno a otro en menos de un segundo, normalmente sin relay en medio. Así funciona de verdad esa magia: ICE, STUN, TURN, hole punching y la incómoda verdad sobre el NAT simétrico.

Por qué importa

Imagina una mañana de martes. Tu Mac mini está en casa detrás de un router con una sola dirección IPv4 pública. Tu iPad está en el tren, en la red móvil de un operador con sus propias capas de traducción de direcciones. Hay al menos dos NAT entre los dos dispositivos, probablemente tres. Ninguna de las dos máquinas es accesible desde internet por defecto.

Y aun así abres Remio en el iPad, tocas la Mac y un segundo después estás viendo tu escritorio. El video y la entrada fluyen directamente entre los dos dispositivos: sin relay en la nube, sin proxy en medio recodificando tu pantalla.

La técnica que lo hace posible tiene nombre —NAT traversal— y detrás una familia de protocolos bien definidos: STUN, TURN e ICE. Son los mismos protocolos que usa WebRTC para las videollamadas en el navegador, y son la razón por la que cualquier escritorio remoto P2P moderno puede evitar pasar los fotogramas de tu pantalla por el centro de datos de un tercero. Este artículo recorre qué hace cada uno, por qué existe y cómo se combinan para encontrar la ruta de menor latencia entre dos dispositivos escondidos detrás de routers.

El problema del NAT en 60 segundos

Internet se diseñó para que cada dispositivo tuviera su propia dirección enrutable públicamente. Hay unos 4,300 millones de direcciones IPv4 en todo el espacio: muchas en 1981, y muy claramente insuficientes hacia fines de los 90.

El remedio fue la traducción de direcciones de red (NAT). Tu router recibe una dirección IPv4 pública de tu proveedor. Dentro de tu casa, cada dispositivo recibe una dirección privada de un rango reservado (normalmente 192.168.x.x o 10.x.x.x). Cuando tu laptop envía un paquete hacia fuera, el router reescribe la dirección de origen con su propia IP pública, recuerda la correspondencia y lo reenvía. Cuando llega la respuesta, el router busca la correspondencia y reescribe el destino de vuelta hacia tu laptop.

Por eso mismo las conexiones entrantes no funcionan por defecto. Desde fuera, tu laptop no tiene dirección; solo el router la tiene. El paquete de un desconocido a ip-publica-de-tu-router:5060 llega a un router que no tiene ninguna correspondencia para él y lo descarta.

Para una app P2P, este es todo el juego. Ambos pares están detrás de routers que solo reenvían paquetes cuando recuerdan haber enviado algo hacia fuera primero. Ninguno puede simplemente «llamar» al otro: tienen que cooperar con sus routers para abrir un camino temporal.

Hole punching: lograr que el firewall te deje volver a entrar

Este es el truco. La tabla NAT de tu router se indexa por una quíntupla: IP de origen, puerto de origen, IP de destino, puerto de destino y protocolo. Cuando tu dispositivo envía un paquete UDP saliente a 1.2.3.4:5678, el router crea una entrada temporal que dice «si llega algún paquete UDP de 1.2.3.4:5678 a mi IP pública en el puerto X, reenvíalo a este dispositivo en el puerto Y».

Esa entrada existe durante una ventana de tiempo —normalmente de 30 a 60 segundos— y luego caduca salvo que algo la renueve. Durante esa ventana, cualquier paquete de la dirección de destino será aceptado.

Esta es la cerradura que usan las apps P2P. Si ambos pares conocen la dirección pública del otro, cada uno puede enviar un único paquete UDP saliente al otro al mismo tiempo. El router de cada lado abre una correspondencia saliente. El primer paquete de cada lado bien puede descartarse —el otro router aún no abrió su correspondencia—, pero el segundo paquete ya tiene adónde ir. Desde ese momento, ambos routers creen que reenvían una conversación saliente normal, y los dos dispositivos hablan directamente.

Esto se llama UDP hole punching. Es levemente milagroso, está bien documentado (RFC 5128) y funciona con la gran mayoría de los NAT de consumo que existen. Los casos restantes —NAT simétrico, CGNAT, firewalls corporativos— son la razón de que exista TURN.

El hole punching no es un truco sucio. Es el contrato explícito en torno al cual se diseñó el NAT: un paquete saliente crea un permiso de entrada. Las apps P2P simplemente envían el paquete saliente a propósito.

STUN: «¿cuál es mi dirección pública?»

El hole punching necesita un requisito previo: cada par debe conocer su propia dirección de cara al público para poder decirle al otro lado adónde enviar paquetes. Esa dirección no es visible desde dentro del dispositivo. Tu iPad ve su dirección Wi-Fi local (192.168.1.42). Lo que el resto de internet ve después de que el router reescribe el paquete es algo completamente distinto.

STUN —Session Traversal Utilities for NAT, RFC 5389— es el pequeño protocolo que lo resuelve. El flujo es casi vergonzosamente simple:

  1. El par envía un paquete UDP a un servidor STUN público. (Remio usa los servidores STUN públicos de Cloudflare y de Google, por redundancia.)
  2. El servidor STUN lee la IP y el puerto de origen en el cable, que es, por definición, la dirección pública del par traducida por el NAT.
  3. El servidor STUN responde con esa dirección como contenido: «Por lo que puedo ver, eres 203.0.113.42:48291.»
  4. Ahora el par sabe qué dirección anunciar al otro lado.

Esa dirección de cara al público se llama candidato server-reflexive en la terminología de ICE. Cuesta prácticamente nada: un viaje de ida y vuelta durante el establecimiento de la conexión, y cero sobrecarga de ancho de banda o latencia después. El único trabajo de STUN es presentar a dos pares entre sí; una vez que hablan, el servidor STUN ya no tiene ningún papel.

TURN: cuando falla el hole punching

El hole punching funciona con la mayoría de los NAT, pero no con todos. Los casos de fallo son reales, y una app P2P que finja que no existen simplemente no podrá conectar para una porción significativa de usuarios.

Los principales villanos:

Para estos casos, el respaldo es TURN (Traversal Using Relays around NAT, RFC 5766). Un servidor TURN es un relay al que ambos pares pueden llegar porque tiene una dirección pública que siempre acepta tráfico entrante. Cada par hace una conexión TLS saliente normal al servidor TURN (que cualquier NAT permitirá), y el servidor reenvía los bytes entre los dos lados.

TURN tiene un costo real. Cada paquete de video tiene que atravesar un salto de red adicional. En un relay TURN regional, eso suma unos 30 a 80 milisegundos de latencia de ida y vuelta. Entre regiones —digamos un relay en Fráncfort para un par en Tokio y otro en São Paulo— puede ser de 80 a 200 milisegundos. El operador de TURN también paga el ancho de banda: cada bit de tu transmisión pasa por sus tuberías.

Por eso una app bien diseñada usa TURN solo cuando el hole punching ha fallado de forma demostrable. ICE toma esa decisión automáticamente.

ICE: probar todos los candidatos en paralelo

Interactive Connectivity Establishment, RFC 8445, es la coreografía que une todo esto. ICE no elige una estrategia de antemano. Reúne todas las direcciones candidatas posibles de cada par, intercambia la lista completa con el otro lado y luego hace que ambas pilas sondeen todos los pares de candidatos en paralelo, en una carrera por encontrar el primero que funcione.

Para cada par, ICE normalmente reúne:

Los dos pares intercambian estas listas por un canal de señalización; en Remio, es una pequeña conexión WebSocket a relay.remio.net que lleva los candidatos ICE y la descripción de sesión de WebRTC (el SDP), y luego no tiene nada más que hacer una vez que empieza a fluir el contenido.

Con ambas listas en mano, ICE empieza las comprobaciones de conectividad. Cada par envía un paquete STUN binding request por cada pareja de candidatos, en orden de prioridad. Las prioridades están pensadas para preferir la ruta de menor latencia:

  1. Host a host: ambos pares en la misma red local. Es el caso soñado: unos cientos de microsegundos de latencia, sin router de por medio.
  2. Host a server-reflexive, o server-reflexive a server-reflexive: pares en redes distintas, con hole punching a través de sus NAT respectivos. Esto es lo que normalmente significa «P2P por internet» en la práctica.
  3. Cualquier cosa con un relay: último recurso, usado solo cuando todas las rutas de mayor prioridad fallan sus comprobaciones de conectividad.

La primera pareja de candidatos en la que ambas direcciones tienen éxito se nomina ganadora, y el contenido empieza a fluir por esa ruta. Todo el proceso suele completarse en bastante menos de un segundo.

ICE también reúne candidatos de forma continua. Si aparece una ruta mejor en plena sesión —por ejemplo, tu celular deja los datos celulares y se une al Wi-Fi—, ICE puede renominar la nueva ruta sin cortar la llamada.

Por qué Remio prefiere P2P a toda costa

Remio es una app de escritorio remoto, no una videollamada. El presupuesto de latencia es brutal. Para que una sesión se sienta como estar sentado frente a la máquina host, todo el proceso —captura, codificación, red, decodificación, renderizado— tiene que ser minúsculo: en una LAN cuesta unos 8 ms, y el resto es la cadencia de actualización de 60 Hz de tu propia pantalla (unos 16,7 ms por fotograma). Cada salto extra es un pecado.

En una conexión P2P directa por LAN, la parte de red de ese presupuesto es de unos 1 a 5 milisegundos de ida y vuelta. No hay relay; los bytes van directo de un dispositivo al otro. Con el canal de Remio esto suma unos 8 ms de procesamiento en LAN (medidos internamente; el resto es la cadencia de actualización de 60 Hz de tu propia pantalla): tu entrada llega antes de que se dibuje el siguiente fotograma. La máquina remota se siente indistinguible de una local.

En una conexión por relay TURN —incluso uno regional—, la parte de red salta a 30 a 80 milisegundos. La latencia total percibida por el usuario pasa a ser de 40 a 100 ms. Sigue siendo usable para la mayoría del trabajo, pero se nota en un arrastre rápido o una secuencia rápida de clics. El trackpad ya no se siente del todo tuyo.

Esa diferencia es la razón por la que nos esforzamos tanto en mantener las sesiones en P2P. La pila WebRTC de Remio reúne candidatos IPv4 e IPv6, habla con varios servidores STUN en paralelo y prefiere con agresividad las rutas directas durante la selección de pares de candidatos de ICE. Internamente incluso usamos el RTT medido de la conexión para clasificar la red: por debajo de 15 ms sabemos que es LAN, así que el codificador arranca alto y puede usar mucho más ancho de banda. Todo lo más lento se trata como WAN y se ajusta de forma más conservadora.

Y —esto es lo que los competidores suelen omitir en silencio— la conexión tiene cifrado de extremo a extremo sin importar la ruta. Tu pantalla nunca toca nuestros servidores, e incluso un relay TURN solo ve texto cifrado: las claves se negocian directamente entre los dos pares durante el apretón de manos, antes de que se mueva un solo píxel. Ya sea que los bytes fluyan por P2P o por TURN, ni el servidor de señalización de Remio ni el operador de TURN pueden leerlos. P2P solo significa que no hay ningún tercero en la ruta de los datos.

Cuando el relay es inevitable (y está bien)

A veces los dioses de la red dicen que no. NAT simétrico en ambos extremos, doble CGNAT en un operador celular con un proveedor estricto, un firewall corporativo que solo permite TLS saliente hacia proveedores de nube conocidos: son configuraciones reales y comunes. En esos casos la sesión simplemente tiene que pasar por un relay o no ocurre.

El respaldo TURN de Remio es Cloudflare Calls, que nos da una red global de relays cerca de la mayoría de los usuarios. Cuando ICE elige una ruta por relay, la experiencia pasa de «se siente local» a «se siente como Splashtop»: sigue siendo muy usable, pero se nota. La latencia añadida es de 30 a 80 ms con un relay regional; entre regiones puede llegar a 200 ms.

Lo importante: los datos siguen cifrados de extremo a extremo. Cloudflare ve paquetes UDP cifrados que van en un sentido y paquetes UDP cifrados que van en el otro. Puede contar bytes para facturar. No puede ver tu pantalla, tus pulsaciones ni nada del contenido de tu sesión. Tampoco hay un punto de descifrado de Remio, porque no hay nube de Remio en el canal: operamos el servicio TURN a través de Cloudflare y nunca tocamos las cargas.

Esta es la arquitectura que describe con más detalle nuestro documento técnico de seguridad. En resumen: P2P o relay, el modelo de amenazas es el mismo.

La salida de emergencia de IPv6

IPv6 tiene 340 sextillones de direcciones (3,4 × 1038): suficiente para darle su propia IP pública a cada grano de arena de la Tierra, y que sobren varios billones. En un mundo solo IPv6, el NAT es en gran medida innecesario. Dos dispositivos compatibles con IPv6 pueden simplemente enviarse paquetes a sus direcciones, y el único obstáculo es el firewall del host en cada extremo.

Si tienes IPv6 en casa y en tu operador celular, quizá hayas notado que algunas apps conectan más rápido cuando ambos extremos son IPv6: eso es porque todo el baile de «reunir candidatos, sondear pares» tiene menos obstáculos. No hay traducción NAT que descubrir, no se necesita viaje a STUN, solo direcciones directas.

Pero hay un detalle: en 2026 el despliegue global sigue incompleto. Muchos routers domésticos manejan mal IPv6 o no lo manejan. Muchas redes corporativas bloquean IPv6 entrante por defecto. Algunos operadores ofrecen IPv6 en el lado de radio pero hacen puente a IPv4 en otros lados. Las rutas puras de IPv6 a IPv6 existen, pero no se puede confiar en ellas como único mecanismo.

Así que Remio —como toda pila P2P seria— reúne candidatos IPv4 e IPv6 y deja que ICE los ponga a competir. Si existe una ruta IPv6 directa y funciona, normalmente gana en latencia. Si no, toma el relevo IPv4 con hole punching. Si ambos fallan, relay. El usuario nunca ve nada de esto; la conexión simplemente se establece.

Cómo saber qué ruta usa tu sesión

¿Quieres saber en qué ruta terminó tu sesión? El indicador de conexión de Remio muestra el tipo en lenguaje claro: «Directa» para P2P, «Relay» para TURN. El panel de estadísticas para desarrolladores expone todo el estado de WebRTC, incluidos los tipos de candidatos de la pareja nominada (host, srflx, relay) y el RTT medido.

Unas interpretaciones rápidas:

Si recurres sistemáticamente al relay incluso en casa, los sospechosos habituales son un módem del proveedor con NAT simétrico, CGNAT IPv4 en tu conexión doméstica (más común de lo que crees en revendedores de fibra) o un firewall excesivamente celoso que bloquea UDP entrante. Nuestra guía para reducir el lag del escritorio remoto repasa los culpables habituales, y la página de conexión directa por LAN es el camino rápido si ambos dispositivos están en tu red.

Cifras de rendimiento del mundo real

Juntando todo, estas son las cifras de latencia que medimos en producción en las distintas rutas que puede tomar una sesión de Remio:

Estas coinciden con las cifras de las pruebas de rendimiento de Remio y explican por qué fijamos el umbral LAN frente a WAN en 15 ms de RTT: separa con claridad las rutas directas de cualquier relay (30 ms mínimo) o ruta celular (40 ms mínimo), con muy pocos falsos positivos.

El NAT traversal es uno de esos temas donde los protocolos son simples por separado pero la combinatoria es retorcida. La mayoría de los usuarios nunca necesitará saber que existen ICE, STUN y TURN: solo experimentarán una app que conecta rápido desde cualquier lugar a cualquier lugar. Los protocolos hacen su trabajo cuando no los notas. Cuando sí los notas —una sesión tarda un instante de más, o «Directa» se convierte en «Relay»— ya tienes el modelo mental.

Para saber más sobre el canal nativo de Remio y las decisiones que convierten 1–5 ms de latencia de red en unos 8 ms de procesamiento (el resto es la cadencia de actualización de 60 Hz de tu propia pantalla), mira por qué lo nativo importa. Para el modelo de amenazas en las rutas por relay, mira el documento técnico de seguridad. O simplemente explora las funciones y descarga Remio para verlo funcionar.

✦Preguntas

Preguntas frecuentes

¿Qué es el NAT traversal?
El NAT traversal es el conjunto de técnicas que usa una app de igual a igual para establecer una conexión directa entre dos dispositivos que están cada uno detrás de un router doméstico o de oficina. Como los routers traducen muchas direcciones IP privadas a una IP pública (traducción de direcciones de red, o NAT), las conexiones entrantes se bloquean por defecto. El NAT traversal —principalmente ICE, STUN y TURN— descubre la dirección de cara al público de cada dispositivo, abre un camino temporal a través de ambos routers y recurre a un servidor relay solo si falla el hole punching directo.
¿Cómo funciona STUN?
STUN (Session Traversal Utilities for NAT) es un pequeño protocolo de petición y respuesta. El cliente envía un paquete UDP a un servidor STUN público, y el servidor responde con la IP y el puerto de origen que realmente vio en el cable, que es la dirección del cliente traducida por el NAT tal como la ve internet. El cliente luego anuncia esa dirección a su par por un canal de señalización, para que el par sepa adónde enviar paquetes. STUN en sí añade alrededor de un viaje de ida y vuelta de latencia durante el establecimiento de la conexión y cero sobrecarga después.
¿Cuál es la diferencia entre STUN y TURN?
STUN solo le dice a cada par su propia dirección pública para que puedan intentar una conexión directa. TURN sí retransmite el contenido a través de un servidor en la nube cuando no se puede establecer la conexión directa. STUN no añade prácticamente latencia ni costo de ancho de banda; TURN añade un salto, con un costo de aproximadamente 30 a 80 milisegundos de latencia en un relay regional, y consume ancho de banda del servidor. Una app P2P bien diseñada usa STUN primero y recurre a TURN solo cuando es necesario.
¿Por qué mi escritorio remoto recurre a un relay?
El hole punching directo de igual a igual falla cuando uno o ambos extremos están detrás de un NAT simétrico, un NAT de operador (común en redes celulares) o un firewall corporativo estricto que bloquea el flujo UDP necesario. En esos casos la app recurre a un relay TURN para que la conexión funcione igualmente. La sesión sigue cifrada de extremo a extremo —el relay solo ve bloques opacos cifrados—, pero añade de 30 a 80 milisegundos de latencia en un relay regional y hasta 200 milisegundos entre regiones.
¿Qué es ICE en WebRTC?
ICE (Interactive Connectivity Establishment) es el marco que combina todas las técnicas de descubrimiento de direcciones y las prueba en paralelo. Cada par reúne una lista de direcciones candidatas —red local (host), públicas mediante STUN (server-reflexive) y por relay TURN— y luego intercambia la lista con el otro lado. Las dos pilas envían paquetes de sondeo por cada pareja de candidatos a la vez, y gana la primera pareja que tenga éxito. Se prefieren los candidatos de mayor prioridad (host, luego server-reflexive, luego relay), por lo que se elige la ruta de menor latencia cuando está disponible.
¿IPv6 elimina la necesidad del NAT traversal?
En su mayor parte, sí: IPv6 le da a cada dispositivo una dirección pública enrutable, así que dos pares compatibles con IPv6 pueden conectarse directamente sin traducción. Pero en 2026 una gran parte de las redes domésticas y móviles siguen siendo solo IPv4 o de doble pila, y muchos firewalls bloquean IPv6 entrante por defecto. Por eso el NAT traversal sigue siendo necesario como respaldo, y la mayoría de las apps en producción reúnen candidatos IPv4 e IPv6 y dejan que ICE elija la ruta que conecte más rápido.
Ícono de la app Remio

Siente la ruta directa.

Remio pone a competir a cada candidato para encontrar la ruta de menor latencia a tu máquina: sin reenvío de puertos, sin VPN, con cifrado de extremo a extremo en P2P o en relay.

GratisSin cuentaEmparejado en 30 segundos