Na macOS-u je sigurnosni prekidač samo onoliko dobar koliko je politika paketnog filtera iza njega, a pf je dio koji tu politiku provodi. Politika mora istovremeno raditi dvije suprotne stvari: pustiti klijenta do njegovog servera kako bi tunel mogao postojati, i zaustaviti sve ostalo da ne izlazi direktno. Većina objavljenih skupova pravila savlada drugo i zaboravi prvo, pa mašina izgubi vezu umjesto da dobije zaštitu. Verzija koja radi imenuje krajnju tačku, resolver i tunel, i ništa više.

Šta paketni filter može odlučiti, a šta ne

pf gleda interfejse, adrese, brojeve protokola i portove, i tu se zaustavlja. Nikada ne sazna koji je proces otvorio socket, pa dozvola napisana za jedan program postaje dozvola 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 sistemskom proširenju, ne ovoj datoteci.

Filter ne stvara ni rute. Kada klijent padne, podrazumijevana 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 poklapanja i pobjeđuje posljednje pravilo koje se poklopi, pa širok propust pri dnu nadjačava pažljive iznimke iznad njega. Označavanje propusta kao quick čini prvo poklapanje konačnim, što autor politike obično i misli.

Prvo pročitajte činjenice o interfejsu i krajnjoj tački

Bežični interfejsi nisu numerisani isto na svakom Macu, a uređaj tunela dobija broj koji se može promijeniti između podizanja sistema. 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 dozvoljava saobraćaj koji ste htjeli zaustaviti.

Prikupljajte činjenice dok je klijent povezan, jer uređaj tunela postoji samo tada. Trebaju vam interfejs koji drži podrazumijevanu rutu, uređaj koji je klijent stvorio, te adresa i port servera 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 komanda imenuje interfejs koji trenutno pobjeđuje, druga navodi svaki uređaj koji kernel zna, a treća prikazuje VPN konfiguracije koje sistem može pokrenuti. Zapišite te odgovore, pa pročitajte adresu i port servera iz klijentove vlastite konfiguracije.

Napišite skup pravila oko puta tunela

Datoteka ispod podrazumijevano odbija i ponovo dopušta pet stvari: loopback, uređaj tunela, put klijenta do njegovog servera, resolver koji se koristi prije nego tunel postoji, i dvije razmjene koje održavaju bežičnu vezu upotrebljivom. Imena interfejsa i adresa servera dolaze s vaše mašine, 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 sistemu da procijeni vrijedi li bežičnu vezu koristiti, a njeno uklanjanje stvara mašinu koja javlja da nema veze na ispravnoj mreži. Linija krajnje tačke je ono što OpenVPN-u uopće omogućava da stigne do svog servera; bez nje block all odbacuje vanjski handshake i tunel nikada ne ustaje. Linija resolvera uža je od opće DNS dozvole, jer imenuje jednu adresu i jedan port umjesto svakog upita koji mašina pošalje.

Te iznimke za krajnju tačku i resolver su dvije koje moraju postojati; sve ostalo ostaje blokirano. Ako klijent bira doslovnu adresu, izostavite liniju resolvera i zadržite liniju krajnje tačke. Ako se adresa servera promijeni, ažurirajte tu liniju prije sljedeće veze, ili napunite pf tabelu iz klijentove vlastite kuke i umjesto toga uparujte tabelu.

Spustite tunel, pa restartujte

Parsirajte prije učitavanja, jer je sintaksna greška jeftina u probnom pokretanju a skupa u udaljenoj sesiji. Zatim učitajte datoteku, uključite filter ako je bio isključen, i pročitajte šta je zapravo na snazi. Čitanje nije ceremonija: drugo sidro može dodati pravila koja niste napisali, pa uporedite odštampani 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

Sa učitanim pravilima, spustite tunel i pokušajte učitati stranicu. Običan saobraćaj treba stati, i treba ostati zaustavljen nakon što mašina zaspi i probudi se, jer se na tom prelazu vraća zastarjelo stanje. Ponovo se povežite i potvrdite da saobraćaj 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 filtera, pa skup pravila koji sada radi može biti neaktivan nakon restarta. Pokrenite zatim sudo pfctl -s info i potvrdite da statusna linija prijavljuje filter kao uključen.

Držite izlaz i put restarta poštenim

Skup pravila koji blokira sve može vas i zaključati od mašine kojom upravljate na daljinu. Uređujte iz lokalne sesije kad možete, držite prethodnu datoteku uz novu, i znajte povratak prije nego vam zatreba. Komande ispod isključuju filter i ponovo 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 privilegovani posao: apsolutne putanje, dnevnik koji možete poslije čitati, i test na mašini do koje fizički možete doći. Daemon koji tiho padne ostavlja mašinu nezaštićenom i normalnog izgleda.

Dokumentujte praznine, počevši od drugog VPN klijenta koji stvara vlastiti uređaj tunela. Vaša pravila imenuju jedan tunelski interfejs, pa drugi ostaje blokiran ili ga pokriva široko pravilo dodano kasnije. Interfejsi 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 uslovi pod kojima ona još vrijedi.

Povezani članci