Técnica de conexión de traducción de direcciones de red
La travesía TCP NAT y la perforación de agujeros TCP (a veces NAT punch-through ) en redes informáticas se produce cuando dos hosts que se encuentran detrás de una traducción de direcciones de red (NAT) intentan conectarse entre sí con conexiones TCP salientes. Este escenario es particularmente importante en el caso de las comunicaciones entre pares , como la voz sobre IP (VoIP), el uso compartido de archivos, las teleconferencias, los sistemas de chat y aplicaciones similares.
La perforación de agujeros TCP es una técnica de cruce de NAT utilizada experimentalmente para establecer una conexión TCP entre dos pares en Internet detrás de dispositivos NAT. El cruce de NAT es un término general para las técnicas que establecen y mantienen conexiones TCP/IP y/o de red TCP atravesando puertas de enlace NAT.
Terminología
A continuación, los términos host, cliente y peer se utilizan casi indistintamente.
- punto final local , punto final interno
- la IP local:puerto como lo ve localmente el host y la parte interna del NAT.
- punto final público , punto final externo
- la IP externa: puerto mapeado por el NAT, como lo ve la red y la parte externa del NAT.
- punto final remoto
- la IP:puerto del otro par tal como lo ve la red, o las partes externas de ambos NAT.
Descripción
La travesía de NAT, a través de la perforación de agujeros TCP, establece conexiones TCP bidireccionales entre hosts de Internet en redes privadas que utilizan NAT. No funciona con todos los tipos de NAT, ya que su comportamiento no está estandarizado. Cuando dos hosts se conectan entre sí en TCP, ambos a través de conexiones salientes, se encuentran en el caso de "apertura simultánea de TCP" del diagrama de máquina de estados TCP. [1]
Dibujo de red
Tipos de NAT
La disponibilidad de la perforación de agujeros TCP depende del tipo de asignación de puerto de computadora que utiliza el NAT. Para que dos pares detrás de un NAT se conecten entre sí a través de TCP abierto simultáneo [ aclarar ] , necesitan saber un poco el uno del otro. Una cosa que absolutamente necesitan saber es la "ubicación" del otro par, o el punto final remoto. El punto final remoto son los datos de la dirección IP y un puerto al que se conectará el par. Entonces, cuando dos pares, A y B, inician conexiones TCP al vincularse a los puertos locales Pa y Pb, respectivamente, necesitan saber el puerto del punto final remoto según lo asignado por el NAT para realizar la conexión. Cuando ambos pares están detrás de un NAT, cómo descubrir el punto final remoto público del otro par es un problema llamado predicción de puerto NAT . Todas las técnicas de perforación de agujeros y cruce de NAT TCP tienen que resolver el problema de predicción de puerto.
Una asignación de puerto NAT puede ser una de dos:
- previsible
- La puerta de enlace utiliza un algoritmo simple para asignar el puerto local al puerto NAT. La mayoría de las veces, un NAT utilizará la preservación de puerto , lo que significa que el puerto local se asigna al mismo puerto en el NAT.
- no predecible
- Las pasarelas utilizan un algoritmo que es aleatorio o demasiado impráctico para predecir.
Dependiendo de si los NAT presentan un comportamiento predecible o no predecible, será posible o no realizar la conexión TCP mediante una apertura simultánea de TCP, como lo muestra a continuación la matriz de conexión que representa los diferentes casos y su impacto en la comunicación de extremo a extremo: [ cita requerida ]
- SÍ: la conexión funcionará todo el tiempo
- NO: la conexión casi nunca funcionará
Técnicas
Métodos de predicción de puertos (con NAT predecibles)
A continuación se muestran algunos de los métodos utilizados por los NAT para permitir que los pares realicen predicciones de puertos:
- El NAT asigna puertos externos secuenciales a puertos internos secuenciales : si el par remoto tiene la información de una asignación, entonces puede adivinar el valor de las asignaciones posteriores. La conexión TCP se realizará en dos pasos, primero los pares realizan una conexión con un tercero y aprenden su asignación. Para el segundo paso, ambos pares pueden adivinar cuál será la asignación de puerto NAT para todas las conexiones posteriores, lo que resuelve la predicción de puerto. Este método requiere realizar al menos dos conexiones consecutivas para cada par y requiere el uso de un tercero. Este método no funciona correctamente en el caso de NAT de nivel de operador con muchos suscriptores detrás de cada dirección IP, ya que solo hay una cantidad limitada de puertos disponibles y la asignación de puertos consecutivos al mismo host interno puede ser poco práctica o imposible.
- El NAT utiliza el esquema de asignación de preservación de puertos : el NAT asigna el puerto de origen del par interno al mismo puerto público. En este caso, la predicción de puertos es trivial y los pares simplemente tienen que intercambiar el puerto al que están vinculados a través de otro canal de comunicación (como UDP o DHT [ aclaración necesaria ] ) antes de realizar las conexiones salientes del TCP abiertas simultáneamente. Este método requiere solo una conexión por par y no requiere que un tercero realice la predicción de puertos.
- El NAT utiliza un "mapeo independiente del punto final" : dos conexiones TCP sucesivas procedentes del mismo punto final interno se mapean al mismo punto final público. Con esta solución, los pares se conectarán primero a un servidor de terceros que guardará su valor de mapeo de puerto y les dará a ambos pares el valor de mapeo de puerto del otro par. En un segundo paso, ambos pares reutilizarán el mismo punto final local para realizar una apertura TCP simultánea entre sí. Desafortunadamente, esto requiere el uso de SO_REUSEADDR en los sockets TCP, y dicho uso viola el estándar TCP [ ¿cómo? ] y puede provocar corrupción de datos. Solo se debe utilizar si la aplicación puede protegerse contra dicha corrupción de datos.
Detalles de una instancia de conexión TCP típica con TCP Hole Punching
Suponemos aquí que la predicción de puertos ya se ha realizado a través de uno de los métodos descritos anteriormente y que cada par conoce el punto final remoto del par. Ambos pares realizan una llamada de conexión POSIX al otro punto final del par. La apertura simultánea de TCP se realizará de la siguiente manera:
- El par A envía un SYN al par B
- El par B envía un SYN al par A
- Cuando NAT-a recibe el SYN saliente del Peer A, crea una asignación en su máquina de estados.
- Cuando NAT-b recibe el SYN saliente del Peer B, crea una asignación en su máquina de estados.
- Ambos SYN se cruzan en algún lugar a lo largo de la ruta de la red, luego:
- SYN del par A llega a NAT-b, SYN del par B llega a NAT-a
- Dependiendo del momento en que se produzcan estos eventos (en qué punto de la red se cruzan los SYN),
- Al menos uno de los NAT permitirá el paso del SYN entrante y lo asignará al par de destino interno.
- Al recibir el SYN, el par envía un SYN+ACK y se establece la conexión.
Requisitos de interoperabilidad en NAT para TCP Hole Punching
Otros requisitos del NAT para cumplir con la apertura simultánea de TCP
Para que el TCP simultáneo funcione, el NAT debe:
- no envíe un RST como respuesta a un paquete SYN entrante que no sea parte de ninguna asignación
- Aceptar un SYN entrante para un punto final público cuando el NAT ha visto previamente un SYN saliente para el mismo punto final
Esto es suficiente para garantizar que los NAT se comporten bien con respecto a la apertura simultánea de TCP.
Perforación de puertos TCP y NAT de nivel de operador (CGN)
La técnica descrita anteriormente funciona bien dentro de un CGN. Un CGN también puede hacer uso de un comportamiento de sobrecarga de puertos , lo que significa que los puntos finales internos distintos con el mismo valor de puerto se pueden asignar al mismo punto final público. Esto no rompe la unicidad del quíntuple {protocolo, dirección pública, puerto público, dirección remota, puerto remoto } y, como resultado, es aceptable. La preservación del puerto TCP también puede conducir a casos en los que los puertos CGN están sobrecargados y no es un problema para la solidez del protocolo. La sobrecarga de puertos para TCP permite que el CGN se adapte a más hosts internamente mientras se preservan las garantías de comunicación de extremo a extremo de TCP.
Véase también
Referencias
- ^ Information Sciences Institute (septiembre de 1981). "Transmission control protocol: DARPA internet program protocol Specification". IETF . Agencia de Proyectos de Investigación Avanzada de Defensa.