¿Cómo responde un servidor de Internet a una solicitud de una IP privada?

¿Cómo responde un servidor de Internet a una solicitud de una IP privada?

Estoy aprendiendo sobre IP públicas/privadas, reenvío de puertos y NAT, y todavía no veo la respuesta a una pregunta simple:

Supongamos que dos usuarios de la misma red se comunican con un único servidor fuera de su red (por ejemplo, mi esposa y yo enviamos solicitudes http a yahoo.com). El servidor ve a ambos usuarios como una única IP pública y, a menudo, como en este caso, se comunican en el mismo puerto. ¿Cómo enruta el enrutador los paquetes según las dos conexiones diferentes? ¿Hay alguna información de enrutamiento dentro del paquete más allá de ip/puerto? ¿Se mantiene alguna 'tabla de sesiones' en alguna parte? ¿Por quién y qué incluye exactamente?

Respuesta1

Dentro de una computadora, entre procesos

Primero veamos cómo unsolteroLa computadora distingue entre conexiones concurrentes.

La mayoría de los protocolos de transporte como TCP, UDP, SCTPusardosPuertos, origen y destino.– es decir, uno en cada extremo de la conexión. Es decir, paquetesnosimplemente camine "a través" de un puerto; en lugar de eso viajandepuerto Xapuerto Y.

EldestinoEl puerto suele ser bien conocido (80 para HTTP, 53 para DNS...) pero elfuenteEl puerto suele ser elegido aleatoriamente por el propio sistema operativo, lo que también garantiza que la combinación src/dst sea única.

Entonces, cuando su navegador realiza múltiples conexiones "al puerto 80 de Yahoo", todas ellas en realidad tienen diferentespuertos de origen, y el sistema operativo mantiene una tabla de sockets como:

PROCESS       PROTO  LOCAL                REMOTE            STATE
9894/firefox  tcp    192.168.6.175:39163  google.server:80  established
9894/firefox  tcp    192.168.6.175:52909  yahoo.server:80   established
17463/chrome  tcp    192.168.6.175:64981  yahoo.server:80   established
9894/firefox  udp    192.168.6.175:4984   8.8.8.8:53        --

Entonces, cuando el sistema operativo recibe un paquete TCP desde yahoo.server:80el puerto local 52909, puede asignarlo a la conexión específica realizada por Firefox.

Importante tener en cuenta que esto no tiene nada que ver con NAT.todavía, y sucede de la misma manera incluso si estás conectado directamente. (Sin embargo, NAT lo utilizará).

(Puede ver esta tabla usando netstat -n, o varias herramientas gráficas en Windows. A menudo, "local/remoto" está etiquetado como "origen/destino", aunque eso no es del todo exacto).


Dentro de una red NATed, entre computadoras

La respuesta a tu pregunta sobre NAT es muy similar, sólo que todo se hace a mayor escala.

El enrutador que realiza NAT mantiene una tabla de "estado" que contiene las direcciones y puertos internos y externos. Por ejemplo, si sus dos solicitudes HTTP utilizaron conexiones TCP separadas, es posible que se realice un seguimiento de ellas como:

PROTO   ORIG-SRC             ORIG-DST         REPLY-SRC        REPLY-DST
6/tcp   192.168.6.42:52909   yahoo.server:80  yahoo.server:80  your.public.ip.addr:52909
6/tcp   192.168.6.175:39163  yahoo.server:80  yahoo.server:80  your.public.ip.addr:39163
6/tcp   192.168.6.175:52909  yahoo.server:80  yahoo.server:80  your.public.ip.addr:28330
17/udp  192.168.6.175:4984   8.8.8.8:53       8.8.8.8:53       your.public.ip.addr:4984

Cuando el enrutador recibe un paquete de REPLY-SRC (Yahoo) dirigido a REPLY-DST (su dirección IP pública), sabe que elrealEl destino debe tomarse de la columna ORIG-SRC para deshacer la NAT.

(Si no hay ningún estado coincidente, se procesan las reglas de reenvío de puertos configuradas manualmente. Si aún no hay ninguna coincidencia, entonces el paquete estaba realmente destinado al enrutador).

Observe cómo la tabla de estado contienedireccionesypuertos, lo que permite distinguir varias conexiones al mismo servidor mediante la combinación de puertos. En mi ejemplo, dos computadoras usaron accidentalmente la misma combinación de puertos, por lo que los puertos de la segunda conexión también se tradujeron.

(De hecho, algunas NAT parecensoloen el puerto e ignorar completamente la dirección de origen; esto reduce el número de conexiones posibles, pero hace que sea mucho más fácil para los programas peer-to-peer realizar "perforaciones NAT".)

Dicho estado se mantiene incluso para protocolos sin conexión como UDP o ICMP, por lo que las entradas caducan después de un cierto intervalo de inactividad aunque no haya un paquete explícito de "conexión cerrada". (La tabla de estado es en realidad parte del firewall, por lo que incluso si no se realiza NAT, el enrutador aún podría usarla para distinguir entre conexiones "activas" y paquetes perdidos).

(Si su enrutador está basado en Linux conntrack -Lo cat /proc/net/nf_conntrackmuestra esta tabla. Para OpenBSD o pfSense, intente pfctl -s state).

información relacionada