Yusuke hace un agujero en tu NAT
Descargo de responsabilidad : esta no es una aplicación de chat lista para producción. Si bien crea conexiones cifradas AES client <-> client
y client <-> server
, este código no ha sido auditado ni probado por ningún especialista en seguridad. Este es simplemente un ejercicio para mí para aprender más sobre las redes y tecnologías P2P, así como para brindar algunos ejemplos de las tecnologías en uso para otras personas interesadas en aprender. Además, el cliente udp no implementa un protocolo que garantice la entrega exitosa de mensajes, por lo que algunos se perderán debido a conexiones irregulares.
Haga clic en la imagen de arriba para ver un vídeo de YouTube de la aplicación de chat en acción. El terminal en la esquina superior derecha está conectado mediante SSH a un VPS que ejecuta el servidor de encuentro. El terminal en la parte inferior derecha es la interfaz de usuario del terminal. La aplicación web de la izquierda es la GUI.
go get github.com/wilfreddenton/udp-hole-punching
El paquete principal es el servidor de encuentro. Encuentre un VPS o algo para alojarlo. Puede ejecutar todo localmente, pero en realidad no probará si la perforación funciona o no porque está en la misma máquina. Asegúrese de que el servidor tenga puertos TCP y UDP abiertos al tráfico entrante del 0 al 65535.
Para ejecutarlo:
go install
Hay dos interfaces de usuario que puede usar: gui
, que es una interfaz de usuario web, y term-ui
, que es una interfaz de usuario de terminal. Puede utilizar cualquier combinación de UI.
Antes de usar uno, debe abrir el archivo main.go
y cambiar las constantes serverTCPIP
y serverUDPIP
a la dirección IP de su servidor de encuentro (sin puerto).
Para ejecutar la interfaz de usuario web
cd gui/ui
npm install
npm run build
cd ..
go install
gui
si su servidor de encuentro se está ejecutando localmente o gui -serverIP=<server IP here>
localhost:8000
Para desconectarse e iniciar un nuevo chat, simplemente actualice.
Para ejecutar la interfaz de usuario del terminal
cd term-ui
go install
term-ui
si su servidor de encuentro se está ejecutando localmente term-ui -serverIP=<server IP here>
Para desconectarse e iniciar un nuevo chat ctrl-c
para salir del programa y ejecutarlo nuevamente.
Si no es un amigo, obtenga acceso a una computadora detrás de un enrutador diferente y configure un cliente allí.
Ejecute los clientes y proporcione el PeerID de un cliente al otro cliente y, si la topología de la red permite perforar agujeros, establecerá una conexión cifrada entre los clientes.
ID
del par con el que le gustaría comunicarsePara simplificar un poco la implementación de la perforación, los clientes no deben intentar conectarse a las direcciones IP privadas de cada uno. Los clientes que estén detrás de la misma NAT aún podrán conectarse pero lo harán con direcciones IP públicas y no privadas. Los enrutadores que probé parecían entender que los pares estaban en su red local y facilitaron la conexión sin tener que acceder a Internet externo.