Zakaj vaša javna storitev Linux odgovarja prek VPN
Lokalna storitev lahko sprejema na eth0 in odgovarja prek VPN s polnim tunelom. Pravilo vira s popolno tabelo WAN ohrani te odgovore na prvotni poti.
Nič v vtičnici se ne spomni, kateri vmesnik je prenesel zahtevo, zato lahko privzeta pot VPN s polnim tunelom ujame odgovor, ki spada v WAN. Storitev ne ignorira vhodnega vmesnika; Linux usmerja lokalno ustvarjen odgovor glede na cilj in politiko vira. Pravilo, ki temelji na viru, lahko namesto tega pošlje samo odgovore storitve skozi popolno tabelo WAN, običajni izhod pa pusti na tunelu. Vrata ostanejo odprta, medtem ko odgovor odhaja po napačni poti, zato je simptom videti enostranski.
Napačna predstava: odgovori sledijo vmesniku, po katerem so prispeli
Zdi se logično, da paket, ki prispe na eth0, odide na eth0. Brezstanjski paketni filtri se lahko zapišejo tako, tcpdump na vhodni strani pa pokaže zahtevo točno tam, kjer jo pričakujemo. Usmerjanje za promet, ki ga gostitelj ustvari sam, ne deluje tako.
Ko storitev sprejme povezavo, je njen odgovor nov lokalno ustvarjen paket. Jedro preveri pravila usmerjanja za cilj in vir odgovora, privzeta pot VPN pa je povsem veljaven odgovor. Nič v vtičnici se ne spomni, kateri vmesnik je prenesel zahtevo.
Zato je simptom videti enostranski: zahteve prihajajo, odgovori izginjajo. Zato tudi dodajanje pravila požarnega zidu za vhodna vrata ničesar ne spremeni. Paket ni blokiran na poti noter; usmerjen je nekam drugam na poti ven. Sledite odgovoru s poizvedbo, kvalificirano z virom, in obvoz postane viden.
Kaj jedro v resnici usmerja: naslov vira
Prijem, ki ga potrebujete, je lokalni naslov, ki ga storitev uporablja za odgovore. Na gostitelju z ilustrativnim naslovom eth0 192.0.2.10/24 in prehodom 192.0.2.1 je ta naslov prisoten na vmesniku. Na VM v oblaku je javni naslov morda preveden višje in ga v gostu ni, zato uporabite naslov, ki ga gostitelj res ima.
Preden rezervirate številko tabele ali prioriteto pravila, preglejte trenutno stanje. Obstoječa pravila politike lahko zasenčijo novo, stara tabela z isto številko pa lahko že nosi nepovezane poti:
ip -4 addr show dev eth0
ip -4 rule show
ip -4 route show table all
Nato izberite tabelo glede na vir. Pravilo se ujema z odgovori, ki že nosijo 192.0.2.10, natanko z lokalno zaključenim prometom, ki ga želite izvzeti. Posredovani promet in paketi z drugih lokalnih naslovov se ne ujemajo.
Zgradite popolno povratno tabelo, ne polovice privzete poti
Tabela samo s privzeto potjo ni dovolj. Jedro mora še vedno razrešiti prehod, ta razrešitev pa potrebuje povezano predpono v isti tabeli. Tabela brez te predpone odpove pri razrešitvi prehoda, tudi ko je njena privzeta pot videti pravilna. Dodajte oboje, nato usmerite pravilo vira na tabelo:
ip -4 route add table 100 192.0.2.0/24 dev eth0 src 192.0.2.10
ip -4 route add table 100 default via 192.0.2.1 dev eth0
ip -4 rule add priority 1000 from 192.0.2.10/32 lookup 100
Uporabite pravo predpono in pravi prehod, namesto da kopirate primer. Vmesnik v oblaku, konfiguriran kot /32 s prehodom on-link, potrebuje drugačno povezano pot, tabela, zgrajena iz napačne predpone, pa odpove že na prvem skoku. Atribut src navaja prednostni vir za to pot; ne nadomešča pravila vira.
Tudi vrstni red je pomemben. Široko pravilo z nižjo prioritetno številko se ovrednoti prvo, zato je treba do pravila vira priti pred katerim koli pravilom, ki bi ta promet poslalo nazaj v glavno tabelo. Preverite prioritete s ip rule show po dodajanju, ne le ob zagonu.
Preverite s poizvedbo, kvalificirano z virom
Zaprosite jedro, naj usmeri preskusni cilj z naslova storitve. Odgovor bi moral navesti eth0 in prehod WAN, ne tunela:
ip -4 route get 198.51.100.25 from 192.0.2.10
Nato vzpostavite novo pooblaščeno povezavo in opazujte obe smeri. Poizvedba, ki izbere pravo tabelo, medtem ko živa povezava še vedno odpove, kaže na filtriranje povratne poti ali pravilo požarnega zidu, ne na tabelo. Preverite te nadzore, preden karkoli globalno izklopite.
Končne poti in pravilo postavite pod upravitelja omrežja, ki mu vmesnik pripada. Spremembe naslova, obnovitev DHCP in ponovne povezave VPN prepišejo stanje jedra, ročno dodano pravilo pa po naslednjem dogodku izgine ali kaže na zastarel prehod.
Kje se ta izjema ustavi
Pravilo izvzame lokalno zaključen promet z enega naslova vira. Ne zajema vrat, ki jih objavi Docker, DNAT ali storitev, posredovanih skozi gostitelja, ker se ti paketi usmerjajo kot posredovani promet in nikoli ne nosijo lokalnega vira gostitelja na enak način. Takšne zasnove običajno potrebujejo oznako, nastavljeno na vhodu, in pravilo, ki se ujema z oznako.
Prav tako ne povzroči, da bi se javni naslov gostitelja pojavil na vmesniku. Ko je ta naslov v lasti NAT nad njim, mora odgovor še vedno oditi po poti, ki jo ta NAT pričakuje, zato mora tabela WAN zrcaliti prvotni prehod in predpono, ne pa ugibano javno območje.
Izjemo hranite dokumentirano s številko tabele, prioriteto pravila in natančnim naslovom vira. Naslednja sprememba VPN ali vmesnika jo lahko tiho pokvari, opomba s tremi vrednostmi pa se preveri hitreje kot ponovno odkrivanje simptoma iz poročila stranke.
Če storitev še vedno odgovarja po napačni poti, potem ko poizvedba, kvalificirana z virom, uspe, primerjajte naslov vira žive vtičnice s tistim v pravilu. Storitev, vezana na nadomestni naslov, lahko izbere drugačen vir od preskušenega naslova, in to neskladje je preostala vrzel.