Vietinė programa, VPN taisyklė: kodėl jūsų FORWARD grandinė niekada nesuveikia
Procesas mašinoje naudoja OUTPUT, o ne FORWARD. Pasirinkite kablį teisingoje vardų erdvėje, tada nuspręskite, ar pakanka žymos, ar paprasto maršruto.
Pridedate taisyklę VPN srautui FORWARD grandinėje, paleidžiate užklausą iš tos pačios Linux mašinos, o skaitiklis lieka nulyje. Taisyklė greičiausiai teisinga. Paketas niekada nėjo šiuo keliu, nes mašinoje pačioje sugeneruotos užklausos ji nepersiunčia. Paketo gyvenimo kelio nuo lizdo iki laido stebėjimas paaiškina, kodėl taip yra ir kur taisyklė iš tikrųjų turėtų būti.
Raskite, kur paketas gimė
Netfilter kabių tvarka atskiria tris atvejus, ir tik vienas jų susijęs su FORWARD:
| 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 |
Vietinė programa pradedama OUTPUT kelyje, nes branduolys jau nustatė, kad paketas atsiranda čia ir niekada nėra persiuntimo kandidatas. Tunelio sukūrimas šios klasifikacijos nekeičia; tunelis yra įrenginys, per kurį paketas gali išeiti, o ne etapas, kuris vietinę išvestį paverčia tranzitu.
Du paketai, viena istorija
Kai tunelis pakeltas, vidinis programos paketas ir užšifruotas išorinis paketas yra skirtingi objektai. Vidinis paketas neša paskirties vietą ir naudingąją apkrovą, kurią pasirinko programa. Išorinis paketas neša šifrotekstą į partnerio adresą ir prievadą, ir būtent jis realiai kerta fizinę sąsają.
Jūsų politika liečia vieną iš jų, o netinkamo pasirinkimas yra dažna priežastis, kodėl taisyklė atrodo nieko nedaranti. Taisyklė, atitinkanti partnerio išorinį adresą, mato kiekvieną tunelio paketą vienodai, kad ir ką darytų vidinė programa. Taisyklė, atitinkanti vidinę paskirties vietą, mato srautą, kuris jums rūpi, ir ji suveiks tik tada, kai tas paketas pasieks kablį, ant kurio įdiegėte taisyklę.
Vardų erdvės perkelia ribą
Konteineris tai apsunkina nekeisdamas principo. Programos užklausa yra vietinė išvestis konteinerio tinklo vardų erdvėje. Hostas tą srautą priima virtualioje Ethernet sąsajoje ir gali jį persiųsti, todėl FORWARD taisyklė hoste gali turėti prasmę, nors užklausą sukūręs procesas niekada nelietė hosto OUTPUT grandinės.
Prieš pasirinkdami kablį, nustatykite, kur iš tikrųjų gyvena taisyklių rinkinys ir tunelis. Tunelis konteinerio viduje, tunelis hoste su konteineriu, maršrutizuotu per jį, ir tunelis atskiroje vardų erdvėje yra trys skirtingos topologijos su trimis skirtingomis taisyklių vietomis. Skaitykite taisykles vardų erdvėje, kuriai priklauso įrenginys, o ne tik numatytojoje.
Paklauskite, ar žymos apskritai reikia
Jei tikslas yra siųsti vieną paskirties priešdėlį per tunelį, šiam priešdėliui gali pakakti maršruto. Pirmiausia patikrinkite galiojančius maršrutus, įskaitant viską, ką serveris įstūmė: peradresuotas numatytasis maršrutas per VPN siunčia daug daugiau srauto nei siaura politika, kurią turėjote omenyje, ir joks žymėjimo kiekis rezultato nesuderins su ketinimu.
Klasifikacija reikalinga, kai sprendimas priklauso nuo kažko, ko maršrutas negali išreikšti, pavyzdžiui, šaltinio, naudotojo ar proceso. Gautam srautui žymėjimas PREROUTING veikia. Vietiniam srautui žymėjimas turi įvykti išvesties etape, kuris po žymos nustatymo gali paskatinti naują maršruto paiešką. Naudojant nftables tai yra route tipo grandinė išvesties kabliuke; įprasta išvesties filtro grandinė nustatys reikšmę ir paliks maršrutą nepakeistą.
Naudojant iptables, atitikmuo gyvena mangle OUTPUT išdėstyme, ir galioja tas pats reikalavimas: maršrutizavimo sprendimą reikia peržiūrėti po to, kai žyma atsiranda. Tada politikos taisyklė turi sunaudoti žymą ir nurodyti lentelę, kurioje yra tinkamas maršrutas. Conntrack žymos nustatymas yra trečia, atskira operacija; ji išsaugo reikšmę sraute ir pati savaime neįdeda tos reikšmės į dabartinį paketą, kad maršrutizavimas galėtų ją perskaityti.
Patikrinkite paiešką ir skaitiklį kartu
nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1
Adresas ir žyma yra iliustraciniai, o dvi maršruto užklausos atsako į skirtingus klausimus. Antroji klausia, ką branduolys darytų, jei paketas turėtų tą žymą; ji neparodo, kad jūsų taisyklių rinkinys tokią priskiria. Traktuokite tai kaip hipotezės testą, o ne kaip įrodymą, kad politika veikia.
Tada paleiskite nekenksmingą užklausą ir stebėkite du dalykus vienu metu: skaitiklį pasirinktame kabliuke ir išėjimą, kurį paketas realiai pasirinko. Jei skaitiklis juda, o paketas išeina kitur, žyma arba lentelė neteisinga. Jei nejuda nė vienas, paketas apskritai nepasiekia to kabliuko, ir kitas klausimas yra vardų erdvė arba kelias.
Galiausiai apribokite testą tuo, ką mechanizmas gali išreikšti. Vienas maršrutas vienam adresui netampa nuolatine politika paslaugai, kurios adresai keičiasi. Pirmiausia nuspręskite paketų aprėptį, tada patikrinkite, ar maršrutizavimo ir žymėjimo dizainas gali išlaikyti tą aprėptį po pakartotinio prisijungimo.