Тэма падтрымкі заканчваецца вердыктам «сіметрычны NAT, VPN тут не будзе працаваць», і потым кліента тры разы дарэмна пераўсталёўваюць. Ярлык наносіць шкоду, бо адказвае на пытанне, якога ніхто не задаваў. Кліент, які злучаецца вонкі з фіксаваным серверам, стварае адлюстраванне ў момант адпраўкі першага пакета, і адказу дазваляецца вярнуцца паводле правілаў, якія рэалізуе амаль кожная сетка. Што адлюстраванне, залежнае ад канчатковага пункта, сапраўды ўскладняе — гэта два партнёры, якія спрабуюць дасягнуць адзін аднаго адначасова, і гэта іншае выпрабаванне.

За адным ярлыком хаваюцца два пытанні

Першае пытанне: ці можа хост за гэтай сеткай адкрыць сеанс да вядомага публічнага адраса і порта. Для кліента тунеля гэта звычайны выпадак, і адказ амаль заўсёды станоўчы. Маршрутызатар запісвае ўнутраныя крыніцы, выдзяляе знешні порт і прапускае адказ, бо ён належыць сеансу, які пачаўся знутры.

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

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

Адлюстраванне і фільтраванне — асобныя ўласцівасці

Тэрміналогія RFC дакладнейшая за назвы, якія ўжываюць пастаўшчыкі, і яе варта пераносіць у тыкет, бо яна спыняе спрэчкі. Адлюстраванне — гэта тое, як выдзяляецца знешні порт. Фільтраванне — гэта тое, якім уваходным пакетам дазволена праходзіць. Сетка можа быць строгай у адным і ліберальнай у другім, і менавіта гэтая камбінацыя — тое, што павінен перажыць пратакол аднарангавага абмену.

BehaviourWhat it meansEffect on a direct peer path
Endpoint-independent mappingOne external port for every destinationDiscovery works if the port is advertised
Address-dependent mappingNew port per remote addressWorks only if both sides probe the same pair
Address-and-port-dependentNew port per remote address and portUsually needs a relay

Трэці радок — гэта тое, што большасць спажывецкіх маршрутызатараў і мабільных аператараў маюць на ўвазе пад словам сіметрычны. Заўважце, што ярлык апісвае толькі выдзяленне. Сетка з такім адлюстраваннем і ліберальным фільтраваннем можа ўсё яшчэ прымаць уваходныя пакеты на порт, які яна толькі што выдзеліла, і менавіта таму прабіванне дзірак удаецца на адных з іх і не ўдаецца на іншых.

Фільтраванне мае свае тры выпадкі і сваю назву для кожнага. Запіс «сіметрычны NAT» у тыкеце, калі маецца на ўвазе «фільтраванне, залежнае ад адраса і порта», накіроўвае наступнага чалавека ў няправільны раздзел кіраўніцтва. Яны па-рознаму сябе вядуць падчас выпрабавання, таму памылка не акадэмічная.

Вымерайце адлюстраванне замест таго, каб называць яго

Вы можаце назіраць выдзелены порт непасрэдна з боку сервера любой службы UDP, якой кіруеце. Пачніце захоп на публічным хосце, адпраўце з кліента і прачытайце порт крыніцы, з якім прыйшоў пакет:

sudo tcpdump -ni eth0 -c 10 'udp port 51820'
sudo wg show wg0 endpoints
sudo conntrack -L -p udp --dport 51820

Радок канчатковага пункта — самы карысны з трох, бо WireGuard запісвае апошні адрас і порт, атрыманыя ад кожнага партнёра. Параўнайце гэты порт з тым, які кліент лічыць, што выкарыстоўвае. Яны будуць розніцца заўсёды, калі адбываецца любое пераўтварэнне, і важнае пытанне — ці застаецца значэнне стабільным.

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

Інструменты на аснове STUN паведамляюць тую ж класіфікацыю за адзін крок, і імі можна карыстацца, калі сетка дазваляе зыходны UDP да публічнага сервера STUN. Калі не дазваляе, метад захопу вышэй усё яшчэ працуе і не патрабуе нічога, акрамя хоста, які вы ўжо кантралюеце.

Выберыце выпраўленне, якое адпавядае збою

Калі збойная функцыя — аднарангавы абмен, падтрымліваныя адказы — рэтранслятар, служба сустрэчы, да якой абодва партнёры могуць дабрацца, або іншая тапалогія. TURN існуе менавіта для гэтага, і прадукт, які пастаўляе ўласны рэтранслятар, кажа вам, што чакае варожасці ў некаторых сетках.

Калі збойная функцыя — звычайны тунель, паводзіны адлюстравання не ваша праблема і нішто з вышэйпералічанага не прымяняецца. Праверце, што кліент сапраўды адпраўляе, што сервер бачыць пакет і што адказ вяртаецца. Гэтая паслядоўнасць — тры назіранні, і яна не патрабуе ведаць нічога пра катэгорыю NAT маршрутызатара.

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

Запісвайце архітэктуру, а не вердыкт

Карысная нататка кажа, які пратакол, у якім кірунку пачынаецца сеанс, ці ёсць рэтранслятар на шляху і што назіралася на провадзе. «сіметрычны NAT, не працуе» непрыдатна, бо яно адначасова памылковае адносна тунеля і неінфарматыўнае адносна шляху партнёра.

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

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

Падобныя артыкулы