macOS pf apsaugos jungiklis OpenVPN: taisyklės, kurios užsidaro
pf taisyklių rinkinys blokuoja tiesioginį srautą, kol tunelis nuleistas. Išsaugokite kliento kelią į jo serverį, tada įrodykite blokavimą išjungę tunelį.
macOS apsaugos jungiklis yra tik toks geras, kokia yra už jo esanti paketų filtro politika, o pf yra dalis, kuri tą politiką vykdo. Politika turi daryti du priešingus dalykus vienu metu: leisti klientui pasiekti savo serverį, kad tunelis galėtų egzistuoti, ir sustabdyti viską kita nuo tiesioginio išėjimo. Dauguma paskelbtų taisyklių rinkinių susitvarko su antruoju ir pamiršta pirmąjį, todėl mašina praranda ryšį, o ne įgyja apsaugą. Veikianti versija įvardija galinį tašką, sprendiklį ir tunelį, ir nieko daugiau.
Ką paketų filtras gali nuspręsti, o ko ne
pf žiūri į sąsajas, adresus, protokolų numerius ir prievadus, ir ten sustoja. Jis niekada nesužino, kuris procesas atidarė lizdą, todėl vienai programai parašytas leidimas tampa leidimu kiekvienai programai, kuri gali pasiekti tą patį prievadą. Taip dosni UDP išimtis paverčia apsaugos jungiklį atgal į paprastą tinklą. Aplikaciją suprantantis blokavimas priklauso klientui arba sistemos plėtiniui, o ne šiam failui.
Filtras taip pat nekuria maršrutų. Kai klientas nukrenta, numatytasis maršrutas gali vis dar rodyti į negyvą tunelį, ir pf paverčia tai užblokuotais paketais, o ne tyliu grįžimu prie Wi-Fi. Blokavimas yra numatytas rezultatas, o ne gedimas, kurį reikia apeiti.
Rezultatą dažniau lemia tvarka, o ne taisyklės tekstas. Be quick pf toliau vertina po atitikimo ir laimi paskutinė atitinkanti taisyklė, todėl platus praleidimas apačioje panaikina kruopščias išimtis virš jo. Pažymėjus praleidimus quick, pirmas atitikimas tampa galutinis, ir būtent to paprastai nori politikos autorius.
Pirmiausia perskaitykite sąsajos ir galinio taško faktus
Belaidės sąsajos ne kiekviename Mac numeruojamos vienodai, o tunelio įrenginys gauna numerį, kuris gali pasikeisti tarp įkrovimų. Taisyklė, įvardijanti neegzistuojantį įrenginį, nepavyksta analizuojant, ir tai garsu bei lengva pagauti, o taisyklė, įvardijanti netinkamą esamą įrenginį, išanalizuojama švariai ir praleidžia srautą, kurį norėjote sustabdyti.
Faktus rinkite, kol klientas prisijungęs, nes tunelio įrenginys egzistuoja tik tada. Jums reikia sąsajos, kuri laiko numatytąjį maršrutą, kliento sukurto įrenginio, ir serverio, į kurį jis skambina, adreso bei prievado. Būtent šią paskutinę reikšmę dauguma taisyklių rinkinių praleidžia, ir dėl to nukopijuotas rinkinys blokuoja savo paties tunelį.
route -n get default
ifconfig -l
scutil --nc list
Pirmoji komanda įvardija sąsają, kuri dabar laimi, antroji išvardija kiekvieną branduoliui žinomą įrenginį, o trečioji parodo VPN konfigūracijas, kurias sistema gali paleisti. Užsirašykite tuos atsakymus, tada perskaitykite serverio adresą ir prievadą iš paties kliento konfigūracijos.
Rašykite taisyklių rinkinį aplink tunelio kelią
Toliau pateiktas failas pagal numatytuosius nustatymus draudžia ir vėl įleidžia penkis dalykus: loopback, tunelio įrenginį, kliento kelią į jo serverį, sprendiklį, naudojamą prieš atsirandant tuneliui, ir du mainus, kurie palaiko belaidį ryšį tinkamu naudoti. Sąsajų pavadinimai ir serverio adresas ateina iš jūsų mašinos, todėl pakeiskite patvirtintas reikšmes. Tunelio numeris taip pat nesutaps su jūsų.
set skip on lo0
block all
pass out quick on utun0
# maintain this line when the server address changes
pass out quick on en1 inet proto udp to 203.0.113.10 port 1194
# only the resolver the client uses before the tunnel exists
pass out quick on en1 inet proto udp to 192.0.2.53 port 53
pass out quick on en1 inet proto udp from any port 68 to any port 67
pass out quick on en1 inet proto udp to 224.0.0.251 port 5353
DHCP eilutė egzistuoja todėl, kad Mac prašo adreso anksčiau, nei jį turi, todėl užklausa išeina iš 68 prievado link 67 prievado be tinkamo šaltinio adreso. Multicast eilutė leidžia sistemai spręsti, ar verta naudoti belaidį ryšį, o ją pašalinus gaunama mašina, kuri veikiančiame tinkle praneša, kad nėra ryšio. Galinio taško eilutė yra tai, kas leidžia OpenVPN apskritai pasiekti savo serverį; be jos block all numeta išorinį rankos paspaudimą ir tunelis niekada nepakyla. Sprendiklio eilutė siauresnė už bendrą DNS leidimą, nes įvardija vieną adresą ir vieną prievadą, o ne kiekvieną užklausą, kurią atlieka mašina.
Tos galinio taško ir sprendiklio išimtys yra dvi, kurios turi egzistuoti; visa kita lieka užblokuota. Jei klientas skambina tiesioginiu adresu, pašalinkite sprendiklio eilutę ir palikite galinio taško eilutę. Jei serverio adresas keičiasi, atnaujinkite tą eilutę prieš kitą prisijungimą arba užpildykite pf lentelę iš kliento paties kablio ir vietoje to derinkite lentelę.
Nuleiskite tunelį, tada paleiskite iš naujo
Analizuokite prieš įkeldami, nes sintaksės klaida pigi sauso bandymo metu ir brangi nuotolinėje sesijoje. Tada įkelkite failą, įjunkite filtrą, jei jis buvo išjungtas, ir perskaitykite, kas iš tikrųjų galioja. Perskaitymas nėra ceremonija: kitas inkaras gali pridėti taisyklių, kurių neparašėte, todėl palyginkite atspausdintą rinkinį su savo failu.
sudo pfctl -n -v -f /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
sudo pfctl -s rules
sudo pfctl -s Anchors
sudo pfctl -a <anchor> -s rules
sudo pfctl -s info
Kai taisyklės įkeltos, nuleiskite tunelį ir pabandykite įkelti puslapį. Įprastas srautas turėtų sustoti ir turėtų likti sustabdytas po to, kai mašina užmiega ir pabunda, nes būtent tame perėjime senoji būsena vėl įsliūkina. Prisijunkite iš naujo ir patvirtinkite, kad srautas atsinaujina neliečiant taisyklių rinkinio. Jei naršyklė vis dar veikia nuleidus tunelį, kokia nors taisyklė yra platesnė, nei manėte, ir perskaitymas paprastai ją įvardija.
Paleidimas iš naujo yra ta dalis, kurią žmonės praleidžia. macOS įkrovimo metu skaito /etc/pf.conf, bet failo skaitymas nėra tas pats, kas filtro įjungimas, todėl dabar veikiantis taisyklių rinkinys po pakartotinio paleidimo gali būti neaktyvus. Po to paleiskite sudo pfctl -s info ir patvirtinkite, kad būsenos eilutė praneša filtrą kaip įjungtą.
Laikykite išėjimą ir paleidimo kelią sąžiningus
Taisyklių rinkinys, blokuojantis viską, taip pat gali užrakinti jus nuo mašinos, kurią administruojate nuotoliniu būdu. Redaguokite iš vietinės sesijos, kai galite, laikykite ankstesnį failą šalia naujojo ir žinokite grąžinimo kelią, kol jo dar nereikia. Toliau pateiktos komandos išjungia filtrą ir iš naujo įkelia jūsų saugomą kopiją, ir tai yra seka, kurią reikia vykdyti iš konsolės, o ne per ką tik nukirptą tunelį. Penkių sekundžių grąžinimas kiekvieną kartą nugali gudrią taisyklę.
sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules
Tvarumui reikia paleidimo tarnybos, kuri vykdo pfctl -e ir įkrovimo metu įkelia jūsų failą. Elkitės su ja kaip su bet kuriuo kitu privilegijuotu darbu: absoliutūs keliai, žurnalas, kurį galėsite perskaityti vėliau, ir bandymas mašinoje, kurią galite fiziškai pasiekti. Tyliomis nepavykstanti tarnyba palieka mašiną neapsaugotą ir atrodančią įprastai.
Dokumentuokite spragas, pradėdami nuo antro VPN kliento, kuris sukuria savo tunelio įrenginį. Jūsų taisyklės įvardija vieną tunelio sąsają, todėl antroji lieka užblokuota arba ją pagauna vėliau pridėta plati taisyklė. Tethering ir hotspot sąsajos atsiranda tik kartais ir vertos tos pačios pastabos. Nė viena iš tų spragų nėra priežastis praleisti politiką; tai sąlygos, kuriomis ji vis dar galioja.