macOS pf sigurnosni prekidač za OpenVPN: pravila koja se zatvaraju
Skup pf pravila blokira izravni promet dok je tunel spušten. Zadržite put klijenta do njegovog poslužitelja, a zatim dokažite blokadu s isključenim tunelom.
Na macOS-u je sigurnosni prekidač samo onoliko dobar koliko je politika paketnog filtra iza njega, a pf je dio koji tu politiku provodi. Politika mora istodobno raditi dvije suprotne stvari: pustiti klijenta do njegovog poslužitelja kako bi tunel mogao postojati, i zaustaviti sve ostalo da ne izlazi izravno. Većina objavljenih skupova pravila savlada drugo i zaboravi prvo, pa stroj izgubi vezu umjesto da dobije zaštitu. Verzija koja radi imenuje krajnju točku, razrješivač i tunel, i ništa više.
Što paketni filtar može odlučiti, a što ne
pf gleda sučelja, adrese, brojeve protokola i portove, i tu se zaustavlja. Nikada ne sazna koji je proces otvorio utičnicu, pa dopuštenje napisano za jedan program postaje dopuštenje za svaki program koji može doći do istog porta. Tako izdašna UDP iznimka pretvara sigurnosni prekidač natrag u običnu mrežu. Blokiranje svjesno aplikacije pripada klijentu ili sustavnom proširenju, ne ovoj datoteci.
Filtar ne stvara ni rute. Kada klijent padne, zadana ruta može još pokazivati na mrtav tunel, a pf to pretvara u blokirane pakete umjesto tihog povratka na Wi-Fi. Blokada je željeni ishod, a ne kvar koji treba zaobići.
Poredak odlučuje ishod češće nego tekst pravila. Bez quick pf nastavlja procjenu nakon podudaranja i pobjeđuje posljednje pravilo koje se podudara, pa širok propust pri dnu nadjačava pažljive iznimke iznad njega. Označavanje propusta kao quick čini prvo podudaranje konačnim, što autor politike obično i misli.
Prvo pročitajte činjenice o sučelju i krajnjoj točki
Bežična sučelja nisu numerirana isto na svakom Macu, a uređaj tunela dobiva broj koji se može promijeniti između podizanja sustava. Pravilo koje imenuje nepostojeći uređaj pada pri parsiranju, što je glasno i lako uhvatiti, dok pravilo koje imenuje pogrešan postojeći uređaj prolazi čisto i dopušta promet koji ste htjeli zaustaviti.
Prikupljajte činjenice dok je klijent povezan, jer uređaj tunela postoji samo tada. Trebaju vam sučelje koje drži zadanu rutu, uređaj koji je klijent stvorio, te adresa i port poslužitelja koji bira. Upravo tu posljednju vrijednost većina skupova pravila izostavlja, a izostavljanje je razlog zašto kopiran skup blokira vlastiti tunel.
route -n get default
ifconfig -l
scutil --nc list
Prva naredba imenuje sučelje koje trenutačno pobjeđuje, druga navodi svaki uređaj koji kernel zna, a treća prikazuje VPN konfiguracije koje sustav može pokrenuti. Zapišite te odgovore, pa pročitajte adresu i port poslužitelja iz klijentove vlastite konfiguracije.
Napišite skup pravila oko puta tunela
Datoteka ispod zadano odbija i ponovno dopušta pet stvari: loopback, uređaj tunela, put klijenta do njegovog poslužitelja, razrješivač koji se koristi prije nego tunel postoji, i dvije razmjene koje održavaju bežičnu vezu upotrebljivom. Imena sučelja i adresa poslužitelja dolaze s vašeg stroja, pa zamijenite vrijednosti koje ste potvrdili. Ni broj tunela neće odgovarati vašem.
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 linija postoji jer Mac traži adresu prije nego što je ima, pa zahtjev izlazi s porta 68 prema portu 67 bez upotrebljive izvorne adrese. Multicast linija dopušta sustavu da procijeni vrijedi li bežičnu vezu koristiti, a njeno uklanjanje stvara stroj koji javlja da nema veze na ispravnoj mreži. Linija krajnje točke je ono što OpenVPN-u uopće omogućuje da stigne do svog poslužitelja; bez nje block all odbacuje vanjski handshake i tunel nikada ne ustaje. Linija razrješivača uža je od općeg DNS dopuštenja, jer imenuje jednu adresu i jedan port umjesto svakog upita koji stroj pošalje.
Te iznimke za krajnju točku i razrješivač su dvije koje moraju postojati; sve ostalo ostaje blokirano. Ako klijent bira doslovnu adresu, izostavite liniju razrješivača i zadržite liniju krajnje točke. Ako se adresa poslužitelja promijeni, ažurirajte tu liniju prije sljedeće veze, ili napunite pf tablicu iz klijentove vlastite kuke i umjesto toga uparujte tablicu.
Spustite tunel, pa restartajte
Parsirajte prije učitavanja, jer je sintaksna greška jeftina u probnom pokretanju a skupa u udaljenoj sesiji. Zatim učitajte datoteku, uključite filtar ako je bio isključen, i pročitajte što je zapravo na snazi. Čitanje nije ceremonija: drugo sidro može dodati pravila koja niste napisali, pa usporedite ispisani skup sa svojom datotekom.
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
S učitanim pravilima, spustite tunel i pokušajte učitati stranicu. Obični promet treba stati, i treba ostati zaustavljen nakon što stroj zaspi i probudi se, jer se na tom prijelazu vraća zastarjelo stanje. Ponovno se povežite i potvrdite da promet nastavlja bez diranja skupa pravila. Ako preglednik još radi sa spuštenim tunelom, neko pravilo je šire nego što ste mislili, a čitanje obično kaže koje.
Restart je dio koji ljudi preskaču. macOS čita /etc/pf.conf pri podizanju, ali čitanje datoteke nije isto što i uključivanje filtra, pa skup pravila koji sada radi može biti neaktivan nakon restarta. Pokrenite zatim sudo pfctl -s info i potvrdite da statusna linija prijavljuje filtar kao uključen.
Držite izlaz i put restarta poštenim
Skup pravila koji blokira sve može vas i zaključati od stroja kojim upravljate na daljinu. Uređujte iz lokalne sesije kad možete, držite prethodnu datoteku uz novu, i znajte povratak prije nego vam zatreba. Naredbe ispod isključuju filtar i ponovno učitavaju kopiju koju ste sačuvali, a to je slijed za konzolu, ne za tunel koji ste upravo presjekli. Povratak u pet sekundi pobjeđuje pametno pravilo svaki put.
sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules
Trajnost zahtijeva launch daemon koji pokreće pfctl -e i učitava vašu datoteku pri podizanju. Tretirajte ga kao svaki drugi privilegirani posao: apsolutne putanje, dnevnik koji možete poslije čitati, i test na stroju do kojeg fizički možete doći. Daemon koji tiho padne ostavlja stroj nezaštićenim i normalnog izgleda.
Dokumentirajte praznine, počevši od drugog VPN klijenta koji stvara vlastiti uređaj tunela. Vaša pravila imenuju jedno tunelsko sučelje, pa drugi ostaje blokiran ili ga pokriva široko pravilo dodano kasnije. Sučelja za tethering i hotspot pojavljuju se samo ponekad i zaslužuju istu bilješku. Nijedna od tih praznina nije razlog da preskočite politiku; to su uvjeti pod kojima ona još vrijedi.