Tunelis atrodo veikiantis tik po to, kai serveris pirmiausia ką nors išsiunčia. Pradėkite nuo kliento — nieko nevyksta, palaukite kelias sekundes, bandykite dar kartą — ir pavyksta. Įprasta diagnozė yra sulaužytas NAT, ir įprasta diagnozė yra klaidinga. Pasikeitė tai, kad viena pusė sužinojo, kur gyvena kita.

Galinio taško žinojimas, o ne pasiekiamumas

WireGuard pusė nepradės rankos paspaudimo, kol nežinos, kur jį siųsti. Konfigūracija tai pateikia kaip adreso ir prievado galinį tašką, o veikianti būsena seka galinį tašką, kuriuo ji dabar tiki.

wg show atspausdina abi to vaizdo puses, o pusė be galinio taško išvestyje negali nieko pradėti, kad ir kokie teisingi būtų jos viešasis raktas ir leidžiami priešdėliai. Prieš keisdami bet kurią taisyklę, palyginkite kliento vaizdą su serverio, nes jiedu dažnai nesutaria, kas ką žino.

Kaip pusė sužino galinį tašką

WireGuard yra tyčia tylus. Kai teisingai autentifikuotas paketas atvyksta iš adreso, kurio pusė nesitikėjo, įgyvendinimas atnaujina tos pusės galinį tašką į naują šaltinį, ir būtent taip veikia roamingas nešiojamajame kompiuteryje, kuris keičia tinklus. Toks elgesys paaiškina priklausomybę nuo krypties: jei serveris siunčia pirmas ir jo paketas pasiekia klientą, klientas sužino dabartinį serverio adresą ir gali atsakyti. Iki tol jam nėra kur siųsti. Mechanizmas yra autentifikuotas roamingas, o ne pasitikėjimo pirmuoju naudojimu trumpinys, nes paketas turėjo būti galiojantis prieš pasislenkant galiniam taškui.

wg įrankių dokumentacija aprašo tą atnaujinimą, ir verta ją perskaityti kartą, jei ketinate projektuoti aplink tai.

Būseną išlaikantis vertimas prideda savo kryptį

Kai UDP eina per verčiantį tinklų sietuvą, sietuvas sukuria būseną pirmam matomam paketui. RFC 4787 aprašo tą elgesį ir terminus, kurie galiausiai pašalina susiejimą. Neaktyvus susiejimas baigiasi, ir tada sietuvas atmeta iš tolimosios pusės ateinantį paketą dar prieš jam pasiekiant kompiuterį. Visą rytą veikęs tunelis nustoja atsakinėti po pietų būtent dėl šios priežasties.

Tai antras ir nepriklausomas mechanizmas, sukeliantis tą patį krypties simptomą. Ir galinio taško žinojimas, ir vertimo būsena turi būti teisingi, o vieno pataisymas nepataiso kito.

Konfigūruokite kryptį, kurios iš tikrųjų norite

Klientui, kuris turi pradėti ryšį, įdėkite serverio galinį tašką į kliento pusių skiltį ir palikite jį ten. Pasikliauti tuo, kad serveris siųs pirmas, reiškia pasikliauti atsitiktinumu srauto tvarkoje, kuris pasikeis tyliame tinkle. Konfigūracija turėtų nurodyti numatytą kryptį, o ne ją atrasti.

Pusei už vertimo, kuri turi likti pasiekiama, toje pusėje įjunkite nuolatinį keepalive. Keepalive kas 25 sekundes yra įprasta pradinė reikšmė, o jo tikslas yra išlaikyti susiejimą atvirą, o ne testuoti tunelį. Pasirinkite vieną pusę, kuri jį neš, nes įjungus abiejose pusėse srautas ir žurnalo triukšmas padvigubėja nepagerindami rezultato.

Palyginkite būseną prieš ir po suveikimo

Užfiksuokite abu vaizdus tuo metu, kai nepavyksta, o paskui dar kartą po to, kai serveris išsiunčia. Pirmoji komanda rodo galinius taškus ir rankos paspaudimo amžių. Antroji rodo, ar prievadui yra vertimo įrašas. Užrašas rodo, kuri kryptis iš tikrųjų kirto laidą, o maršruto patikra patvirtina, kad klientas to srauto nesiunčia visai kitur.

wg show
conntrack -L -p udp 2>/dev/null | grep 51820
tcpdump -ni any -c 20 'udp port 51820'
ip route get 198.51.100.7

Užsirašykite galinio taško stulpelį ir vertimo įrašą kartu. Pusė be galinio taško ir sietuvas be susiejimo yra dvi skirtingos gedimo rūšys. Tik vieną iš jų ištaiso keepalive.

Susiję straipsniai