OpenBSD 4.6-os előtti verziók esetén a /etc/rc.conf.local fájlba vegyük fel a következőt:
pf=
A rendszer a szabályokat a /etc/pf.conf fájlból tölti be.
4.6 verziótól kezdve a csomagszűrő alapértelmezetten be van kapcsolva, így nincs más dolgunk, mint a /etc/pf.conf fájlt nekünk tetsző módon beállítani. Amennyiben ki szereténk kapcsolni a csomagszűrőt, a következőt vegyük fel a /etc/rc.conf.local fájlba:
pf=NO
FreeBSD esetén a következő beállításokat kell elvégezni:
Az /etc/rc.conf fájlba írjuk be a következő sorokat:
pf_enable="YES" # a PF engedélyezése (a modul betöltése, ha kell) pf_rules="/etc/pf.conf" # a pf szabályait tartalmazó állomány pf_flags="" # a pfctl indításához szükséges további paraméterek pflog_enable="YES" # a pflogd elindítása pflog_logfile="/var/log/pflog" # hol tartsa a pflogd az naplóit pflog_flags="" # a pflogd indításához szükséges paraméterek
Ezzel nagyjából készen is lennénk, hacsak nem akarunk ALTQ-t használni. Ha igen új kernelt kell forgatnunk, amiben a következőket kell bedrótozni:
options ALTQ options ALTQ_CBQ # osztályozás alapú besorolás (Class Bases Queuing, CBQ) options ALTQ_RED # véletlen korai észlelés (Random Early Detection, RED) options ALTQ_RIO # RED befele/kifele options ALTQ_HFSC # hiearchikus csomagütemező (Hierarchical Packet Scheduler, HFSC) options ALTQ_PRIQ # prioritásos besorolás (Priority Queuing, PRIQ) options ALTQ_NOPCC # az SMP esetén kell
A log fájlt a következő módon tudjuk interaktív módon olvasni:
% tcpdump -n -e -ttt -i pflog0
Ha csak lepörgetni szeretnénk a fájlt használjuk következő parancsot:
% tcpdump -n -e -ttt -r /var/log/pflog
Az eddigi szabályok törlése és újak beolvasása az /etc/pf.conf.proba fájlból:
% pfctl -F all -f /etc/pf.conf.proba
Az /etc/pf.conf állomány ellenőrzése a benne levő szabályok betöltése nélkül:
% pfctl -vnf /etc/pf.conf
A pftop nevű programmal pedig top-szerűen figyelhetjük az aktuális kapcsolatokat. A ports fából könnyen telepíthető.
% pftop -s1
Az aktuális szabályok és az csomagok száma amire alkalmazták őket:
% pfctl -v -s rules
Ezt szűrhetjük az alkalmazott szabályokra is:
% pfctl -v -s rules | grep -B 1 "Packets: [1-9]"
A GNU/Linuxos körökben elterjedt és igen kedvelt, illetve hasznos script, a fail2ban funkcionalitása igen könnyen megvalósítható a PF segítségével. Először is létre kell hoznunk egy táblát, amiben a kizárt IP címeket tárolja a csomagszűrő.
table <ssh_bruteforce> persist
A persist kapcsoló azt jelenti, hogy a tábla akkor is létrejön, ha nem tartalmaz IP címet, így menet közben fel lehet tölteni. Másodszor felvesszük azt a tiltó szabályt, ami a táblában szereplő IP címeket teljesen kizárja.
block in log quick from <ssh_bruteforce>
A quick kapcsoló segítségével érjük el azt, hogy a szabály további elemeit ne vizsgálja azokra az IP-kre, amik a táblában vannak, így mindenképpen tiltásra kerülnek. Harmadszor összeállítjuk a szabályt, ami a figyelendő portot engedélyezi és a meghatározott csatlakozások esetén tiltja a bejövő IP címet.
pass in quick on $ext_if inet proto tcp from any to $ext_if port 22 flags S/SA synproxy state (max-src-conn-rate 3/60, overload <ssh_bruteforce> flush global)
Ez a szabály 60 másodpercenként 3 kapcsolódást engedélyez a 22-es tcp portra. Amelyik IP ezt meghaladja az bekerül az ssh_bruteforce táblába. A flush global opció a táblába töltéskor törli az összes olyan elő kapcsolatot, amelyiknek köze van az imént kitiltott IP címhez, így biztosítva azt, hogy nem marad kiskapu a támadónak.
A tiltott IP címeket az alábbi paranccsal tudod kilistázni.
pfctl -t ssh_bruteforce -vTshow
Kitiltott IP címet az alábbi paranccsal tudsz törölni.
pfctl -t ssh_bruteforce -vTdelete [IP]
FreeBSD alatt előfordulhat, hogy még sem indul el rendszerindításkor a PF tűzfal. Ennek egyik oka lehet, hogy a sysctrl-ban az IPFW van beállítva indítandó tűzfalként. Ha ez így van az /etc/sysctl.conf-fájba írjuk be:
net.inet.ip.fw.enable=0