lunes, 12 de septiembre de 2011

NAT: Traducción de Direcciones de Red

NAT: Traducción de Direcciones de Red
La idea básica que hay detrás de NAT es traducir las IPs privadas de la red en una IP publica para que la red pueda enviar paquetes al exterior; y traducir luego esa IP publica, de nuevo a la IP privada del pc que envió el paquete, para que pueda recibirlo una vez llega la respuesta. Con un ejemplo lo veremos mejor. Imaginemos que tenemos nuestra siguiente red:
Podría ser la típica red casera en la que tenemos un par de PCs que salen a Internet a través del router. Cada PC tiene asignada una IP privada, y el router tiene su IP privada (puerta de enlace) y su IP pública (que es nuestra IP de Internet).
Cuando uno de los PCs de la red local quiere enviar un paquete a Internet, se lo envía al router (o a la puerta de enlace o gateway), y

DNAT: Destination-NAT
Hasta ahora hemos visto como actúa el software de NAT para permitir que un PC de una red privada pueda acceder a Internet y recibir respuestas. El mecanismo que utiliza NAT para las asociaciones entre IP pública y IP privada es una tabla (tabla de NAT) en la que guarda una entrada por cada conexión. Cuando un host de la red local inicia una conexión hacia el exterior, el software de NAT asigna una entrada en la tabla, para que a partir de ahora, todo lo que llegue perteneciente a esa conexión sepa traducirlo hacia la IP privada que inició la conexión.
Pero ¿qué pasa si la conexión se inicia desde el exterior? Por ejemplo, si montamos en nuestra red local un servidor web, lo que queremos es que se puedan iniciar conexiones hacia él. Para poder hacer esto se utiliza DNAT (Destination-NAT).
Cuando iniciábamos una conexión desde la red local, se creaba automáticamente una entrada en la tabla de NAT para que todo lo que perteneciera a esa conexión fuera dirigido hacia el PC correspondiente. Pero si la conexión se inicia desde fuera ¿como y cuando se crea esa entrada en la tabla de NAT? La respuesta es que si queremos permitir conexiones desde el exterior a un PC de nuestra red local, hemos de añadir una entrada fija en la tabla de NAT, indicando que todo el tráfico que llegue que vaya a determinado puerto, sea dirigido al PC en cuestión. El puerto es el único elemento que tenemos para “distinguir” conexiones, ya que todo llegará a la IP del router, pero tendrán un puerto de destino según sea una conexión u otra. Así que, en nuestro ejemplo, deberíamos crear una entrada fija en la tabla de NAT en la que indicáramos que lo que llegue al puerto 80 (web) sea dirigido al PC en el que corre el servidor web.
Esto es lo que se conoce habitualmente como “abrir puertos” en el router. Al abrir puertos, simplemente estamos añadiendo una entrada a la tabla de NAT del router para que sepa hacer la traducción y sepa a qué PC enviar los paquetes. Ya que desde el exterior, aunque nuestra red tenga varios PCs, se verá como si sólo fuera uno (solo se conoce la IP del router, éste lo traduce todo) y necesitamos que éste router al que le llega todo el tráfico sepa a quién ha de entregárselo.
Conclusión
Como se puede apreciar NAT es un mecanismo muy potente que nos permite crear redes locales con gran flexibilidad, pero también tiene sus inconvenientes. Muchas aplicaciones podrían no funcionar detrás de NAT. Pero eso es quizá un tema un poco más avanzado que queda fuera del objetivo de este tutorial. De todos modos las funcionalidades comentadas de NAT (que son el SNAT y el DNAT) son las más usuales y importantes, y comprenderlas es suficiente para tener una idea bastante buena de qué es NAT y qué es lo que pasa en los routers/gateways que dan salida a nuestra red local.