(Para lo siguiente, ignoraré cualquier búsqueda de DNS o acción de capa dos, ya que esa no es la parte relevante para la historia de NAT).
Cualquier conexión TCP es una tupla de cuatro partes:
<source IP> <source port> <destination IP> <destination port>
En resumen: la IP de destino se usa para llevar el paquete a la máquina correcta, el puerto de destino se usa para llevar el paquete en esa máquina al programa / sesión correctos. La IP de origen se usa para saber dónde enviar las respuestas. Lo mismo ocurre con el puerto de origen. Cuando se envía una respuesta, el origen y el destino simplemente se intercambian.
Comencemos con dos computadoras sin NAT:
- La computadora tiene IP
1.1.1.1
- El servidor web tiene IP
3.3.3.3
- El puerto estándar para HTTP es
80
Cuando una computadora solicita una página web, primero seleccionará un número de puerto aleatorio no utilizado del rango aleatorio (1024-65535). Vamos a escoger 2345
. Entonces sucederá la siguiente secuencia: la computadora envía su paquete con: IP de 1.1.1.1
origen 2345
, puerto de origen , IP de 3.3.3.3
destino, puerto de destino 80
. Los paquetes llegan al servidor web, ve su propia IP y puerto 80
, por lo que sabe que esta es una solicitud de una página web. El servidor web luego envía la página web nuevamente en paquetes con IP de 3.3.3.3
origen, puerto de origen 80, IP de 1.1.1.1
destino, puerto de destino 2345
. La computadora recibe estos paquetes y sabe cuál es la página web solicitada debido al número de puerto 2345
.
Estas combinaciones de puertos a menudo se escriben como tales: 1.1.1.1:2345
y 3.3.3.3:80
.
Ahora, la cantidad de computadoras en Internet supera con creces la cantidad de direcciones IPv4 disponibles. Para preservar el espacio de direcciones, se introdujo un conjunto de rangos de direcciones privadas, que se pueden usar libremente para compartir direcciones. Estos rangese se denominan RFC1918 y son los siguientes:
- 192.168.0.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Estas direcciones no se encuentran en ninguna parte de las tablas de enrutamiento de Internet, por lo que si envía un paquete con un destino en estos rangos en la red troncal de Internet, simplemente se eliminarán. Esto se debe a que millones de personas usan las mismas direcciones. Estas direcciones deben traducirse a algo útil para Internet. Aquí es donde entra la traducción de direcciones de red:
Tenemos dos computadoras:
- A:
192.168.0.1
y B:192.168.0.2
- Su puerta de enlace tiene una IP pública de
1.1.1.1
.
- Mantenemos el mismo servidor web.
- Ambas computadoras quieren la misma página web del mismo servidor.
Primero, ambas computadoras seleccionan un puerto aleatorio: digamos: 192.168.0.1:2345
y 192.168.0.2:5432
.
La computadora A envía su paquete con origen 192.168.0.1:2345
y destino 3.3.3.3:80
. La puerta de enlace traduce este paquete al 1.1.1.1:2345
destino de origen 3.3.3.3:80
y recuerda que cualquier respuesta a esta combinación va a 192.168.0.1
. Entonces, cuando recibe una respuesta con origen 3.3.3.3:80
y destino 1.1.1.1:2345
, lo traducirá a origen 3.3.3.3:80
y destino 192.168.0.1:2345
y enviará el paquete.
La computadora B envía su paquete con origen 192.168.0.2:5432
y destino 3.3.3.3:80
. La puerta de enlace traduce este paquete al 1.1.1.1:5432
destino de origen 3.3.3.3:80
y recuerda que cualquier respuesta a esta combinación va a 192.168.0.2
. Entonces, cuando recibe una respuesta con origen 3.3.3.3:80
y destino 1.1.1.1:5432
, lo traducirá a origen 3.3.3.3:80
y destino 192.168.0.2:5432
y enviará el paquete.
Si ambas computadoras seleccionan el mismo número de puerto de origen, la puerta de enlace simplemente elegirá otro número de puerto de origen aleatorio gratuito y también recordará traducir el número de puerto. Esto se refiere a veces como PAT (traducción de dirección de puerto). Esto es básicamente un subconjunto de NAT.
Hay varias implementaciones para todo esto. Es posible que la puerta de enlace solo recuerde "La computadora X usó el puerto de origen Y" y reenvíe cualquier cosa con el puerto Y a la computadora X. Puede recordar que la Computadora X usó el puerto de origen Y y el destino Z "y solo reenvió cualquier cosa desde el puerto Z al puerto Y de regreso a computadora X. O existe la opción de que recuerde toda la tupla y solo envíe tráfico a la computadora X que coincida con la fuente y el puerto de origen / destino.