La perforación de agujeros UDP no pasa en 3G

Estoy tratando de implementar en un software una función de perforación. La cuestión es que estoy implementando esto con un servidor TCP ya creado para comunicarme con los usuarios.

Esto es lo que tengo hasta ahora:

  • "A" envía un mensaje a un servidor UDP "US" (en el puerto 9333)
  • "US" devuelve a "A" el puerto al que se ha conectado (puerto 31000 - puerto local 31005)
  • "A" envía un mensaje a un servidor TCP "TS" diciendo que quiere conectarse a B (y darle el puerto 31000)
  • "TS" envía un mensaje a "B" dándole el puerto de "A" (31000) y la ip
  • "B" envía un mensaje a "US" (en el puerto 9333)
  • "US" envía un mensaje a "B" diciéndole su puerto 45000 (localport 45005)
  • "B" envía un mensaje a "TS" dando su puerto udp (45000)
  • "TS" envía un mensaje a "A" dando el puerto udp de B (45000) y la ip
  • "A" comienza a enviar un mensaje udp a la IP de B en el puerto 45000 y escucha en el puerto local 31005
  • "B" comienza a enviar un mensaje udp a la IP de A en el puerto 31000 y escucha en el puerto local 45005

Por supuesto, los puertos 31000, 31005, 45000 y 45005 están aquí, por ejemplo, cada nueva conexión cambia de puerto, solo el 9333 es estático.

Sé que hay mucho de ida y vuelta, más de lo que realmente debería ser. El hecho es que estoy obligado a usar el servidor TCP para comunicarme con ambos usuarios, el servidor udp está aquí para devolver el puerto del usuario a sí mismo para que pueda enviarlo de vuelta al servidor TCP.

Sin embargo, los mensajes entre usuarios no son recibidos por ninguno... ¿Alguien tiene una idea de por qué?


EDIT:

He probado mi enrutador con http://nattest.net.in.tum.de/test.php y la perforación de agujeros UDP funciona bien, por lo que el problema no proviene de mi enrutador, sino de mi protocolo...

Cuando los usuarios están detrás del mismo NAT, todo funciona bien, por supuesto que usa una IP privada, pero significa que el código también funciona, por lo que todo conduce a un problema de protocolo...


EDITAR 2:

De hecho, lo hice medio funcionar (Y el problema venía de mi código en realidad, no del protocolo... He conectado 2 usuarios, uno en 3G con un iPhone, uno detrás de mi NAT en Wifi.

Lo curioso (bueno, no tanto) es que solo un socket pudo recibir y enviar datos entre ambos usuarios. (el enchufe iniciado por el iphone) De acuerdo con el protocolo, debería tener 2 enchufes bien conectados, ¿me equivoco?

Así que logré perforar un agujero en mi NAT, pero en realidad no en el NAT celular.

Por supuesto, probé enseguida 2 iphones conectados en 3G. Y nadie recibe el mensaje del otro.

¿Me perdí algo sobre NAT celular?

PD: Lo siento por actualizar tanto mi pregunta, pero como no obtengo respuesta, estoy tratando de encontrar por mí mismo ...

PD 2: Como logré perforar un agujero en mi NAT, cambié el título y agregué "en 3G".


EDIT 3 : Corrí el http://nattest.net.in.tum.de/test.php prueba de nuevo con mi computadora conectada a internet a través de la conexión 3G de mi iphone.

Aquí está el resultado: RESULTADO DEL PUNZONADO UDP

Aparentemente, todas las pruebas de perforación de orificios superiores fueron exitosas en la novena prueba.

Además más parece:

Prueba de enlace UDP (?): enlace independiente del punto final, la predicción del puerto es fácil

Por lo tanto, no debería haber ningún problema para conectar 2 pares a través de una conexión 3G (bueno, no mucho más que detrás de un NAT "doméstico")... ¿Estoy en lo cierto?


EDITAR 4:

Solo para estar seguro, ahora envío un mensaje a dos servidores UDP distintos, para verificar si el puerto y el puerto local son los mismos en 3G.

Para resumir, los puertos (locales y públicos) son los mismos cuando se conectan en ambos servidores. por lo que la prueba realizada en EDIT 2 fue correcta, udp es independiente del punto final, por lo que no debería haber ningún problema al perforar, supongo ... (Al menos con mi ISP)

preguntado el 10 de septiembre de 12 a las 22:09

3G NAT es simétrico y de gran escala. Pruebe este método de perforación en su lugar: drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/… -

+yo por nattest.net.in.tum.de/test.php Estaba buscando ese servicio desde hace mucho tiempo. -

2 Respuestas

Desafortunadamente, no existe una forma 100 % confiable de realizar perforaciones NAT con UDP. En el mejor de los casos, puede hacer algunas conjeturas sobre cómo se comportarán probablemente los NAT y los cortafuegos la mayor parte del tiempo. Pero siempre habrá excepciones y puede que no sean raras.

En este caso, parece que está utilizando un servidor central para permitir que dos pares descubran el puerto externo del otro y luego comiencen a enviarse datos entre sí. Ese es un algoritmo bastante bueno. El problema es que el enrutamiento del puerto externo puede variar según el destino. En otras palabras, si A to B tiene un puerto externo de 5000, no hay garantía de que A to C también provenga de 5000. Por lo tanto, tener un servidor central que registre el puerto que ve puede no ayudar a conectar a nadie más.

Aquí hay algunas preguntas relacionadas con algunos detalles más.

contestado el 23 de mayo de 17 a las 13:05

Hola, gracias por responder... Por desgracia, soy consciente de que no existe una forma 100 % confiable de realizar perforaciones NAT con UDP :-(. Sin embargo, el problema solo ocurre ahora cuando ambos pares están detrás de las conexiones 3G. I He intentado detrás de diferentes tipos de NAT, y funciona para la mayoría de ellos (en realidad, solo falla el NAT simétrico, pero yo estaba al tanto de eso...) Lo que no entiendo es por qué no funciona cuando ambos pares están en 3G , aunque skype y Viber parecen funcionar bien, cuando ambos pares están en 3G - El escuadrón

Como escribí en mi pregunta, cuando uno de los pares está detrás de un NAT no simétrico y el otro en 3G, un conector (de 2) funciona, por lo que puedo enviar y recibir en ambos dispositivos a través de ese conector. - El escuadrón

Servicios como Skype enrutan datos a través de un servidor central cuando no se puede establecer una conectividad directa. La razón más probable por la que podría no funcionar cuando ambos están en 3G es que la ruta entre los dispositivos móviles es diferente a la ruta de cada uno al servidor central. En otras palabras, es posible que esté pasando por dispositivos NAT completamente diferentes. - seth noble

Skype es un poco confuso porque hablan de una red "de igual a igual" para la comunicación y la retransmisión en lugar de servidores centrales fijos, pero ser parte de una red de igual a igual no significa que los datos entre dos nodos no se transmitan. entre un tercio. No estoy familiarizado con Viber, pero si realmente se basan en UDP y no tienen una forma de transmitir datos, habrá algunas situaciones en las que no funcionará a través de doble NAT. - seth noble

No del todo: estoy diciendo que no hay una forma 100% confiable de conectar ningún par de nodos cuando ambos están detrás de NAT. No existe un algoritmo que funcione todo el tiempo, para todos los dispositivos y todas las configuraciones de red. Hay algoritmos que funcionarán la mayor parte del tiempo, pero sin la capacidad de abrir puertos explícitamente en el NAT o escanear una red completa, siempre habrá algunas circunstancias o topologías en las que dichos algoritmos fallarán. - seth noble

El NAT detrás del cual se encuentra es simétrico, o cambia su número de puerto saliente según su destino. La perforación de orificios a través de NAT simétrica requiere un método diferente (ya sea TURN o perforación de múltiples orificios UDP). Intenta hacerlo de esta manera: https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing

Respondido 14 ago 15, 18:08

No estoy seguro de por qué alguien te votó negativo, el artículo que diste es interesante... +1 - El escuadrón

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.