Kohalik rakendus, VPN-reegel: miks sinu FORWARD-kett ei käivitu kunagi
Masinas olev protsess kasutab OUTPUT-i, mitte FORWARD-i. Vali hook õiges nimeruumis ja otsusta siis, kas piisab märgist või tavalisest marsruudist.
Lisad VPN-liiklusele reegli FORWARD-ketti, käivitad päringu samast Linuxi masinast ja loendur jääb nulli. Reegel on tõenäoliselt õige. Pakett ei läinud kunagi seda teed, sest masinal endal tekkinud päringut see edasi ei edasta. Paketi teekonna jälgimine soklist juhtmeni selgitab, miks see nii on ja kuhu reegel tegelikult kuulub.
Leia, kus pakett sündis
Netfilteri hookide järjekord eristab kolme juhtu ja ainult üks neist hõlmab FORWARD-i:
| Origin | Path | Hook that sees it |
|---|---|---|
| Local process | OUTPUT then POSTROUTING | OUTPUT, POSTROUTING |
| Addressed to a local service | PREROUTING then INPUT | PREROUTING, INPUT |
| Received for another host | PREROUTING, FORWARD, POSTROUTING | FORWARD |
Kohalik rakendus algab OUTPUT-teel, sest tuum on juba kindlaks teinud, et pakett pärineb siit ega ole kunagi edasisaatmise kandidaat. Tunnelit luues see liigitus ei muutu; tunnel on seade, mille kaudu pakett võib väljuda, mitte etapp, mis muudab kohaliku väljundi läbisõiduks.
Kaks paketti, üks lugu
Kui tunnel on püsti, on rakenduse sisemine pakett ja krüpteeritud väline pakett erinevad objektid. Sisemine pakett kannab sihtkohta ja koormust, mille rakendus valis. Väline pakett kannab šifreeritud teksti partneri aadressile ja pordile ning just see läbib tegelikult füüsilise liidese.
Sinu poliitika puudutab ühte neist ja vale valimine on tavaline põhjus, miks reegel näib mitte midagi tegevat. Reegel, mis vastab partneri välisele aadressile, näeb iga tunnelipaketti ühtemoodi, ükskõik mida rakendus sees teeb. Reegel, mis vastab sisemisele sihtkohale, näeb liiklust, mis sind huvitab, ja see käivitub ainult siis, kui see pakett jõuab hookini, kuhu reegli paigaldasid.
Nimeruumid nihutavad piiri
Konteiner teeb selle raskemaks, muutmata põhimõtet. Rakenduse päring on kohalik väljund konteineri võrgu nimeruumis. Host võtab selle liikluse vastu virtuaalsel Etherneti liidesel ja võib selle edasi saata, nii et FORWARD-reegel hostil võib olla mõttekas, kuigi päringu tekitanud protsess ei puudutanud kunagi hosti OUTPUT-ketti.
Enne hooki valimist tee kindlaks, kus reeglistik ja tunnel tegelikult asuvad. Tunnel konteineri sees, tunnel hostil koos konteineri marsruutimisega selle kaudu ja tunnel eraldi nimeruumis on kolm erinevat topoloogiat kolme erineva reeglite paigutusega. Loe reegleid selle nimeruumi sees, millele seade kuulub, mitte ainult vaikimisi omas.
Küsi, kas sul on üldse märki vaja
Kui eesmärk on saata üks sihtkoha prefiks tunnelist läbi, võib selle prefiksi marsruut olla piisav. Kontrolli esmalt kehtivaid marsruute, sealhulgas kõike, mida server peale surus: ümbersuunatud vaikemarsruut saadab VPN-i kaudu palju rohkem liiklust kui kitsas poliitika, mida silmas pidasid, ja ükski märgistuse hulk ei tee tulemust kavatsusega kooskõlas.
Liigitust on vaja siis, kui otsus sõltub millestki, mida marsruut ei suuda väljendada, näiteks allikast, kasutajast või protsessist. Vastuvõetava liikluse puhul töötab märgistamine PREROUTING-is. Kohaliku liikluse puhul peab märgistamine toimuma väljundetapil, mis suudab pärast märgi seadmist käivitada uue marsruudiotsingu. Nftablesis on see route-tüüpi kett väljundhookil; tavaline väljundfiltri kett seab väärtuse ja jätab marsruudi muutmata.
Iptablesis elab vaste mangle OUTPUT-i paigutuses ja kehtib sama nõue: marsruudiotus tuleb uuesti läbi vaadata pärast märgi olemasolu. Seejärel peab poliitikareegel märgi ära tarbima ja osutama tabelile, mis sisaldab kasutatavat marsruuti. Conntrack-märgi seadmine on kolmas, eraldi toiming; see salvestab väärtuse voolule ega pane seda väärtust iseenesest praegusele paketile, et marsruutimine saaks seda lugeda.
Kontrolli otsingut ja loendurit koos
nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1
Aadress ja märk on näitlikud ning kaks marsruudipäringut vastavad erinevatele küsimustele. Teine küsib, mida tuum teeks, kui pakett kannaks seda märki; see ei näita, et sinu reeglistik mõne määrab. Käsitle seda hüpoteesi testina, mitte tõendina, et poliitika töötab.
Seejärel käivita kahjutu päring ja jälgi kahte asja korraga: loendurit valitud hookil ja väljapääsu, mille pakett tegelikult valis. Kui loendur liigub ja pakett lahkub mujalt, on märk või tabel vale. Kui kumbki ei liigu, ei jõua pakett sellesse hooki üldse ja järgmine küsimus on nimeruum või tee.
Lõpuks piira test sellega, mida mehhanism suudab väljendada. Üks marsruut ühe aadressi jaoks ei muutu püsivaks poliitikaks teenuse jaoks, mille aadressid pöörlevad. Otsusta esmalt pakettide ulatus ja seejärel kontrolli, kas marsruutimise ja märgistamise lahendus suudab seda ulatust pärast uuesti ühendamist hoida.