0

NAT (Network Address Translation)

Hola a tod@s.

En este post vamos a explicar la técnica NAT y los distintos tipos de NAT, que consiste en traducir direcciones IP, es decir, consiste en manipular los paquetes IPs y cambiar las direcciones IPs existentes por otras IPs.

NAT1

En la imagen en paquete IP que entra en el router NAT tiene un origen IP y un destino IP, en este ejemplo el router manipula la IP de origen y la sustituye por otra enviando el paquete al exterior.

Aunque hay un tipo de NAT que es el más habitual se puede realizar cambios en origen, destino, puertos, muchas IPs a 1 IP, una a una, etc…

NAT Origen

NAT en Origen o Source NAT consiste en cambiar la IP de origen del paquete por una IP de origen diferente.

NAT2

NAT Destino

NAT en Destino o Destination NAT consiste en cambiar la IP de destino del paquete por una IP de destino diferente.

NAT3

La NAT origen y la NAT destino están asociadas porque cuando se hace una traducción NAT de origen, cambia el origen o remite de los datos, por tanto, cuando se reciba la respuesta a estos datos habrá que hacer el paso contrario, NAT destino, cambiar el destino (que fue el origen de la solicitud), es decir, deshace el cambio que se realizó al iniciar la comunicación para que el dispositivo que solicitó los datos reciba la respuesta.

Tabla NAT

El dispositivo que realiza la traducción de direcciones lleva un control de las mismas en una tabla denominada tabla NAT. En esta tabla están anotadas las traducciones que se realizan, la finalidad principal de la tabla es saber, cuando llega una respuesta, a que dispositivo de origen corresponde enviarla.

En una tabla NAT se pueden incluir las siguientes direcciones:

  • Dirección local interna (inside local): Corresponde a la dirección local (normalmente privada) del dispositivo que origina la comunicación.
  • Dirección global interna (inside global): Corresponde a la dirección externa (normalmente pública) que se asigna al dispositivo interno cuando sale del router NAT.
  • Dirección global externa (outside global): Es la dirección IP externa (normalmente pública) de destino.
  • Dirección local externa (outside local): Es la dirección local del dispositivo destino en la red externa.

Gráficamente, y referidas al router A, serían:

NAT4

NAT5

Tipos de NAT

A la hora de manipular las direcciones IP y puertos existen diferentes técnicas dependiendo del cambio o traducción que se realice.

NAT Estática

Este tipo de NAT hace una traducción uno a uno, es decir, sustituye una IP local interna por una IP global interna. Se denomina estática porque la traducción que se realiza es siempre la misma.

Podemos deducir de la definición anterior que si queremos que todos los dispositivos locales tengan acceso a internet necesitaremos tener el mismo número de IP locales que globales porque cada IP local usará una IP global.

Para configurar este tipo de NAT es necesario indicar en el router la traducción que se desea hacer e indicar que interface es la que apunta a la red privada y que interface apunta a la red pública.

Ejemplo de NAT Estática

NAT6

El router realiza siempre la traducción 172.16.0.10 a 2.2.2.2 en ambos sentido (SNAT, DNAT), es decir, si un paquete llega del exterior a 2.2.2.2 traduce su destino a 172.16.0.10, si un paquete sale de 172.16.0.10 al exterior traduce el origen de 172.16.0.10 a 2.2.2.2 y lo envía. La tabla NAT tendría una entrada fija.

NAT7

¿Cómo visitaría el PC externo la web alojada en el Servidor?

En una aplicación navegador se introduce la web http://2.2.2.2, no tiene sentido indicar la IP 172.16.0.10 porque es privada y porque de cara al exterior no existe.

¿Qué entrada se producirá en la tabla NAT?

NAT8

