Gnezdeni WireGuard: vmesni skok ne more odgovoriti na svoja lastna vrata
Ko vmesni skok pošlje vse v en tunel, odgovori na njegovo vhodno storitev odidejo po napačni poti. Pravilo izvornih vrat na vmesniku to popravi.
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.
| Approach | What it costs | Where it breaks |
|---|---|---|
| Source-port policy rule | One rule per exposed port | Anything B forwards rather than originates |
| Destination exception route | A route pinned to specific client addresses | Clients whose address changes |
| Stop full-tunnelling on B | Loses the catch-all path toward C | Designs that depend on it |
| Split into two tunnels | More interfaces and more policy | Nothing, 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.