¿Cómo comparte NAT una dirección IPv4 pública en varias direcciones IPv4 privadas? [Cerrado]

10

Creo que es una pregunta muy clásica, pero, aunque tengo algunos antecedentes, ya no tengo suficiente vocabulario para buscar y comprender correctamente en la Web.

Digamos que tengo una red doméstica con 192.168.0.1 (IP.1) y 192.168.0.2 (IP.2) y ambos estamos jugando a Counter Strike golpeando exactamente el mismo servidor externo.

¿Cómo sabe mi enrutador doméstico qué paquete irá a IP.1? A menudo leo cosas con direcciones NAT y xxx.xxx/y. ** ¿Dónde está escrita la parte / y en la pila TCP / IP?

¿Necesitamos absolutamente NAT para eso? Lo que he entendido del artículo de Wikipedia es que NAT está hecho para optimizar las direcciones IP, cuando algunas computadoras están apagadas. ¿También permite conectar 5 dispositivos con solo 1 IP pública?

Nicolas Zozol
fuente
One-to-Many debería responder sus preguntas. Además, las preguntas sobre redes domésticas y educación básica no son las más adecuadas para este sitio.
Craig Constantine

Respuestas:

14

(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.1origen 2345, puerto de origen , IP de 3.3.3.3destino, 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.3origen, puerto de origen 80, IP de 1.1.1.1destino, 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:2345y 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.1y 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:2345y 192.168.0.2:5432.

La computadora A envía su paquete con origen 192.168.0.1:2345y destino 3.3.3.3:80. La puerta de enlace traduce este paquete al 1.1.1.1:2345destino de origen 3.3.3.3:80y 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:80y destino 1.1.1.1:2345, lo traducirá a origen 3.3.3.3:80y destino 192.168.0.1:2345y enviará el paquete.

La computadora B envía su paquete con origen 192.168.0.2:5432y destino 3.3.3.3:80. La puerta de enlace traduce este paquete al 1.1.1.1:5432destino de origen 3.3.3.3:80y 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:80y destino 1.1.1.1:5432, lo traducirá a origen 3.3.3.3:80y destino 192.168.0.2:5432y 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.

JelmerS
fuente
Gracias. Pensé que cualquier cliente enviaría con su puerto 80 a otro puerto 80. Creo que muchos no especialistas creen lo mismo.
Nicolas Zozol