Zastosowanie NAT Traversal do łączenia użytkowników w trybie pasywnym

Ten artykuł jest swobodnym tłumaczeniem jednego z wpisów na blogu deweloperów DC++.

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ę $ConnectToMe 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ę $RevConnectToMe do aktywnego klienta, Bktóry następnie odpowiada komendą $ConnectToMe.

Zastosowanie NAT Traversal do łączenia użytkowników w trybie pasywnym
W roli serwera S w powyższym przypadku działa hub DC,

jeśli obaj klienci są w trybie pasywnym na hubie ADC.

Klienci znajdujący się za różnymi NAT A i B połączyli się z hubem. S.

Zastosowanie NAT Traversal do łączenia użytkowników w trybie pasywnym
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> 1649612991

W 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.

Zastosowanie NAT Traversal do łączenia użytkowników w trybie pasywnym
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.

Zastosowanie NAT Traversal do łączenia użytkowników w trybie pasywnym
Ilustracja, pasująca do całego procesu z zastrzeżeniem, że protokół nie używa publicznych portów otwieranych przez sesję NATS, 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 DC++ będzie mógł "obejść" NAT, wykorzystując istniejące połączenia AS i BS do nawiązania bezpośredniego połączenia klient‒klient, nawet jeśli A i B są w trybie pasywnym.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster