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

Artykuł ten jest darmowym tłumaczeniem jednego z wpisów w Blog programistów DC++.

Za zgodą autora (a także dla przejrzystości i zainteresowania) pokolorowałem go linkami i uzupełniłem o własne badania.

Wprowadzenie

Co najmniej jeden użytkownik pary łączącej musi być w tym momencie w trybie aktywnym. Mechanizm przejścia NAT będzie przydatny, gdy po żadnej ze stron nie jest skonfigurowany tryb aktywny. Dzieje się tak zazwyczaj dlatego, że zapora sieciowa lub urządzenie NAT blokują połączenia przychodzące.

Jeśli obaj klienci są w trybie aktywnym

Klient inicjujący wysyła polecenie zawierające swój własny adres IP i port $Połącz ze mną do innego klienta. Korzystając z tych danych, klient, który otrzymał polecenie, nawiązuje połączenie z inicjatorem.

Jeśli jeden z klientów jest w trybie pasywnym

Poprzez hub, klient pasywny A wysyła polecenie $RevConnectToMe aktywny klient Bktóry następnie odpowiada poleceniem $ConnectToMe.

Używanie NAT Traversal do łączenia użytkowników w trybie pasywnym
Jako serwer S w powyższym przypadku jest to koncentrator prądu stałego

Jeśli obaj klienci są w trybie pasywnym Centrum ADC

Klienci korzystający z różnych NAT A и B dołączył do hubu S.

Używanie NAT Traversal do łączenia użytkowników w trybie pasywnym
Tak wygląda połączenie z hubem od strony klienta A

Koncentrator akceptuje połączenia na porcie 1511. Klient A realizuje połączenia wychodzące ze swojej sieci prywatnej poprzez port 50758. Hub z kolei widzi adres urządzenia NAT, współpracuje z nim i rozsyła go do klientów zgodnie z ich identyfikatorami.

Klient A wysyła na serwer 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

Również w trybie pasywnym klient Bpo otrzymaniu tego polecenia musi zgłosić swój prywatny port używany do łączenia się z koncentratorem poprzez NAT.

Hub: [Incoming][178.79.159.147:1511] DNAT BBBB AAAA ADCS/0.10 59566 1649612991

Po otrzymaniu tej informacji Klient A natychmiast próbuje nawiązać połączenie z klientem B i zgłasza 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

Jakie jest zainteresowanie? Zainteresowanie polega na przesunięciu punktu końcowego tego samego połączenia poprzez utworzenie nowego połączenia z adresem publicznym za pośrednictwem już używanego portu prywatnego.

Używanie NAT Traversal do łączenia użytkowników w trybie pasywnym
Bingo!

Oczywiście w tym przypadku klienta NAT B ma pełne prawo odrzucić pierwszą prośbę klienta o połączenie A, ale jego własna prośba wpada do „dziury” utworzonej przez to właśnie połączenie i połączenie zostaje nawiązane.

Używanie NAT Traversal do łączenia użytkowników w trybie pasywnym
Ilustracja odpowiednia dla całego procesu z zastrzeżeniem, że protokół nie korzysta z portów publicznych otwartych przez sesję NATS, a także adresy prywatne.

Epilog

W momencie pisania (oryginalnego) artykułu około połowa klientów DC pracuje w trybie pasywnym. Oznacza to, że nie można wykonać jednej czwartej wszystkich możliwych połączeń.

Dalej DC++ będzie w stanie ominąć NATkorzystając z istniejących połączeń AS и BS nawiązać bezpośrednie połączenie klient-klient, nawet jeśli A и B są w trybie pasywnym.

Źródło: www.habr.com

Dodaj komentarz