Se producirá una entrada:

  • Dinámica, a medida que llegan paquetes externos o salen paquetes internos se anota la traducción para poder en un futuro deshacer la traducción.
  • TCP, es el protocolo nivel transporte que utiliza el protocolo HTTP
  • IP Local interna, se hace la traducción indicada como fija 2.2.2.2 Global es 172.16.0.10 Local
  • Puerto local interno 80, es el puerto TCP en que escuchan todas las páginas web habitualmente, es decir, es lo mismo poner en el navegador http://2.2.2.2 que http://2.2.2.2:80 , no se traducen puertos en la NAT estática
  • Global externa, pues la IP del PC y el puerto asociado a la aplicación navegador (se ha puesto 1030 como podría haber sido otro puerto cliente, es decir, este puerto suele cambiar dependiendo muchos factores)
  • Local externa, el router NAT no puede saber si el PC tiene directamente una IP pública o está detrás de un router NAT (que es lo más habitual), solo sabe que le llega una petición de la IP 11.11.11.11, no sabe que dispositivo hay realmente en esa IP.

¿A qué dirección responde el servidor web?

El servidor web recibe una petición al puerto 80 (puerto en el que escucha el servicio web: apache, IIS, etc.) desde la IP 11.11.11.11 puerto 1030, por tanto, responde a esta dirección.

Cuando el paquete llegue al router NAT con remite 172.16.0.10 éste hará la traducción contraria y enviará el paquete a 11.11.11.11:1030

Los comandos para configurar esta NAT estática en un router Cisco serían, suponiendo que la interface pública es Gi0/0 y la interface privada Gi0/1:

RouterNAT>enable

RouterNAT#configure terminal

RouterNAT(config)# ip nat inside source static 172.16.0.10 2.2.2.2

RouterNAT(config)# interface gi0/0

RouterNAT(config-if)# ip nat outside

RouterNAT(config-if)# exit

RouterNAT(config)# interface gi0/1

RouterNAT(config-if)# ip nat inside

NAT Dinámica

Este tipo de NAT hace una traducción de varios a varios, es decir, sustituye varias IPs locales internas por varias IPs globales internas. Normalmente suele ser muchos a pocos, es decir, tenemos múltiples dispositivos privados que comparten varias IPs públicas.

A medida que los dispositivos privados van enviando paquetes al exterior se le van asignando IPs públicas, hasta que se agotan, es decir, el límite de conexiones simultáneas a internet viene determinado por número de IPs públicas de las que se dispone. Cuando un dispositivo privado libera la comunicación queda disponible la IP pública que tuviera asignada.

Para configurar esta NAT hay que indicar en el router la interface que apunta a la red privada, la interface que apunta a la red pública y cuales son las IPs privadas y públicas que vamos a traducir.

 

Ejemplo de NAT dinámica (sin sobrecarga)

NAT9

En este ejemplo hay 3 PCs que comparten 2 IPs públicas (1.1.1.1 y 1.1.1.2), es decir, solo dos PCs podrán estar conectados a internet simultáneamente.

En la tabla NAT no hay ninguna configuración fija.

¿Qué sucede si el PC A visita la web 2.2.2.2?

El router le asignará una IP pública disponible (supongamos 1.1.1.1)

NAT10

¿Qué sucede si el PC A visita de nuevo la web 2.2.2.2 desde otra ventana de navegador?

El router traducirá la misma asignación de IP que anteriormente

NAT11

Dos aplicaciones en ejecución en un mismo PC son dos puertos TCP diferentes. Si no fueran puertos diferentes cuando llegue una respuesta al PC el sistema no sabría a qué navegador corresponde, pero al tener puertos diferentes el sistema sabe a qué ventana de navegador va dirigida la respuesta.

En cambio el puerto destino es el mismo, la aplicación servidor (apache, IIS, etc.) forma una cola con las peticiones web que recibe en una caché y las va atendiendo una a una.

¿Qué sucede si el PC B visita la web 2.2.2.2?

El router le asignará una IP pública disponible (solo queda 1.1.1.2)

NAT12

¿Qué sucede si el PC C visita la web 2.2.2.2?

El router no le puede asignar ninguna IP pública porque todas están en uso.

El navegador del PC dará un error cuando se exceda el tiempo de espera predeterminado.

El usuario del PC C debe esperar hasta que se libere una de las 2 IPs públicas para poder acceder a internet.

Los comandos para configurar esta NAT dinámica sin sobrecarga en un router Cisco serían, suponiendo que la interface pública es Gi0/0 y la interface privada Gi0/1:

RouterNAT>enable

RouterNAT#configure terminal

RouterNAT(config)# ip access-list standard IP_INTERNAS

RouterNAT(config-std-nacl)# permit 192.168.0.0 0.0.0.255

RouterNAT(config-std-nacl)# exit

RouterNAT(config)#ip nat pool IP_EXTERNAS 1.1.1.1 1.1.1.2 netmask 255.255.255.252

RouterNAT(config)# ip nat inside source list IP_INTERNAS pool IP_EXTERNAS

RouterNAT(config)# interface gi0/0

RouterNAT(config-if)# ip nat outside

RouterNAT(config-if)# exit

RouterNAT(config)# interface gi0/1

RouterNAT(config-if)# ip nat inside

NAT Dinámica con sobrecarga (PAT)

Este es la NAT más implementada, de hecho, los routers domésticos la suelen traer configurada de fábrica.

La NAT dinámica con sobrecarga es una traducción de varios a varios, al igual que la NAT dinámica que se describió anteriormente, la diferencia está en que esta NAT también traduce los puertos TCP/UDP, por esta razón se denomina también PAT (Port Address Translation). Esta traducción de direcciones IPs y puertos combinada le permite más posibilidades de traducción, con esta traducción de puertos adicional se soluciona el principal inconveniente de la NAT dinámica el agotamiento de IPs públicas.

Como se comentó anteriormente es muy habitual que se utilice la denominación NAT para este tipo concreto de traducción.

Ejemplo de NAT dinámica con sobrecarga o PAT

NAT13

Este es el típico funcionamiento de un router-DSL, una IP pública (1.1.1.1) que se comparte entre varios equipos (PC A, B, C) con IPs privadas.

¿Qué sucede si el PC A visita la web 2.2.2.2?

El router hará la traducción de IP privada por pública, no hará traducción de puertos porque no es necesaria la tabla, no hay puertos públicos asignados.

NAT14

¿Qué sucede si el PC A visita la web 3.3.3.3 desde otra ventana de navegador?

El router traducirá de nuevo la IP privada por la pública y no hará traducción de puertos porque el puerto que utiliza el nuevo navegador es diferente (en un mismo PC no puede haber dos aplicaciones que usen el mismo puerto).

NAT15

¿Qué sucede si el PC B visita la web 2.2.2.2 y el navegador utiliza el puerto 1300?

El router traducirá de nuevo la IP privada por la pública, pero en este caso tendrá que traducir el puerto porque la combinación 1.1.1.1:1300 corresponde, en el exterior, al primer navegador del PC A.

NAT16

¿Qué sucede si el PC C visita la web 2.2.2.2 y el navegador utiliza el puerto 1300?

El router traducirá de nuevo la IP privada por la pública, además tendrá que traducir el puerto porque la combinación 1.1.1.1:1300 ya está en uso.

NAT17

Llega una respuesta de 2.2.2.2, puerto 80 a la IP 1.1.1.1 ¿a qué PC corresponde?

Pues habrá que consultar a que puerto destino llega la respuesta, si el puerto destino de la respuesta es 1300 y 1301 corresponde al PC A, si es 1302 corresponde al PC B y si es 1303 corresponde al PC C.

Los comandos para configurar esta NAT dinámica con sobrecarga en un router Cisco serían, suponiendo que la interface pública es Gi0/0 y la interface privada Gi0/1:

RouterNAT>enable

RouterNAT#configure terminal

RouterNAT(config)# ip access-list standard IP_INTERNAS

RouterNAT(config-std-nacl)# permit 192.168.0.0 0.0.0.255

