Užblokuoti vieną OpenVPN klientą iš LAN nesustabdant tunelio
Pririškite kliento tunelio adresą prie jo sertifikato, numeskite jo LAN srautą FORWARD pradžioje, tada patikrinkite IPv6, sekamas sesijas ir išlikimą po perkrovimo.
Vienas klientas jūsų OpenVPN serveryje turi netekti prieigos prie LAN, o visi kiti tuneliai turi likti veikti. Jei to ieškosite, geriausias atsakymas paprastai sako, kad demonas to negali, ir tai tik pusė tiesos: OpenVPN neturi ugniasienės kiekvienam klientui, bet hostas, kuris užbaigia tunelį, jau filtruoja paketus. Du svarbiausi sprendimai yra tapatybė, kurią blokuojate, ir taisyklės vieta. Padarykite tai teisingai, ir pakeitimas taps viena eilute, kurią galite išbandyti ir pašalinti.
Pririškite klientą prieš rašydami taisyklę
OpenVPN nuomoja tunelio adresus iš baseino, todėl 10.8.0.6 yra vieta, o ne asmuo. Sesijai pasibaigus nuoma grįžta ir gali būti perduota kitam ryšiui, vadinasi, taisyklė, parašyta prieš tą adresą, seka vietą, o ne naudotoją. Todėl pirmiausia nuspręskite, ką iš tikrųjų blokuojate: adresą trumpam eksperimentui ar sertifikatą tam, ką norite laikyti lauke.
Kad susietumėte adresą su sertifikatu, sukurkite failą kataloge, kurį nurodo client-config-dir, ir duokite failui tiksliai sertifikato common name. Įrašykite vieną direktyvą, ifconfig-push 10.8.0.6 255.255.255.0, ir tas klientas išlaiko tą patį tunelio adresą perjungiant ryšį. Kad tai veiktų, turi būti du nustatymai: client-config-dir turi būti deklaruotas serverio konfigūracijoje, o siunčiamas adresas turi būti potinklyje, kurį serveris gali maršrutizuoti. Jei vieno trūksta, failas ignoruojamas be klaidos, todėl kitas ugniasienės testas tampa klaidinantis.
Laikinas blokavimas gali naudoti baseino adresą, jei biliete įrašyta, kuri sesija jį tuo metu turėjo.
Tvarka lemia, ar numetimas bus vykdomas
Linux šliuze, kuris persiunčia tarp tunelio ir LAN, paketai eina per grandinę FORWARD. Skaitykite žemiau esančią komandą kaip sakinį: įterpkite į FORWARD pradžią, suderinkite srautą, ateinantį iš tun0, iš to vieno hosto, nukreiptą į LAN potinklį, ir numeskite jį.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I yra tai, kas paleidžia taisyklę. Pridėta su -A, ji atsiduria žemiau bet kokio plataus leidimo tunelio potinkliui ir niekada nemato paketo. Patikrinkite vietą su iptables -vnL FORWARD --line-numbers ir perskaitykite skaitiklius: numetimas viršuje, kuris nieko neskaičiuoja, reiškia, kad srautas ateina kitu keliu.
Paties šliuzo LAN adresas yra kitas kelias. Paketai, siunčiami į pačią dėžę, eina į INPUT, o ne į FORWARD, todėl klientas gali netekti LAN hosto ir vis tiek atidaryti maršrutizatoriaus administravimo puslapį. Pridėkite atitinkamą INPUT taisyklę, kai tai svarbu.
Ko filtras negali matyti
Filtravimas vyksta vertinant paketą, todėl nustatyta TCP sesija gali tęstis, kol bus uždaryta arba atstatyta. Jei blokavimas turi įgelti iškart, išvalykite sekamus to šaltinio srautus su conntrack -D -s 10.8.0.6 įdėję taisyklę. Jei kelių sekundžių persidengimas priimtinas, užrašykite tą pasirinkimą, o ne palikite jį numanomą. Bet kuriuo atveju kitas žmogus turi žinoti, ar taisyklė stabdo gyvą srautą, ar tik naujus ryšius.
Srautas tarp bendraamžių niekada nepaliečia hosto ugniasienės. Kai client-to-client įjungtas, OpenVPN persiunčia tuos paketus demono viduje, todėl jų nemato nei FORWARD, nei INPUT. Vieninteliai sprendimai yra išjungti client-to-client arba pripažinti, kad bendraamžiai gali pasiekti vienas kitą; iptables taisyklė to srauto nematys.
IPv6, programinė įranga ir išlikimas po perkrovimo
IPv4 taisyklė nieko nesako apie IPv6. Jei tunelis ir LAN neša abi šeimas, lygiavertė taisyklė turi būti ip6tables arba nftables taisyklių rinkinyje, kuris tame hoste valdo politiką. Maršrutizatoriaus programinė įranga dažnai slepia netfilter už savo abstrakcijos, todėl iš forumo nukopijuota sintaksė ir lentelių pavadinimai gali netikti.
OpenWrt dokumentuotas kelias yra ugniasienės konfigūracijos įrašas, o ne ranka rašyta iptables eilutė, ir ranka rašyta eilutė gali išnykti, kai ugniasienė įkeliama iš naujo. Kitos distribucijos atkuria taisykles per netfilter-persistent, įkrovos vienetą arba gamintojo saugyklą, ir šie mechanizmai nėra keičiami. Įrodykite pasirinktąjį perkrovimu, nes įkėlimas iš naujo praktikuoja kitą kelią.
Patikrinkite pagal kelią, tada grąžinkite švariai
Tikrinkite kiekvieną kelią atskirai, nes vienas sėkmingas patikrinimas paslepia kitus. Užblokuotas klientas turėtų vis tiek pasiekti internetą per tunelį, bet nepavykti prieš LAN hostą, antras klientas turėtų pasiekti tą patį hostą, o šliuzo adresas ir bendraamžio kelias kiekvienas reikalauja savo stebėjimo. Rašykite rezultatus prie taisyklės, kad kitas pakeitimas turėtų atspirties tašką. Lentelė žemiau yra rinkinys, kurį verta palikti biliete.
| Kelias | Tikimasi su taisykle | Kai nepavyksta |
|---|---|---|
| Užblokuotas klientas į LAN hostą | Nėra atsakymo | Taisyklė yra žemiau leidimo, arba šaltinis nesutampa |
| Užblokuotas klientas į internetą | Veikia per tun0 | Taisyklė per plati, be paskirties sutapimo |
| Antras klientas į tą patį LAN hostą | Veikia | Taisyklė sutapo su daugiau nei numatytu hostu |
| Užblokuotas klientas į šliuzo LAN adresą | Blokuojama tik su atitinkama INPUT taisykle | Trūksta INPUT taisyklės |
| Užblokuotas klientas į bendraamžio tunelio adresą | Vis dar veikia | client-to-client įjungtas ir už ugniasienės ribų |
Grąžinimas yra trynimas pagal specifikaciją, o ne flush: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP pašalina būtent tą įrašą ir palieka likusią grandinę nepaliestą. Pašalinkite tą pačią eilutę iš bet kurio failo, kuris atkuria taisykles įkrovimo metu, įkelkite jį iš naujo ir patvirtinkite, kad klientas vėl pasiekia LAN hostą. FORWARD flush panaikintų ir taisykles, kurių nerašėte, todėl grąžinimas taptų antru incidentu.
Prieš uždarydami bilietą patvirtinkite tris dalykus: prisegtas adresas atitinka sertifikatą, taisyklė yra virš leidimų ir skaitiklis nelygus nuliui, o patvarumo faile yra ta pati taisyklė, kurią testavote. Jei ko nors trūksta, blokavimas yra shell sesijos iliuzija.