
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:80
el 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 -L
o cat /proc/net/nf_conntrack
muestra esta tabla. Para OpenBSD o pfSense, intente pfctl -s state
).