Forma automática de habilitar el acceso al puerto 4900 desde internet

Resuelto Jayesh asked hace 13 años • 6 respuestas

Estoy escribiendo un programa p2p personalizado que se ejecuta en el puerto 4900. En algunos casos, cuando la persona está detrás de un enrutador, no se puede acceder a este puerto desde Internet.

¿Existe alguna forma automática de habilitar el acceso al puerto desde Internet? No estoy muy seguro de cómo funcionan otras aplicaciones p2p.

¿Alguien puede arrojar algo de luz sobre esto?

Jayesh avatar Dec 15 '11 23:12 Jayesh
Aceptado

Conectividad P2P en pocas palabras. Supongamos que estamos hablando de UDP aquí. Los pasos siguientes también se pueden aplicar a TCP con algunos ajustes.

  1. Enumere todas sus direcciones IP locales (generalmente solo 1). Cree un socket UDP en un número de puerto determinado** para cada adaptador con una dirección IP.

  2. Para cada socket creado en el paso 1, comuníquese con un servidor STUN o TURN con ese mismo socket para descubrir su dirección IP externa y descubrir a qué se asigna el número de puerto interno fuera de NAT (no siempre es el mismo valor de puerto). Es decir, su dirección local 192.168.1.2:4900 podría ser 128.11.12.13:8888 para el mundo exterior. Y algunas NAT no siempre usan la misma asignación de puertos cuando usan el mismo puerto local para otras direcciones IP. TURN también le proporcionará una "dirección de retransmisión". También puede utilizar UPNP para obtener una dirección de puerto asignado directamente desde su enrutador, si es compatible con ese protocolo.

  3. A través de un servicio de encuentro (SIP, XMPP, mensajería instantánea, servicio web, correo electrónico, vasos con cuerdas), publique su lista de direcciones de candidatos en un servicio o envíe una notificación al otro cliente que diga: "Oye, quiero conectarme contigo". ". Este mensaje incluye todos los "candidatos de direcciones" (pares de IP y puertos) recopilados en los pasos 1 y 2.

  4. El cliente remoto, al recibir la invitación para conectarse, también realiza los pasos 1 y 2 anteriores. Luego envía su lista de candidatos a través del mismo canal en el que recibió la lista de candidatos del invitante.

  5. Paso de perforación. Ambos clientes comienzan a enviar mensajes de prueba a través de UDP a las direcciones candidatas del otro lado y escuchan los mismos mensajes por su parte. Cada vez que reciba un mensaje, responda a la dirección de donde proviene. Con el tiempo, los clientes descubrirán que tienen un par de direcciones a las que también pueden enviar datagramas de forma fiable. Normalmente, un punto final toma la decisión final sobre con qué par de direcciones (sockets) comunicarse y el protocolo facilita que este punto final le informe esta decisión al otro punto final.

**- normalmente es mejor no depender de un puerto conocido para clientes P2P. Porque es probable que dos clientes detrás del mismo NAT o firewall no puedan usar su software al mismo tiempo.

Aquí hay un resumen rápido de algunas tecnologías para explorar.

STUN : es un servidor y protocolo simple para que los clientes detrás de una ruta/NAT descubran cuáles son sus asignaciones de puertos y IP externas.

TURN es una expansión de STUN, pero admite la retransmisión para escenarios de conectividad P2P donde los firewalls y NAT impiden las conexiones directas.

ICE es un conjunto de pasos mediante los cuales STUN y TURN se utilizan para configurar una conexión P2P. ICE es un protocolo formal para los pasos 1 a 5 anteriores. Dos excelentes conjuntos de diapositivas sobre ICE están aquí y aquí .

WebRTC es una variante del estándar ICE así como una biblioteca de referencia para realizar sesiones P2P con STUN y TURN.

Protocolo de dispositivo de puerta de enlace de Internet UPNP + : algunos enrutadores admiten esto para que los hosts obtengan automáticamente asignaciones de puertos.

libnice es una biblioteca C de código abierto para Linux (y podría funcionar en Windows) que implementa ICE.

libjingle es otra implementación de ICE (en C++) de Google. Para Windows y Linux.

PJNATH es una biblioteca dentro del conjunto de bibliotecas de codificación PJSIP . Es una buena implementación de una pila ICE (código C) y se ha adaptado a muchas plataformas. (Windows, Linux, Mac, iOS, Symbian y próximamente Android).

Y finalmente, tengo un complemento descarado para que uses mi código base de servidor STUN .

selbie avatar Dec 15 '2011 18:12 selbie

Existen soluciones en algunos casos, consulte UPnP: https://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

El enrutador de mi casa permite esto, básicamente, la NAT se puede configurar automáticamente mediante la solicitud adecuada desde la computadora.

No contaría con esto para proporcionar una gran mejora en su disponibilidad, porque no muchos enrutadores lo admiten y lo tienen habilitado.

EDITAR: @David sugirió esta pregunta SO para una biblioteca .NET para UPnP: ¿Existe una biblioteca UPnP para .NET (C# o VB.NET)?

jv42 avatar Dec 15 '2011 16:12 jv42

Usaría la tecnología WebRTC como marco de código abierto para dicha aplicación.

Página web oficial

De hecho, es un proyecto de código abierto que admite todo lo necesario para las tecnologías peer-to-peer listas para usar:

  • ICE y STUN (recorrido NAT)
  • DTLS y SRTP (seguridad)
  • AVPF para calidad de transmisión.
ankitr avatar Sep 14 '2015 06:09 ankitr

Esto puede ser un poco más complicado de lo que estás buscando, pero TCP Hole Punching es una técnica que debería funcionar. http://en.wikipedia.org/wiki/TCP_hole_punching

Alternativamente, UPnP funciona muy bien para enrutadores/firewalls que lo admitan.

Matthew avatar Dec 15 '2011 16:12 Matthew