Yusuke schlägt ein Loch direkt durch Ihr NAT
Haftungsausschluss : Dies ist keine produktionsbereite Chat-Anwendung. Dieser Code erstellt zwar AES-verschlüsselte Verbindungen client <-> client
und client <-> server
, wurde jedoch von keinem Sicherheitsspezialisten geprüft oder getestet. Dies ist lediglich eine Übung für mich, um mehr über P2P-Netzwerke und -Technologien zu erfahren und anderen, die daran interessiert sind, einige Beispiele der verwendeten Technologien zur Verfügung zu stellen. Darüber hinaus implementiert der UDP-Client kein Protokoll, das die erfolgreiche Zustellung von Nachrichten gewährleistet, sodass einige Nachrichten bei fehlerhaften Verbindungen verloren gehen.
Klicken Sie auf das Bild oben, um ein YouTube-Video der Chat-App in Aktion anzusehen. Das Terminal in der oberen rechten Ecke ist per SSH mit einem VPS verbunden, auf dem der Rendezvous-Server läuft. Das Terminal unten rechts ist die Terminal-Benutzeroberfläche. Die Web-App auf der linken Seite ist die GUI.
go get github.com/wilfreddenton/udp-hole-punching
Das Hauptpaket ist der Rendezvous-Server. Finden Sie einen VPS oder etwas anderes, auf dem Sie es hosten können. Sie können alles lokal ausführen, es wird jedoch nicht wirklich getestet, ob das Lochen funktioniert, da es auf demselben Computer ausgeführt wird. Stellen Sie sicher, dass auf dem Server TCP- und UDP-Ports für eingehenden Datenverkehr von 0 bis 65535 geöffnet sind.
Um es auszuführen:
go install
Es gibt zwei Benutzeroberflächen, die Sie verwenden können: gui
, eine Web-Benutzeroberfläche, und term-ui
, eine Terminal-Benutzeroberfläche. Sie können jede beliebige Kombination von Benutzeroberflächen verwenden.
Bevor Sie einen verwenden, sollten Sie die Datei main.go
öffnen und die Konstanten serverTCPIP
und serverUDPIP
auf die IP-Adresse Ihres Rendezvous-Servers (kein Port) umstellen.
Zum Ausführen der Web-Benutzeroberfläche
cd gui/ui
npm install
npm run build
cd ..
go install
gui
, wenn Ihr Rendezvous-Server lokal läuft, oder gui -serverIP=<server IP here>
localhost:8000
Um die Verbindung zu trennen und einen neuen Chat zu starten, aktualisieren Sie einfach.
Zum Ausführen der Terminal-Benutzeroberfläche
cd term-ui
go install
term-ui
, wenn Ihr Rendezvouse-Server lokal ausgeführt wird term-ui -serverIP=<server IP here>
Um die Verbindung zu trennen und einen neuen Chat zu starten ctrl-c
um das Programm zu beenden und erneut auszuführen.
Wenn Sie kein Freund sind, greifen Sie auf einen Computer hinter einem anderen Router zu und richten Sie dort einen Client ein.
Führen Sie die Clients aus und geben Sie die PeerID eines Clients an den anderen Client weiter. Wenn die Netzwerktopologie Hole Punching zulässt, stellen Sie eine verschlüsselte Verbindung zwischen den Clients her.
ID
des Peers, mit dem er kommunizieren möchteUm die Implementierung von Hole Punching etwas zu vereinfachen, dürfen die Clients nicht versuchen, eine Verbindung zu den privaten IP-Adressen der anderen herzustellen. Clients, die sich hinter demselben NAT befinden, können weiterhin eine Verbindung herstellen, jedoch über öffentliche und nicht über private IP-Adressen. Die von mir getesteten Router schienen zu verstehen, dass sich die Peers im lokalen Netzwerk befanden, und ermöglichten die Verbindung, ohne auf das externe Internet zuzugreifen.