NAT y PAT: muchos equipos, una sola IP pública
En tu casa puede haber treinta equipos conectados, pero tu operador te da una sola IP pública. Y aun así todos navegan a la vez sin pisarse. ¿Cómo? Gracias a la NAT.
La NAT es de esas cosas que funcionan solas durante años y que, el día que quieres montar un servidor en casa y que se vea desde fuera, se convierten en tu peor enemigo. Así que vale la pena entenderla bien.
Qué es la NAT
Sección titulada «Qué es la NAT»La NAT (Network Address Translation) es lo que hace el router cuando un paquete pasa de tu LAN a internet: cambia la IP privada de origen por su IP pública. Cuando vuelve la respuesta, hace el cambio al revés y se la entrega al equipo correcto.
Nació a mediados de los 90 como un parche temporal porque se estaban acabando las IPv4. El parche tuvo tanto éxito que treinta años después sigue en todas las casas del mundo.
PAT: el truco de los puertos
Sección titulada «PAT: el truco de los puertos»Si solo se cambiara la IP, el router no sabría a qué equipo devolver cada respuesta. El truco está en que también cambia el puerto de origen y lo apunta en una tabla. Esto se llama PAT (Port Address Translation), y es lo que hacen todos los routers domésticos, aunque en la configuración lo llamen simplemente “NAT”.
LAN Router (NAT/PAT) Internet IP pública 203.0.113.45
PC 192.168.1.20:51000 ──► 203.0.113.45:40001 ──► 198.51.100.10:443Móvil 192.168.1.34:51000 ──► 203.0.113.45:40002 ──► 198.51.100.10:443Y la tabla de traducciones que mantiene el router queda así:
| Interno | Externo (lo que ve internet) | Destino |
|---|---|---|
| 192.168.1.20:51000 | 203.0.113.45:40001 | 198.51.100.10:443 |
| 192.168.1.34:51000 | 203.0.113.45:40002 | 198.51.100.10:443 |
Cuando llega una respuesta al puerto 40002, el router mira la tabla y sabe que es para el móvil. Fíjate en que los dos equipos usaban el mismo puerto de origen, el 51000. No pasa nada: el router les asigna puertos externos distintos.
Tipos de NAT
Sección titulada «Tipos de NAT»- NAT de origen (SNAT / masquerade) → es la de arriba: cambia el origen de lo que sale de tu red. Es la que te da internet en casa. En Linux, con IP pública dinámica, se le llama masquerade.
- NAT de destino (DNAT / port forwarding) → cambia el destino de lo que entra. Es lo que haces al “abrir un puerto”: “todo lo que llegue al puerto 443 de mi IP pública, mándalo al servidor
192.168.1.10”. - NAT estática (1:1) → una IP pública fija para un único equipo interno. Es más propia de empresas que tienen varias IPs públicas.
Por qué hay que “abrir puertos”
Sección titulada «Por qué hay que “abrir puertos”»Con la NAT normal, la tabla solo tiene entradas para conexiones que ha empezado alguien de dentro. Si alguien de fuera intenta conectarse a tu IP pública, el router no tiene ninguna entrada en la tabla, no sabe a qué equipo mandarlo y lo descarta.
Por eso, si quieres que tu servidor se vea desde internet, tienes que crear una regla de port forwarding a mano. O dejar que un programa la cree solo con UPnP, que es cómodo pero bastante peligroso, porque cualquier programa de tu red puede abrirse puertos sin preguntarte.
Doble NAT y CGNAT: cuando la cosa se complica
Sección titulada «Doble NAT y CGNAT: cuando la cosa se complica»Doble NAT
Sección titulada «Doble NAT»Pasa cuando hay dos routers haciendo NAT en cadena: el del operador y otro tuyo detrás. Tu tráfico se traduce dos veces y, para abrir un puerto, tienes que hacerlo en los dos routers: en el del operador hacia tu router, y en tu router hacia el servidor.
Además, a algunas cosas les sienta fatal: consolas (“NAT estricta”), llamadas VoIP, algunas VPN…
Para quitarlo hay tres opciones, de mejor a peor:
- Poner el router del operador en modo bridge, para que solo haga de módem y tu router reciba la IP pública directamente.
- Usar la DMZ del router del operador apuntando a tu router: todo lo que llegue se le reenvía.
- Abrir los puertos en los dos routers y vivir con ello.
Con el CGNAT (Carrier-Grade NAT), el que hace NAT es el operador: tu router no recibe una IP pública, sino una del rango 100.64.0.0/10, compartida con otros clientes. Lo usan sobre todo algunos operadores de fibra baratos y de 4G/5G.
¿El problema? Puedes abrir todos los puertos que quieras en tu router, que desde fuera nunca se va a llegar, porque la IP pública no es tuya. Para saber si estás detrás de CGNAT, mira la IP WAN de tu router: si empieza por 100.64 a 100.127, o no coincide con la que te dice una web de “¿cuál es mi IP?”, estás detrás de CGNAT.
Las soluciones son pedir al operador una IP pública (a veces es gratis, a veces cuesta un poco al mes) o usar túneles que salen de tu red hacia fuera, como Cloudflare Tunnel.
En mi caso: abrir puertos dos veces
Sección titulada «En mi caso: abrir puertos dos veces»En el negocio que comentaba en Tipos de red había justo esto: el router del operador y, detrás, los routers de cada red. Doble NAT de libro. Publicar un servicio así obliga a abrir el puerto en el router del operador, después en el router de detrás, y a tener fija la IP interna de cada salto.
Por eso lo resolví de otra forma: en vez de abrir puertos, saqué los servicios con túneles que salen hacia fuera, como Cloudflare Tunnel. Como la conexión la empieza mi servidor, la NAT no molesta y no hace falta abrir puertos en el router.
La NAT no es un firewall
Sección titulada «La NAT no es un firewall»Esto se oye mucho: “estoy detrás de NAT, así que estoy protegido”. Es verdad que, como efecto secundario, la NAT descarta lo que entra sin una entrada en la tabla. Pero:
- No se diseñó para seguridad → no filtra lo que sale, no inspecciona nada y no registra nada.
- UPnP la abre sola → cualquier programa o dispositivo puede abrirse un puerto sin que te enteres.
- Con IPv6 normalmente no hay NAT → cada equipo tiene su IP pública, y lo único que te protege es el firewall del router.
La seguridad la da el firewall. La NAT solo traduce direcciones.
No solo en el router: Docker también hace NAT
Sección titulada «No solo en el router: Docker también hace NAT»Si usas Docker, ya estás usando NAT sin saberlo:
- Los contenedores en la red
bridgetienen IPs privadas (172.17.0.x) y salen a internet con masquerade a través de la IP del host. - Cuando publicas un puerto con
-p 8080:80, Docker crea una regla de DNAT: lo que llega al puerto 8080 del host se manda al puerto 80 del contenedor.
Es exactamente lo mismo que hace el router de casa, pero dentro de tu servidor.
Errores típicos
Sección titulada «Errores típicos»- Abrir un puerto hacia una IP que luego cambia → el equipo de destino necesita una IP fija o una reserva DHCP (lo vimos en DHCP y DNS).
- Abrir el puerto en tu router y no en el del operador → doble NAT. Hay que abrirlo en los dos o quitar uno de en medio.
- Pelearse con los puertos estando detrás de CGNAT → no va a funcionar nunca. Primero comprueba la IP WAN de tu router.
- Probar tu servicio desde dentro de tu propia red usando la IP pública → muchos routers no lo permiten (NAT loopback o hairpin NAT). Pruébalo desde fuera, por ejemplo con los datos del móvil.
- Dejar UPnP activado “porque así funciona la consola” → también le funciona a cualquier malware que tengas en la red.
Resumen
Sección titulada «Resumen»- NAT → cambia la IP privada por la pública al salir a internet. PAT → además cambia el puerto, para que muchos equipos compartan una IP.
- SNAT/masquerade para lo que sale, DNAT/port forwarding para lo que entra (“abrir un puerto”).
- Doble NAT → dos routers traduciendo. CGNAT → la NAT la hace el operador y no puedes abrir puertos.
- Los túneles que salen hacia fuera (como Cloudflare Tunnel) evitan tener que abrir puertos.
- La NAT no es un firewall.
Siguiente: Puertos TCP y UDP Relacionado: DHCP y DNS, Tipos de red, Índice de Redes