Ten artykuł jest swobodnym tłumaczeniem jednego z wpisów na .
Za zgodą autora (a także dla lepszej wizualizacji i z ciekawości) wzbogaciłem go linkami i dodałem kilka osobistych spostrzeżeń.
Wprowadzenie
Obecnie co najmniej jeden użytkownik z pary łączących się musi być w trybie aktywnym. Mechanizm 'obejścia' NAT będzie przydatny, gdy tryb aktywny nie jest skonfigurowany u żadnej ze stron. Zwykle dzieje się tak z powodu blokady połączeń przychodzących przez zaporę lub urządzenie NAT.
Jeśli obaj klienci są w trybie aktywnym,
klient inicjator wysyła zawierającą jego własny adres IP i port komendę do drugiego klienta. Używając tych danych, klient, który otrzymał komendę, nawiązuje połączenie z inicjatorem.
Jeśli jeden z klientów jest w trybie pasywnym,
przez hub pasywny klient A wysyła komendę do aktywnego klienta, Bktóry następnie odpowiada komendą $ConnectToMe.

W roli serwera S w powyższym przypadku działa hub DC,
jeśli obaj klienci są w trybie pasywnym na
Klienci znajdujący się za różnymi NAT A i B połączyli się z hubem. S.

Tak wygląda połączenie z hubem z perspektywy klienta. A
Hub akceptuje połączenia na porcie 1511. Klient A nawiązuje wychodzące połączenia z jego prywatnej sieci przez port 50758. Hub, z kolei, widzi adres urządzenia NAT, pracuje z nim i przekazuje klientom odpowiednio ich identyfikatory.
Klient A wysyła serwerowi S wiadomość z prośbą o pomoc w połączeniu z klientem. B.
Hub: [Outgoing][178.79.159.147:1511] DRCM AAAA BBBB ADCS/0.10 1649612991
Będąc również w trybie pasywnym, klient, Botrzymawszy tę komendę, musi podać swój prywatny port, używany do połączenia z hubem przez NAT.
Hub: [Incoming][178.79.159.147:1511] DNAT BBBB AAAA ADCS/0.10 59566 1649612991
Po otrzymaniu tych informacji klient A natychmiast próbuje nawiązać połączenie z klientem B i przekazuje swój własny prywatny port.
Hub: [Outgoing][178.79.159.147:1511] D<b>RNT</b> AAAA BBBB ADCS/0.10 <b>50758</b> 1649612991W czym rzecz? Chodzi o przesunięcie końcowego punktu tego samego połączenia przez utworzenie nowego połączenia do publicznego adresu przez już używany prywatny port.

Bingo!
Oczywiście, NAT klienta B ma pełne prawo odrzucić pierwszą prośbę o połączenie od klienta, Aale już jego własne zapytanie kieruje się w 'dziurę', stworzoną przez to połączenie, i połączenie zostaje nawiązane.

Ilustracja, pasująca do całego procesu z zastrzeżeniem, że nie używa publicznych portów otwieranych przez sesję NAT‒S, a także prywatnych adresów.
Epilog
W momencie pisania (oryginalnego) artykułu około połowa klientów DC działa w trybie pasywnym. Oznacza to, że jedna czwarta wszystkich możliwych połączeń nie może być nawiązana.
W przyszłości , wykorzystując istniejące połączenia A‒S i B‒S do nawiązania bezpośredniego połączenia klient‒klient, nawet jeśli A i B są w trybie pasywnym.
Źródło: habr.com
