Приложение на NAT Traversal за свързване на потребители в пасивен режим

Тази статия представлява свободен превод на една от публикациите в блога на разработчиците на DC++.

С разрешение на автора (как и заради ясността и интереса) я обогатих с линкове и добавих лични наблюдения.

Въведение

В момента поне един потребител от двойката, която се свързва, трябва да бъде в активен режим. Механизмът за "обход" на NAT ще бъде полезен, когато активният режим не е настроен от никоя от страните. Обикновено това се случва поради блокировка на входящите връзки от защитна стена или устройство NAT.

Ако и двамата клиенти са в активен режим

Клиент-инициатор изпраща команда, съдържаща собственото му IP-адрес и порт $ConnectToMe на друг клиент. Използвайки тези данни, клиентът, получил командата, установява връзка с инициатора.

Ако един от клиентите е в пасивен режим

Чрез хаба пасивният клиент A изпраща команда $RevConnectToMe на активния клиент Б, който след това отговаря с командата $ConnectToMe.

Приложение на NAT Traversal за свързване на потребители в пасивен режим
Като сървър S в случая по-горе е DC хаб

Ако и двамата клиенти са в пасивен режим на ADC хабе

Клиенти, намиращи се зад различен NAT, A и Б са се свързали с хаба S.

Приложение на NAT Traversal за свързване на потребители в пасивен режим
Така изглежда свързването с хаба от страната на клиента A

Хабът приема връзки на порт 1511. Клиентът A осъществява изходящи връзки от своята частна мрежа през порт 50758. Хабът, от своя страна, вижда адреса на устройството NAT, работи с него и предава на клиентите съответно техните идентификатори.

Клиент A изпраща на сървъра S съобщение с молба за помощ за свързване с клиента Б.

Хъб: [Изходящ][178.79.159.147:1511] DРЦМ AAAA BBBB ADCS/0.10 1649612991

Бъдещият клиент, който също е в пасивен режим, Б, получава тази команда и трябва да съобщи своя частен порт, използван за свързване с хаба чрез NAT.

Хъб: [Incoming][178.79.159.147:1511] DNAT BBBB AAAA ADCS/0.10 59566 1649612991

След получаване на тази информация клиентът A сразу се опитва да установи връзка с клиента Б и съобщава своя собствен частен порт.

Хъб:		[Изходящ][178.79.159.147:1511]	 	Д<b>РНТ</b> AAAA BBBB ADCS/0.10 <b>50758</b> 1649612991

Какво е интересното? Интересът е в изместването на крайната точка на същата връзка чрез създаването на ново свързване към публичен адрес през вече използван частен порт.

Приложение на NAT Traversal за свързване на потребители в пасивен режим
Бинго!

Безусловно, в този случай NAT на клиента Б има пълното право да откаже първото искане за свързване от клиента A, но вече неговото собствено искане се насочва към "дупката", създадена от това свързване, и връзката все пак се установява.

Приложение на NAT Traversal за свързване на потребители в пасивен режим
Илюстрация, приложима към целия процес с уговорката, че протокол не използва публични портове, отворени сесия NAT‒S, както и частни адреси.

Епилог

Към момента на писане (оригиналната) статия, около половината от клиентите на DC работят в пасивен режим. Това означава, че четвърт от всички възможни връзки не могат да бъдат осъществени.

В по-нататъшно DC++ ще може да "обхожда" NAT, използвайки съществуващи връзки A‒S и Б‒S за установяване на пряка връзка клиент-клиент, дори ако A и Б са в пасивен режим.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster