FreeBSD ile PF (OpenBSD Packet Filter) Kullanimi

Serhat Selahattin Umar <serhat@secureinbox.net>

Cuma 7 Mayis 2004


OpenBSD'nin PF'inden vazgeçemeyen ve FreeBSD ile kullanmak isteyenler icin kucuk bir how-to, PF OpenBSD ekibi tarafindan gelistiriliyor ve OpenBSD ile beraber geliyor, FreeBSD icin ise 5.X serisine port edildi ve 5.X serisinde calisiyor.

PF in IPFW ya gore avanajlari

1. built-in macro expansion
2. Table support
3. built-in NAT
4. defeat NAT detection
5. direct logging via pflog interface
6. packet normalization
7. state modulation
8. powerful state tracking
9. automatic rule optimization
10. Queueing with ALTQ
11. Load balancing
12. packet tagging
13. SYN proxy
14. passive OS fingerprinting

PF de olupda IPFilter da olmayan ozellikler;

1. built-in macro expansion
2. defeat NAT detection
3. Table support
4. automatic rule optimization
5. Queueing with ALTQ
6. packet tagging
7. SYN proxy
8. passive OS fingerprinting


Kernel Ayarlari


Cekirdege uygulacaginiz eklentileri once kontrol edin yoksa ekleyin, default olarak "options PFIL_HOOKS" "options INET6" "device bpf" eklentilerini Generic kernel destekliyor, eklemeniz gereken options RANDOM_IP_ID fakat tekrar kernel derlemek istemiyor ve RANDOM_IP_ID eklemek istemiyorsaniz burayi atlayin ve kuruluma gecin, kurulumda RANDOM_IP_ID olmadan derleme yapmaniz gerekiyor.

Oncelikle Kernel derlememiz gerekiyor, kernel derleyebilmek icin sistemi kurarken source tree yi de kurmus olmaniz gerekiyor, PF'in calisabilmesi icin Kernela birkac ekleme yapmamiz lazim, simdi asagidaki option lari kernel dosyamiza ekliyoruz.

# cd /sys/i386/conf/
# cp GENERIC DUVAR
# ee DUVAR

options PFIL_HOOKS
options RANDOM_IP_ID
options INET6
device bpf

burada dikkat etmeniz gereken;

1-) "options INET6" belki IPV6 kullanmiyorsunuz ama yinede bunu kernel dosyanizda bulundurmaniz gerekiyor yoksa PF problem cikartiyor

2-) PFIL_HOOKS veya RANDOM_IP_ID bunlari kernelda 1 den fazla yazdiysaniz make yaparken hata alirsiniz, oncelikle kontrol edin yoksa ekleyin, PFIL_HOOKS default olarak 5.X serisinde var!

# config DUVAR
Kernel build directory is ../compile/DUVAR
Don't forget to do a ``make depend''
# cd ../compile/DUVAR
# make depend ; make ; make install

daha sonra yeni kernel ile acmak icin makinamizi reboot edelim

PF Kurulumu


Gelelim PF in kendisine... PF'in portu /usr/ports/security/pf altinda, port ile kurmak icin ;

# cd /usr/ports/security/pf
# make install

seklinde derliyoruz ve install ediyoruz, bandwidth limitasyonu icin ALTQ kullanmayi dusunuyorsaniz WITH_ALTQ=yes SYS_ALTQ=/usr/src/sys.altq parametresi ile derlemeniz gerekmekte. (Ben BW icin Dummynet kullaniyorum, bu arada PF ile beraber IPF ve IPFW da sistemde ayni anda kullanilabiliyor, IPF veya PF ile firewallculuk oynarken DUMMYNET ile bandwidth limitasyonu yapabilirsiniz)

# cd /usr/ports/security/pf
# make

# make install

Kernel ayarlarinda options RANDOM_IP_ID eklemediyseniz asagidaki sekilde derlemeniz gerekiyor

# make WITH_RANDOM_ID=yes
# make install

daha sonra " /etc/rc.conf " dosyamiza asagidaki satirlari ekliyoruz;

pf_enable="YES"
pf_logd="YES"
pf_conf="/usr/local/etc/pf.conf"

/usr/local/etc/rc.d/pf.sh dosyamiz sistem her acildiginda PF in aktif hale gelmesi icin gereklidir, dosyanin executable olarak rc.d nin altinda oldunu kontrol edin. Daha sonra sisteminizi yeniden baslattiginizda veya pf.sh calistirdiginca pf devreye girecektir
# /usr/local/etc/rc.d/pf.sh start

PF'in bir diger sekilde kaynak kodundan kendimiz kurmak istersek, kernel icin gerekli eklentilerin yapildigini varsayiyorum;

once pf portunu indirip uygun biryere acalim ve derleyelim, yukaridaki gibi cekirdege RANDOM_IP_ID yi eklemdiyseniz WITH_RANDOM_ID=yes parametresi ile derlemeniz gerekiyor;

# cd /tmp
# fetch http://pf4freebsd.love2party.net/pf_freebsd_2.03.tar.gz
# tar zxvf pf_freebsd_2.03.tar.gz
# cd pf_freebsd_2.03
# make

install etmeden önce farkli bir klasore kopyasini alip test edelim

# mkdir -p /tmp/pf_test
# cp ./pf/pf.ko ../pf_test/
# cp ./pflog/pflog.ko ../pf_test/
# cp ./pfsync/pfsync.ko ../pf_test/
# cp ./pfctl/pfctl ../pf_test/
# cp ./pflogd/pflogd ../pf_test/
# cp ./tcpdump/tcpdump ../pf_test/
# cd ../pf_test
# kldload ./pflog.ko
# kldload ./pfsync.ko
# ifconfig pflog0 up
# ifconfig pfsync0 up
# ./pflogd
# kldload ./pf.ko

kernel modullerini yukledikten sonra konsol ekraninda asagidaki gibi mesajlari alirsaniz islem tamamdir, herhangi bir hata alirsaniz buyuk ihtimalle kernel ayarlarinizda bir eksiklik var demektir...

pflog: $Name: VERSION_2_03 $
pfsync: $Name: VERSION_2_03 $

in6_ifattach: pflog0 is not multicast capable, IPv6 not enabled
in6_ifattach: pfsync0 is not multicast capable, IPv6 not enabled
pflog0: promiscuous mode enabled
pf: $Name: VERSION_2_03 $

hata almadiysaniz " make install " yapabilirsiniz.;

" /etc/rc.conf " dosyamiza asagidaki satirlari ekliyoruz;

pf_enable="YES"
pf_logd="YES"
pf_conf="/usr/local/etc/pf.conf"

daha sonra asagidaki scripti pf.sh olarak /usr/local/etc/rc.d icine yerlestirin ve her acilista calisacak sekilde execute yetkisi verin.

#!/bin/sh

/sbin/kldload /boot/kernel/pflog.ko
/sbin/kldload /boot/kernel/pfsync.ko
if [ -f /boot/kernel/pfaltq.ko ]; then
/sbin/kldload /boot/kernel/pfaltq.ko
fi
/sbin/ifconfig pflog0 up
/sbin/ifconfig pfsync0 up
/sbin/pflogd

kldload /boot/kernel/pf.ko
/sbin/pfctl -e -f /usr/local/etc/pf.conf

 

Simdi basit bir pf.conf dosyasi olusturup /usr/local/etc/ altina yerlestirelim;

###################################################
# Macros
###################################################
lan_net = "192.168.0.0/24"
int_if = "fxp1"
ext_if = "fxp0"
me="212.156.100.1"
admins = "212.156.100.208/29"
###################################################
# Set Optimizations
###################################################
set limit { frags 30000, states 25000 }
set loginterface $ext_if
scrub in all
###################################################
# Nat Rules
###################################################
nat on $ext_if from $lan_net to any -> ($ext_if)
rdr on $int_if proto tcp from any to any port 80 -> 127.0.0.1 port 3128 # Transparent Proxy
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021 # Transparent FTP Proxy
###################################################
# Firewall Rules
###################################################
block in on $ext_if all
pass in on $ext_if inet proto tcp from any port 20 to $ext_if port > 49151 user proxy flags S/SA keep state
pass in on $ext_if proto tcp from $admins to any flags S/SA keep state
pass out on $ext_if proto tcp from any to any flags S/SA modulate state
pass out on $ext_if proto { udp, icmp } from any to any keep state

Ates duvarimizin calistirmasini durdurmasini ve durumunu kontrol etmek icin pfctl komutunu kullaniyoruz, simdi firewall kurallarimizi yukleyelim;

pfctl -e -f /usr/local/etc/pf.conf

PF i disable etmek isterseniz

pfctl -d

tekrar enable etmek isterseniz

pfctl -e

komutlarini kullaniyoruz....

bazi pfctl parametreleri

pfctl -s nat # Nat kurallarini gosterir

pfctl -s rules # Firewall kurallarini gosteriri -v parametresi ile istatistik alabilirsiniz

pfctl -s state # State table gosterir

pfctl -s info # Filtreler hakkinda bilgi verir

pfctl -s all # Yukaridakilerin hepsi hakkinda bilgi verir



Kaynaklar


PF For FreeBSD : http://pf4freebsd.love2party.net/

Man 5 pf.conf

Man 8 pfctlf