RouterNAT(config-std-nacl)# exit

RouterNAT(config)#ip nat pool IP_EXTERNAS 1.1.1.1 1.1.1.1 netmask 255.255.255.252

RouterNAT(config)# ip nat inside source list IP_INTERNAS pool IP_EXTERNAS overload

RouterNAT(config)# interface gi0/0

RouterNAT(config-if)# ip nat outside

RouterNAT(config-if)# exit

RouterNAT(config)# interface gi0/1

RouterNAT(config-if)# ip nat inside

NAT inversa (o Abrir puertos)

La expresión “abrir puertos” tiene muchas acepciones, en principio el uso correcto es el equivalente a “escuchar por un puerto”, es decir, ejecutar aplicaciones que usan un determinado puerto y tener ese puerto activo y listo para para enviar o recibir datos.

Otro uso de la expresión “abrir puertos”, en un firewall (encargado de permitir, denegar y custodiar las conexiones), conceder permisos para que cierto puerto destino u origen pueda salir o entrar de la red local.

Pero en cuanto al tema que tratamos, la traducción de direcciones y puertos, hablamos de “abrir puertos”, o NAT inversa (Port Forwarding o Virtual Server en muchos menús de router domésticos) para permitir entrar en una LAN desde Internet, sin que previamente se haya producido una petición desde la LAN.

Los paquetes que entran en LAN corresponden a respuestas de peticiones previas realizadas desde dentro de la LAN. Para entrar en LAN sin que haya una solicitud previa es necesario “abrir los puertos”, es decir, hay que incluir una traducción en la tabla NAT fija, no dinámica producida por un paquete que ha salido.

La finalidad de abrir los puertos es tener servicios (servidor web, servidor base de datos, etc.) instalados en una red local y que se puedan acceder desde cualquier lugar exterior.

Ejemplo de NAT inversa o apertura de puertos

En el esquema hay un servidor web en una red local, para acceder a este servidor web desde el exterior solo es necesario poner en el navegador del equipo externo http://1.1.1.1

NAT18

¿Qué contenido tendrá la tabla NAT antes de abrir el puerto?

Antes de abrir el puerto la tabla NAT estará vacía, o si algún equipo local ha enviado alguna petición al exterior el router habrá anotado esa salida, es decir, anotaciones dinámicas asociadas a las salidas de datos al exterior.

¿Qué contenido tendrá la tabla NAT después de abrir el puerto?

La tabla NAT tendrá una entrada fija, indicando que todas las peticiones con destino al puerto 80 (servicio web) la atenderá el servidor www

NAT19

Como se puede observar no hay datos relativos a la IP externa, la razón es que las peticiones pueden venir de cualquier IP externa. Cuando llegue un paquete con destino a 1.1.1.1:80, el router aplicará la traducción fija y lo enviará a 192.168.0.100:80

¿Podríamos tener dos servidores web funcionado en la red local?

Pues sí, pero el puerto 80 está abierto hacia 192.168.0.100, es decir, el puerto 80 está asociado al equipo 192.168.0.100, por tanto, será necesario utilizar otro puerto, por ejemplo el 81 para el segundo servidor.

NAT20

Cuando un paquete llegue al router con destino puerto 81, el router aplicará la segunda traducción y enviará al puerto 80 del equipo 192.168.0.200 el paquete. Para visitar esta segunda web desde el exterior habrá que indicar http://1.1.1.1:81

Los comandos para configurar esta NAT inversa en un router Cisco serían:

RouterNAT(config)#ip nat inside source static tcp 192.168.0.100 80 1.1.1.1 80

RouterNAT(config)#ip nat inside source static tcp 192.168.0.200 80 1.1.1.1 81

 

Dar las gracias a Manuel Castaño Guillén por este post, profesor de networking en Extremadura, y que sabe un “rato” de esto.

Saludos y espero que os sea de ayuda 😉

ragasys

Técnico Superior STI

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *