Tri skoky WireGuardu dosiahnu sieť bez verejnej adresy a potom stredný stroj prestane odpovedať na porte, na ktorom mal počúvať. Tunel ďalej stále funguje, vzdialený hostiteľ stále odpovedá a zvonka stíchol iba samotný stredný server. Táto kombinácia je mätúca práve preto, že je samovoľná: stredný skok poslúcha svoju vlastnú smerovaciu tabuľku a tabuľka posiela jeho odpovede nesprávnym smerom.

Reťaz, ktorý funguje, kým neprehovoríš so strednou krabicou

Vezmite ilustratívny reťaz: klient A dosiahne server B cez UDP 500 a B pokračuje ďalej na server C cez UDP 500. C prijíma prevádzku len z adresy svojho jediného partnera, čo z neho robí list a udržiava jeho správanie jednoduché. B nie je list a všetko zaujímavé na tejto poruche sa deje práve tam.

Rozdiel je dôležitý, pretože úlohy listu a stredu ťahajú opačnými smermi. List môže poslať všetko do jedného tunela bez následkov, keďže na ňom nič iné nezávisí. Stredný skok je zároveň koncovým bodom pre klientov a klientom smerom k vzdialenej strane, a tieto dve práce chcú iné smerovanie.

Prečo odpoveď odchádza tunelom

Na B nesie rozhranie obrátené k C AllowedIPs = 0.0.0.0/0 spolu s príslušnou predvolenou trasou. Preto každý paket, ktorý B vytvorí, ide do tohto tunela, ak nedostane prednosť niečo konkrétnejšie.

Paket z A adresovaný B príde a je prijatý, pretože B je cieľom a lokálne doručenie nastáva prvé. Odpoveď je úplne nový lokálne vytvorený paket namierený na verejnú adresu A a tento cieľ zodpovedá predvolenej trase do tunela. C ho prijme, nevlastní tú adresu a zahodí ho.

Príznak sa číta ako problém s firewallom alebo nezhoda kľúčov, a tu nie je pravda ani jedno. Zachytenie na tuneli smerom k C ukazuje, že odpovede idú nesprávnym smerom. To jediné pozorovanie ušetrí viac času než akékoľvek čítanie konfigurácie, tak si ho zapíšte, kým začnete meniť kľúče. Kto zachytenie nevidel, bude predpokladať, že je pokazený samotný tunel.

Úzka oprava: pravidlá politiky, ktoré zodpovedajú zdrojovému portu

Odpovede z počúvajúceho socketu B odchádzajú so zdrojovým portom 500. Pravidlo politiky sa na to môže zhodovať a poslať tie pakety späť do bežnej tabuľky:

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

Pravidlá politiky sa prehliadajú v poradí priority a hlavná tabuľka je na 32766, takže pravidlo na 100 sa pýta skôr, než sa predvolená trasa tunela dostane k slovu. Pridajte jeden záznam pre každý port, ktorý musí zostať dostupný zvonku, a nič viac, aby presmerovaná prevádzka naďalej používala tunel, pre ktorý bol postavený.

Poznajte hranicu tohto triku. Selektor sport zodpovedá lokálne vytvoreným paketom, čo pokrýva presne prípad odpovede a zámerne nepokrýva prevádzku, ktorú B len preposiela za niekoho iného. Služba hostovaná za B stále potrebuje svoju vlastnú odpoveď a predstieranie opaku dáva opravu, ktorá funguje pre prvú službu a zlyháva pre druhú.

Dajte pravidlu vlastníka

Pravidlo napísané do výzvy zmizne pri najbližšom prestavení rozhrania. V nastavení WireGuardu ho umiestnite tam, kde sa rozhranie vytvára a odstraňuje:

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

Ak rozhranie vlastní NetworkManager, distribučný hook alebo vstupný bod kontajnera, dvojica patrí tomu vlastníkovi a nie ručne upravenému súboru. Skontrolujte platné pravidlá po opätovnom pripojení, nie len po prvom štarte, pretože prvý štart je prípad, ktorý vždy funguje.

Porovnajte alternatívy čestne

Pravidlo zdrojového portu je jedna zo štyroch ciest von a je tá najužšia. Má výhodu, že sa vôbec nedotýka politiky tunela, a preto zvyčajne prežije neskoršie zmeny. Úzke opravy tiež hlasno zlyhávajú, keď prestanú platiť, zatiaľ čo široká výnimka ďalej ticho funguje dlho po tom, čo dôvod zmizol. Ten rozdiel je dôležitejší než elegancia, keď krabicu o dva roky vlastní niekto iný.

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 výbere overte z oboch koncov. Z A začnite spojenie na port B a chvíľu ho držte zaneprázdnené. Na B prinúťte jadro odôvodniť cestu odpovede niečím ako ip route get <address-of-A> sport 500 a potvrďte, že uvádza rozhranie WAN a nie tunel. Potom skontrolujte, že niečo za C stále odpovedá cez reťaz, čo dokazuje, že výnimka zostala úzka, namiesto toho aby sa zmenila na obchádzku. Nakoniec zapíšte porty do návrhových poznámok, inak to ďalší operátor znovu objaví pri inej službe.

Súvisiace články