Trije skoki WireGuard dosežejo omrežje brez javnega naslova, nato pa vmesni stroj preneha odgovarjati na vratih, na katerih bi moral poslušati. Tunel naprej še vedno deluje, oddaljeni gostitelj še vedno odgovarja, in samo vmesni strežnik je utihnil od zunaj. Ta kombinacija je zmedena prav zato, ker je sama povzročena: vmesni skok uboga svojo lastno usmerjevalno tabelo, tabela pa pošilja njegove odgovore v napačno smer.

Veriga, ki deluje, dokler se ne pogovoriš z vmesno škatlo

Vzemimo ponazoritveno verigo: odjemalec A doseže strežnik B na UDP 500, B pa gre naprej do strežnika C na UDP 500. C sprejema promet samo z naslova svojega edinega partnerja, kar ga naredi za list in ohrani njegovo vedenje preprosto. B ni list, in vse zanimivo pri tej okvari se zgodi tam.

Razlika je pomembna, ker vlogi lista in sredine vlečeta v nasprotni smeri. List lahko pošlje vse v en tunel brez posledic, saj nič drugega ni odvisno od njega. Vmesni skok je hkrati končna točka za odjemalce in odjemalec proti oddaljeni strani, in ti dve nalogi želita drugačno usmerjanje.

Zakaj odgovor odide skozi tunel

Na B nosi vmesnik, obrnjen proti C, AllowedIPs = 0.0.0.0/0 skupaj z ustrezno privzeto potjo. Zato gre vsak paket, ki ga B ustvari, v ta tunel, razen če ima kaj bolj določnega prednost.

Paket z A, naslovljen na B, prispe in je sprejet, ker je B cilj in se lokalna dostava zgodi prva. Odgovor je popolnoma nov lokalno ustvarjen paket, usmerjen na javni naslov A, in ta cilj se ujema s privzeto potjo v tunel. C ga prejme, ne poseduje tega naslova in ga zavrže.

Simptom se bere kot težava s požarnim zidom ali neujemanje ključev, in tu ni res ne eno ne drugo. Zajem na tunelu proti C pokaže, da odgovori gredo v napačno smer. To eno opažanje prihrani več časa kot kakršna koli količina branja konfiguracije, zato ga zapišite, preden začnete menjati ključe. Kdor zajema ni videl, bo domneval, da je pokvarjen sam tunel.

Ozka poprava: pravila politike, ki se ujemajo z izvornimi vrati

Odgovori iz poslušajoče vtičnice B odidejo z izvornimi vrati 500. Pravilo politike se lahko ujame s tem in te pakete pošlje nazaj v običajno tabelo:

ip rule add sport 500 table main priority 100
ip rule add sport 8080 table main priority 101

Pravila politike se pregledujejo po vrstnem redu prednostnih nalog, glavna tabela pa je na 32766, zato se pravilo na 100 vpraša, preden ima privzeta pot tunela kaj povedati. Dodajte en vnos za vsaka vrata, ki morajo ostati dosegljiva od zunaj, in nič več, da bo preusmerjeni promet še naprej uporabljal tunel, za katerega je bil zgrajen.

Poznajte mejo te trika. Izbirnik sport se ujema z lokalno ustvarjenimi paketi, kar pokriva natanko primer odgovora in namerno ne pokriva prometa, ki ga B samo posreduje za nekoga drugega. Storitev, gostovana za B, še vedno potrebuje svoj lastni odgovor, pretvarjanje nasprotnega pa da popravek, ki deluje za prvo storitev in zataji za drugo.

Dajte pravilu lastnika

Pravilo, vtipkano v poziv, izgine ob naslednji ponovni izgradnji vmesnika. V nastavitvi WireGuard ga postavite tja, kjer se vmesnik ustvari in odstrani:

PostUp = ip rule add sport 500 table main priority 100
PostDown = ip rule del sport 500 table main priority 100

Če vmesnik lasti NetworkManager, namestitveni kavelj ali vstopna točka vsebnika, par pripada temu lastniku in ne ročno urejeni datoteki. Preverite veljavna pravila po ponovni povezavi, ne le po prvem zagonu, ker prvi zagon je primer, ki vedno deluje.

Primerjajte alternative pošteno

Pravilo izvornih vrat je eden od štirih izhodov in najozji med njimi. Ima prednost, da se politike tunela sploh ne dotakne, zato običajno preživi poznejše spremembe. Ozke poprave tudi glasno odpovejo, ko prenehajo veljati, medtem ko široka izjema še dolgo tiho deluje po tem, ko je razlog zanjo izginil. Ta razlika je pomembnejša od elegance, ko ima čez dve leti škatlo nekdo drug.

ApproachWhat it costsWhere it breaks
Source-port policy ruleOne rule per exposed portAnything B forwards rather than originates
Destination exception routeA route pinned to specific client addressesClients whose address changes
Stop full-tunnelling on BLoses the catch-all path toward CDesigns that depend on it
Split into two tunnelsMore interfaces and more policyNothing, at the cost of complexity

Po izbiri preverite z obeh koncev. Z A začnite povezavo na vrata B in jo nekaj časa držite zasedeno. Na B prisilite jedro, da utemelji pot odgovora z nečim, kot je ip route get <address-of-A> sport 500, in potrdite, da navaja vmesnik WAN in ne tunela. Nato preverite, da nekaj za C še vedno odgovarja skozi verigo, kar dokazuje, da je izjema ostala ozka, namesto da bi se spremenila v obvoz. Na koncu zapišite vrata v načrtovalske opombe, sicer bo naslednji operater to znova odkril pri drugi storitvi.

Sorodni članki