PDA

View Full Version : NAT Traversal, come si fa?


GordonFreeman
29-07-2008, 02:01
Si può fare in modo che due pc, entrambi dietro una NAT, possano comunicare fra loro direttamente? Non importa se tramite TCP o UDP.

E questo senza che tutto il traffico passi per un terzo server. Un server al massimo può essere usato all'inizio per permettere ai client di connettersi fra loro direttamente.

Ho provato a fare un test veloce.


Ho creato un programmino server, che gira su un PC con IP pubblico, e che riceve un pacchetto UDP.

Dopodichè, risponde all'infinito al client che lo ha contattato, e intanto stampa su schermo l'indirizzo e porta esterni del client.

Il client, che risiede sul mio pc dietro una NAT, manda un pacchetto al server e poi riceve pacchetti all'infinito e stampa su schermo il contenuto dei pacchetti, semplicemente.

Poi, li ho avviati e ho preso nota dell' [IP : porta] esterni del client , che il server stampava su schermo.

Infine, ho creato un terzo programmino che gira sempre sullo stesso pc del client, e manda pacchetti al client (conosco i suoi IP : porta esterni).


Esito : il client non riceve pacchetti dal terzo programma, ma solo dal server, infatti dopo ho chiuso il server... e il client ha smesso di ricevere pacchetti mentre l'altro programmino glieli mandava.. (l'ip e porta erano corretti, ho provato più volte).

Dove sta lo sbaglio?? Forse c'è un firewall sul mio ISP (la Tiscali) che si ricorda che il client ha contattato una certa macchina esterna, e permette le risposte solo da essa e non anche da altre ??

Se qualcuno è riuscito a far comunicare due pc dietro nat, usando un server o meno, può spiegarmi come si fa? thx

Z3R0`c00l
29-07-2008, 19:25
Si può fare in modo che due pc, entrambi dietro una NAT, possano comunicare fra loro direttamente? Non importa se tramite TCP o UDP.

E questo senza che tutto il traffico passi per un terzo server. Un server al massimo può essere usato all'inizio per permettere ai client di connettersi fra loro direttamente.

Ho provato a fare un test veloce.


Ho creato un programmino server, che gira su un PC con IP pubblico, e che riceve un pacchetto UDP.

Dopodichè, risponde all'infinito al client che lo ha contattato, e intanto stampa su schermo l'indirizzo e porta esterni del client.

Il client, che risiede sul mio pc dietro una NAT, manda un pacchetto al server e poi riceve pacchetti all'infinito e stampa su schermo il contenuto dei pacchetti, semplicemente.

Poi, li ho avviati e ho preso nota dell' [IP : porta] esterni del client , che il server stampava su schermo.

Infine, ho creato un terzo programmino che gira sempre sullo stesso pc del client, e manda pacchetti al client (conosco i suoi IP : porta esterni).


Esito : il client non riceve pacchetti dal terzo programma, ma solo dal server, infatti dopo ho chiuso il server... e il client ha smesso di ricevere pacchetti mentre l'altro programmino glieli mandava.. (l'ip e porta erano corretti, ho provato più volte).

Dove sta lo sbaglio?? Forse c'è un firewall sul mio ISP (la Tiscali) che si ricorda che il client ha contattato una certa macchina esterna, e permette le risposte solo da essa e non anche da altre ??

Se qualcuno è riuscito a far comunicare due pc dietro nat, usando un server o meno, può spiegarmi come si fa? thx

dai un occhiata qui: http://samy.pl/chownat/

è un giochetto abbastanza semplice, carica tanto la rete ed in certe occasioni non è conveniente, ma è l'unica soluzione che non richiede un server in mezzo in grado di fare da bridge.
dopo che hai letto "Come è possibile?" ti chiederai "Come non c'ho pensato prima?"

infine, ti consiglio di leggerti i relativi rfc per nat e nat-t, una volta capito come funziona il sistema è piuttosto semplice capire come andare oltre determinati limiti.

GordonFreeman
30-07-2008, 00:52
dai un occhiata qui: http://samy.pl/chownat/

è un giochetto abbastanza semplice, carica tanto la rete ed in certe occasioni non è conveniente, ma è l'unica soluzione che non richiede un server in mezzo in grado di fare da bridge.
dopo che hai letto "Come è possibile?" ti chiederai "Come non c'ho pensato prima?"

infine, ti consiglio di leggerti i relativi rfc per nat e nat-t, una volta capito come funziona il sistema è piuttosto semplice capire come andare oltre determinati limiti.

grazie, l'ho letto e adesso mi leggo le rfc.
avresti per caso scritto un programmino che fa lo stesso ma in c/c++?
io il perl non lo conosco.

secondo te hamachi funziona così? per me fa esattamente quello, non è una loro invenzione quel sistema, mentre nel sito di hamachi la spacciano come tale.
e la stessa cosa fa ultravnc penso.

Z3R0`c00l
30-07-2008, 22:41
grazie, l'ho letto e adesso mi leggo le rfc.
avresti per caso scritto un programmino che fa lo stesso ma in c/c++?
io il perl non lo conosco.

secondo te hamachi funziona così? per me fa esattamente quello, non è una loro invenzione quel sistema, mentre nel sito di hamachi la spacciano come tale.
e la stessa cosa fa ultravnc penso.

no purtroppo io lavoro in .net e ho pochissima esperienza diretta su c e c++... ma cmq il perl è abbastanza semplice da tradurre..