UDP/TCP hole punching (Router Firewall legal löchern)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

UDP/TCP hole punching (Router Firewall legal löchern)

Beitrag von Joel »

Habe sowas in Erinnerung, das es möglich ist/war, eine Peer to Peer Verbindung mit einem anderen PC herzustellen, selbst wenn beide PCs hinter einem Router sitzt.

Ich weiß jetzt nicht, ob das eine Router Bug Meldung war (die ich damals in der PC-Welt gelesen habe) oder ob das immer noch funktioniert. Die Möglichkeit wäre aber für mein Programm sehr hilfreich.

So ähnlich funktioniert das: PC 1 (hinter Router) stellt eine Verbindung zu PC 2 (hinter Router) her. Der Router 1 hat nun ein Loch in der Firewall und der 2. PC kann nun eine Verbindung zu PC 1 (durch die Firewall herstellen) weil Router 1 die IP-Adresse von PC 2 auf der Weißen-Liste hat.

(Kein Router hat im NAT einen Port offen)


Wenn ich das jetzt Richtig beschrieben habe, würde ich gerne wissen, ob das wirklich funktioniert und wie man das realisiert.
Zuletzt geändert von Joel am 20.05.2009 19:31, insgesamt 2-mal geändert.
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Naja das NAT-Punching geht ungefähr so (Alles UDP Transfer):

Endpoint 1 schickt Dummypaket an Endpoint 2.
Nun weiß die NAT-Box von Endpoint 1, dass Nachrichten diesen Quellports an diesen Endpoint zurückkommen.

Endpoint 2 schickt Dummypaket an Endpoint 1.
Nun weiß die NAT-Box von Endpoint 2, dass Nachrichten diesen Quellports an diesen Endpoint zurückkommen.

Nun ist keine Blockade mehr vorhanden, es sei denn es ist etwas anderes als eine NAT-Box.

Nur weiß ich nicht wie man bei Paketen den Quellport bestimmt ohne die Pakete selbst zu basteln (Also mit UDP Header).

UDP Header:
2Byte Quellport
2Byte Zielport
2Byte Länge
2Byte Prüfsumme
Daten...

Natürlich auf die Netzwerk Bytereihenfolge achten.
Zuletzt geändert von DarkDragon am 07.04.2009 15:48, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Kann ich dafür OpenNetworkConnection() Verwenden?

Wenn ich eine Verbindung mit dem UDP Parameter per OpenNetworkConnection() herstelle, dann gibt es ja nie 0 zurück, wie weiß ich jetzt, ob die Verbindung hergestellt werden konnte (also UDP hole punching positiv war) und wann nicht?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Joel hat geschrieben:Kann ich dafür OpenNetworkConnection() Verwenden?

Wenn ich eine Verbindung mit dem UDP Parameter per OpenNetworkConnection() herstelle, dann gibt es ja nie 0 zurück, wie weiß ich jetzt, ob die Verbindung hergestellt werden konnte (also UDP hole punching positiv war) und wann nicht?
Das kannst du nach nem Three-Way-Handshaking feststellen. Mit OpenNetworkConnection setzt du aber nicht den Quellport fest.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Muss ich dann die Daten per UDP senden oder kann ich nach/in dieser Attacke dann irgentwie auf TCP umsteigen?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Joel hat geschrieben:Muss ich dann die Daten per UDP senden oder kann ich nach/in dieser Attacke dann irgentwie auf TCP umsteigen?
Nein das geht nicht.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Ok also das heißt enweder:

1. TCP und Port Forwarding

2. UDP ohne Portforwarding
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Joel hat geschrieben:Ok also das heißt enweder:

1. TCP und Port Forwarding

2. UDP ohne Portforwarding
3. UDP mit Portforwarding

4. Softwaregesteuertes Portforwarding (UPnP) - geht allerdings nicht mit jeder NAT-Box.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

DarkDragon hat geschrieben:
4. Softwaregesteuertes Portforwarding (UPnP) - geht allerdings nicht mit jeder NAT-Box.
Das wäre eine gute Idee!

Und wie mache ich das mit PB
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Joel hat geschrieben:
DarkDragon hat geschrieben:
4. Softwaregesteuertes Portforwarding (UPnP) - geht allerdings nicht mit jeder NAT-Box.
Das wäre eine gute Idee!

Und wie mache ich das mit PB
http://www.purebasic.fr/english/viewtop ... light=upnp
http://www.purebasic.fr/english/viewtop ... light=upnp
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten