Ужыванне NAT Traversal для злучэння карыстальнікаў у пасіўным рэжыме

Гэты артыкул уяўляе сабой вольны пераклад адной з запісаў у блогу распрацоўшчыкаў DC++.

З дазволу аўтара (а таксама для нагляднасці і цікавасці дзеля) я расквеціў яе спасылкамі і дапоўніў некаторымі асабістымі пошукамі.

Увядзенне

У наш час прынамсі адзін карыстач з пары якія злучаюцца павінен знаходзіцца ў актыўным рэжыме. Механізм "абыходу" NAT будзе карысны ў выпадку, калі актыўны рэжым не настроены ні ў адной з бакоў. Звычайна гэта адбываецца па чынніку блакавання ўваходных злучэнняў брандмаўарам ці прыладай NAT.

Калі абодва кліента ў актыўным рэжыме

Кліент-ініцыятар адпраўляе ўтрымоўвальную яго ўласны IP-адрас і порт каманду $ConnectToMe іншаму кліенту. Выкарыстоўваючы гэтыя дадзеныя, які атрымаў каманду кліент усталёўвае злучэнне з ініцыятарам.

Калі адзін з кліентаў у пасіўным рэжыме

Праз хаба пасіўны кліент A адпраўляе каманду $RevConnectToMe актыўнаму кліенту B, які затым адказвае камандай $ConnectToMe.

Ужыванне NAT Traversal для злучэння карыстальнікаў у пасіўным рэжыме
У якасці сервера S у выпадку вышэй выступае DC хаб

Калі абодва кліента ў пасіўным рэжыме на ADC хабе

Якія знаходзяцца за рознымі NAT кліенты A и B далучыліся да хаба S.

Ужыванне NAT Traversal для злучэння карыстальнікаў у пасіўным рэжыме
Так злучэнне з хабам выглядае з боку кліента A

Хаб прымае падлучэнні на порт 1511. Кліент A ажыццяўляе выходныя злучэнні са сваёй прыватнай сеткі праз порт 50758. Хаб, у сваю чаргу, бачыць адрас прылады NAT, працуе з ім і транслюе кліентам адпаведна іх ідэнтыфікатарам.

Кліент A адпраўляе серверу S паведамленне з просьбай дапамагчы злучыцца з кліентам B.

Hub: [Outgoing][178.79.159.147:1511] DRCM AAAA BBBB ADCS/0.10 1649612991

Будучы таксама ў пасіўным рэжыме, кліент B, атрымаўшы гэтую каманду, павінен паведаміць свой прыватны порт, які выкарыстоўваецца для злучэння з хабам з дапамогай NAT.

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

Пасля атрымання гэтай інфармацыі кліент A адразу ж спрабуе ўсталяваць злучэнне з кліентам B і паведамляе свой уласны прыватны порт.

Hub:		[Outgoing][178.79.159.147:1511]	 	D<b>RNT</b> AAAA BBBB ADCS/0.10 <b>50758</b> 1649612991

У чым цікавасць? Цікавасць у зняцці канчатковай кропкі аднаго і таго ж злучэння шляхам стварэння новага падключэння на публічны адрас праз ужо выкарыстоўваецца прыватны порт.

Ужыванне NAT Traversal для злучэння карыстальнікаў у пасіўным рэжыме
Бінга!

Безумоўна, пры гэтым NAT кліента B мае поўнае права адхіліць першы запыт на злучэнне ад кліента A, Але ўжо яго ўласны запыт накіроўваецца ў «дзірку», створаную гэтым самым злучэннем, і сувязь-ткі усталёўваецца.

Ужыванне NAT Traversal для злучэння карыстальнікаў у пасіўным рэжыме
Ілюстрацыя, прыдатная да ўсяго працэсу з агаворкай, што пратакол не выкарыстоўвае публічныя парты, адкрытыя сесіяй NAT-S, а таксама прыватныя адрасы.

Эпілог

На момант напісання (арыгінальнай) артыкула прыкладна палова DC кліентаў працуе ў пасіўным рэжыме. Гэта азначае, што чацвёртая частка ўсіх магчымых злучэнняў не можа быць ажыццёўлена.

У далейшым DC++ зможа "абыходзіць" NAT, выкарыстоўваючы існуючыя злучэнні A-S и B-S для ўсталявання прамога злучэння кліент‒кліент, нават калі A и B знаходзяцца ў пасіўным рэжыме.

Крыніца: habr.com

Дадаць каментар