[ YAZICI GORUNUMU ]


TURKCE BELGELENDIRME PROJESI


BELGE HAKKINDA:

Bu belge "GNU Free Documentation Licence" ile kaynak gosterilmek ve onceden yazarindan izin alinmak kaydiyla yeniden yayinlanabilir.
Belgedeki eksik, yanlis ya da gelistirilmesi gerektigini dusundugunuz yerleri e-posta yoluyla bildirebilirsiniz.

Bu belgenin en guncel haline, http://www.enderunix.org/docs/openbsd_squid_dansguardian_pf.php adresinden ulasabilirsiniz.

Belgenin Ilk Olusturulma Tarihi: 10 Aralik 2006
Belgenin Son Guncellenme Tarihi: 12 Subat 2007

YAZAR HAKKINDA:

Hakan OZAY [ArkHe]

hakan [at] enderunix [nokta] org

BELGE ICERIGI:

1- OpenBSD KURULUMU
2- PROXY GOREVI ICIN SQUID KURULUMU
3- ICERIK FILTRELEME ICIN DANSGUARDIAN KURULUMU
4- PF(PACKET FILTER) AKTIF EDILMESI
- YARARLANILAN KAYNAKLAR

1- OpenBSD KURULUMU (v4.0)

Oncelikle hizli bicimde OpenBSD kurulumunu gerceklestirelim.
Bu belge hazirlanirken OpenBSD 4.0 surumu kulanilmistir, ancak genel manada koklu degisiklikler olmayacagi dusuncesiyle surum bagimsiz dusunulebilir.

Halen edinmediyseniz oncelikle OpenBSD kurulumunu nasil edineceginize bakalim. OpenBSD ekibi ISO dosyasini dagitmamaktadir. Ya OpenBSD ISO'muzu kendimiz yapacagiz, ya bunu bizim icin hazirlayan birinden(guvenilir olmak sartiyla) kullanacagiz, ya da en iyisi OpenBSD sitesinden CD satin alacagiz(kendi yaptigimiz ISO'dan kat kat fazla icerige sahip olacak). Bu satilan CD'ler cok cuzi miktarlara(~EUR 50) satilmakta ve tam bir paket listesine sahip olarak dagitilmaktadir. Isin destek tarafini da ele alirsak OpenBSD CD'lerini satin almaniz en birinci ve en guzel yoldur.

- CD / T-Shirt / Poster satin alabileceginiz adres: http://www.openbsd.org/orders.html
-
Huzeyfe Onal tarafindan hazirlanan ISO dosyasini edinebileceginiz adres: http://files1.enderunix.org/openbsd-iso/
- Kendi ISO dosyanizi yaratmak konusunda bilgi alabileceginiz adres: http://ipucu.enderunix.org/view.php?id=965&lang=tr

Kurulum CD'si ile bilgisayari actigimiz zaman, boot islemi gerceklesecek ve bize ne yapmak istedigimizi soran bir diyalogla karsilasacagiz:

Kurulum boyunca koseli parantez icerisinde yazan degerler direk enter ile gectiginizde gecerli olan degerlerdir.

dkcsum: wd0 matches BIOS drive 0x80
root on dr0a
rootdev=0x1100 rrootdev=0x2f00 rawdev=0x2f02
erase ^?, werase ^W, kill ^U, intr ^C, status ^T
(I)nstall, (U)pgrade or (S)hell? _ i

Burada i harfine basarak Install islemine devam edecegimizi bildirdikten sonra karsimiza "Terminal type" ve "keyboard mapping" sorulari gelecek. "Terminal type" sorusunu enter ile direk gecelim, "keyboard mapping" sorusuna da tr yazarak devam edelim. Daha sonra "Proceed with install" sorusu gelecek, buna da yes yazarak install islemini baslatmasini soyleyelim.

Terminal type? [vt220]
kbd(8) mapping? ('L' for list) [none] tr
kbd: keyboard mapping set to tr

IS YOUR DATA BACKED UP? As with anything that modifies disk contents, this
program can cause SIGNIFICANT data loss.

It is often helpful to have the installation notes handy. For complex disk
configurations, relevant disk hardware manuals and a calculator are useful.

Proceed with install? [no] yes

Simdi de Kullanilabilir Diskleri gorecegiz. Sonra bize root disk olarak hangisini kullanmak istedigimizi soracak; ornegimizde tek disk oldugu icin direk enter ile devam edecegiz, sizde birden fazla disk varsa burada seciminizi yapabilirsiniz. Sonrasinda secilen diski OpenBSD icin kullanip kullanmayacagimizi soracak, buna da yes diyerek devam edelim:

Avaible disks are: wd0
Which one is the root disk? (or 'done') [wd0]
Do you want to use *all* of wd0 for OpenBSD? [no] yes

Simdi karsimiza Label Editor gelecek. Burada diskimizin yapisini olusturacagiz. Burada oncelikle p m (print label / modify existing partition) ile diskimizin su andaki bilgilerini goruntuleyelim. Simdi diskimizi yapilandirmaya baslayalim.

Oncelikle d a (delete partition / a)diyerek a bolumunu silelim. Daha sonra a b (add partition / b) diyerek b bolumunu ekleyelim ve bu bolumu swap alani olarak isaretleyelim. Bundan sonra da a a (add partition / a) diyerek a bolumunu ekleyelim ve burayi da / baglama noktasina baglayalim. Daha sonra da w (write label to disk) ile yaptiklarimizi yazdiralim, ve q (quit) ile de uygulamadan cikalim.

Biz burada bir swap alani, ve tum dizinler icin tek bir bolum kullandik, elbette siz isteginize gore ornekler uzerinden hareketle farkli bir yapi olusturabilirsiniz. Bu paragrafta anlatilanlari asagida sirasiyla gorebilirsiniz.

> p m
device: /dev/rwd0c
type: ESDI
disk: ESDI/IDE disk
label: VMware Virtual I
bytes/sector: 512
sector/track: 63
tracks/cylinder: 1008
cylinders: 2080
total bytes: 1024.0M
free bytes: 1023.7M
rpm: 3600

16 partitions:
#                    size        offset        fstype        [fsize bsize cpg]
    a:        1023.7M          0.0M     unused               0       0
    c:        1024.0M          0.0M     unused               0       0
> d a
> a b
offset: [63]
size: [2096577] 129M
Rounding to nearest cylinder: 264033
FS type: [swap]
> a a
offset: [63]
size: [2096577] 850M
Rounding to nearest cylinder: 1740816
FS type: [4.2BSD]
mount point: [none] /
> w
> q

Simdi bize;

Are you really sure that you're ready to proceed? [no]

sorusuna yes yazarak devam etmek kaliyor.

Daha sonra gerekli islemler yapilarak temel network ayarlarini soracak, buralarda detaya girmeye gerek yok, cunku zaten bilinen sorgular bunlar. Burada bizim uyguladigimiz ornege bakacak olursak makinemizde 2 ethernet olacak, biri ic aga bakan, digeri dis dunyaya acilan bacak. Burada 1 adet ethernet kartimizi ayarlayalim, ki bu disariya ulasabilecegimiz bacagin ayari olsun. Diger ethernet kartlarini da soracak fakat ileride bunlari biz ayarlayacagimiz icin ayarlamaniza gerek yok, tercih sizin. Buradaki ayarlari da misal asagidaki gibi girebiliriz.

System hostname? (short form, e.g. 'foo') deneme
Configure the network? [yes]
Avaible interfaces are: pcn0.
Which one do you wish to initialize? (or 'done') [pcn0]
Symbolic (host) name for pcn0? [deneme]
The media options for pcn0 are currently
              media: Ethernet autoselect (autoselect)
Do you want tıo change the media options? [no]
IPv4 address for pcn0? (or 'none' or 'dhcp') 192.168.0.1
Netmask? [255.255.255.0]
IPv6 address for pcn0? (or 'rtsol' or 'none') [none]
No more interfaces to initialize.
DNS domain name? (e.g. 'bar.com') [my.domain] deneme.com
DNS nameserver? (IP address or 'none') [none] 193.192.98.8
Use the nameserver now? [yes]
Default IPv4 route? (IPv4 address, 'dhcp' or 'none') 192.168.0.2
Edit hosts with ed? [no]
Do you want to do any manual network configuration? [no]
Password for root acount? (will not echo) parola
Password for root acount? (again) parola

Evet, temel network ayarlarimiz da bitti. Simdi sirada kurulum icin ne kullanacagimiz vs var:

Karsimiza gelen soruda bize nereden kurulum yapacagimizi soracak, biz de CD'den diyecegiz. Daha sonra bize kullanilabilir CD-ROM suruculerini gosterecek ve paket setlerinin yolunu soracak. Bundan sonra o yolda bulunan paket setlerini gosterecek ve kurmak istedigimizi secerek devam etmemizi isteyecek. Devaminda paketler tek tek kurulacak ve sistemi yeniden baslatmamizi isteyecek. Bu adimlari da asagidan gozlemleyebilirsiniz:

Let's install the sets!
Location of sets? (cd disk ftp http or 'done') [cd]
Avaible CD-ROMs are: cd0.
Which one contains the install media? (or 'done') [cd0]
Pathname to the sets? (or 'done') [4.0/i386]

Select sets by entering a set name, a file name pattern or 'all'. De-select
sets by prepending a '-' to the set name, file name pattern or 'all'. Selected
sets are labelled '[X]'.

            [X] bsd
            [X] base40.tgz
            [X] etc40.tgz
            [X] misc40.tgz
            [X] comp40.tgz
            [X] man40.tgz
Set name? (or 'done') [done]
Ready to install sets? [yes]
Getting ......
.
.
.

Paket setlerinin kurulumu boylece baslamis olacak, kurulum bittikten sonra; "Location of sets? (cd disk ftp http or 'done') [cd]" sorusunu tekrar yoneltecek. Bizim isimiz bittigi icin bu soruya done yazarak devam ediyoruz.

Location of sets? (cd disk ftp http or 'done') [cd] done

Simdi bize sshd ve ntpd'nin varsayilan olarak baslatilip baslatilmayacagini, X Window System'i kullanip kullanmayacagimizi, ve diger bazi bilgileri girmemizi isteyecek. Bunlari da isteginize uygun olarak, misal asagidaki gibi girebilirsiniz:

Location of sets? (cd disk ftp http or 'done') [cd] done
Start sshd(8) by default? [yes]
Start ntpd(8) by default? [no]
Do you expect to run the X Window System? [no]
Change the default console to com0? [no]
Saving configuration files...done.
Generating initial host.random file...done.
What timezone are you in? ('?' for list) [Canada/Mountain] Turkey

dedikten sonra bize;

CONGRATULATIONS! Your OpenBSD install has been successfully completed!
To boot the new system, enter halt at the command prompt. Once the
system has halted, reset the machine and boot from the disk.
# _

seklinde bir bilgilendirme metni gorunecek. Anlasildigi uzere kurulum bitti, simdi halt yazarak sistemi yeniden HDD'den boot ederek acalim.

# halt
syncing disks... done

The operating system has halted.
Please press any key to reboot.

rebooting...
_

Artik sistemimiz kuruldu ve diskten actigimiza gore bundan sonra yapacagimiz uygulama kurulumlari icin gerekli olan port agacini olusturalim.

Acilan sisteme giris yaptiktan sonra CD icerisinde yer alan ports.tar.gz dosyasini /usr dizini altina acarak port agacini olsuturmus olacagiz. Ilgili adimlar asagidaki gibidir:

# mkdir /mnt/cdrom
# mount /dev/cd0a /mnt/cdrom/
# cd /usr/
# tar -zxvf /mnt/cdrom/4.0/i386/ports.tar.gz
ports
ports/CVS
ports/CVS/Root
.
.
.

Simdi de ic agimiza bakan 2. ethernet kartimizi, ve dmz olan 3. ethernet kartimizi yapilandiralim. OpenBSD ethernet kartlarinin bilgilerini /etc/hostname.arabirim dosyasinda tutuyor. Bizim belgemizde adi gececek olan arabirimler ise soyle, sizde farkli oldugunda bunu ifconfig ciktisi ile ogrenebilirsiniz.

pcn0: Dis Bacak Ethernet
pcn1: Ic Bacak Ethernet
pcn2: DMZ Bacak Ethernet

Asagidaki gibi bir satirla ic bacagimizi ve dmz bacagimizi kolaylikla yapilandirabiliriz. Tabi burada arabirim adinizin, ve atamak istediginiz IP adresinin size uygun olmayabilecegini, ve gerekli degisikligi yapacaginizi varsayarak yapabilirsiniz.

# echo "inet 192.168.1.1 255.255.255.0" > /etc/hostname.pcn1
# echo "inet 192.168.2.1 255.255.255.0" > /etc/hostname.pcn2

Ayarlamanin ardindan;

# sh /etc/netstart

diyerek network sistemimizi yeniletelim. Boylece diger ethernet kartimizin ayarlarini da yapmis olduk.

Unutmamak gerek nokta, sizin kurulum yaptiginiz makinede arabirim isimleri pcn0,pcn1 seklinde olmayabilir(OpenBSD arabirim adini urunun markasina gore atar), siz de sizin sisteminizdeki isim uzerinden ayarlamayi yapmalisiniz.

Simdi son haliyle olusturdugumuz sisteme goz atacak olursak:

pcn0: 192.168.0.1 IP adresine sahip, ve onunde yer alan disariya acilan modem/router IP adresi de 192.168.0.2. Yani gateway 192.168.0.2
pcn1: 192.168.1.1 IP adresine sahip, ve dogal olarak da ic agimizin 192.168.1.0/24 blogunda oldugunu varsayiyoruz.
pcn2: 192.168.2.1 IP adresine sahip, ve dmz makinamizin 192.168.2.2 adresine sahip oldugunu varsayiyoruz.

Son ayarlamamiz gereken nokta da, IP FORWARDING ayarlarinin yapilmasi. Ki ben bunu yapmadigim icin bir turlu sistemi calistiramamis, tam anlamiyla delirme noktasina cok yaklasmisken bana bu noktada yardim ederek, bazen kocaman sandigimiz sorunlarin aslinda nasil da tecrube sayesinde ufacik olabildigini gostermis olan Huzeyfe ONAL'a bir kez daha tesekkur etme firsatini da kacirmak istemiyorum.

Simdi, /etc/sysctl.conf dosyasini acarak #net.inet.ip.forwarding=1 satirini yorum satiri olmaktan cikararak net.inet.ip.forwarding=1 haline getirelim ve kaydedelim. Boylece IP FORWARDING enable olmus oluyor, bunu yapmazsak PF uzerinden dahil herhangi bir yonlendirme islemi calismayacaktir.

Boylelikle OpenBSD kurulumunu tamamlamis olduk.

2- PROXY GOREVI ICIN SQUID KURULUMU

Oncelikle olusturacagimiz yapiya bir goz atalim. Istemciden gelen talepler, oncelikle PF tarafindan ilgili kurallar geregi yonlendirilecek ya da engellenecek. Daha sonra talebi DansGuardian ele alacak ve ilgili kurallar dogrultusunda istek Proxy uygulamamiz olan Squid'e teslim edilecek. Kisaca cizmeye calisirsak:

Kullanici >> PF >> DansGuardian >> Squid >> Internet

DansGuardian kurmak icin oncelikle bir proxy uygulamasi olarak Squid kurmakla baslayalim, ki boylece DansGuardian ayarlarini yaparken anlamak daha kolay olacaktir:

Squid'i transparan modda calisacak sekilde kuracagiz. Bu su anlama geliyor, istemci tarafinda hicbir proxy tanimlamasi yapmadan proxy'mizin kullanilmasi demektir.

Squid'i port agacindan kuralim, bunun icin gerekli adimlar soyle:

# cd /usr/ports/www/squid/
# env "FLAVOR=transparent" make install

Squid bu islemlerden sonra kurulacaktir, burada derleme secenegi olarak transparent girdigimize dikkat edin. Bu sayede Squid'in transparan modda calismasini saglamis olduk.

Simdi Squid ayarlarimizi yapalim. Squid temel config dosyasi /etc/squid/squid.conf olarak bizi bekliyor. Bu dosyayi istediginiz bir editorle acarak, en basina asagidaki satirlari ekleyin.

http_port 127.0.0.1:3128
acl our_networks src 127.0.0.1
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
http_access allow our_networks

Burada our_networks olarak bir ag adresi degil de, makinemizin kendisini gostermemizin sebebi, planimiza gore Squid Dansguardian'dan gelecek olan talepleri isleyecek, Dansguardian'da ayni makinede oldugu icin ondan gelen tum paketler 127.0.0.1 olarak gelecegi icin, Squid'e tanimasi gereken adres olarak bu degeri girdik. Fakat misal siz Dansguardian kullanmayacaksaniz, bu durumda buraya yerel ip blogunuzu da yazabilirsiniz.

Simdi Squid ayarlarina devam edelim. Squid calisirken kesleme yapmak icin swap alanlari kullanir. Bunlari yaratmak bize kaliyor, ve oldukca basit.

# squid -z

dedigimizde islemimiz gerceklesecektir. Ayarlarimizi da yaptigimiza gore, squid'in sistem acilisinda otomatik calismasini saglamamiz gerekiyor. Bunun icin /etc/rc.local dosyasina squid=YES satirini eklememiz, ve /etc/rc.local dosyasina da bir script parcasi eklememiz gerekiyor.

# echo "squid=YES" >> /etc/rc.conf
# vi /etc/rc.local

dedikten sonra asagidaki scripti yazalim ve dosyayi kaydederek cikalim:

if [ -f /etc/squid/squid.conf ]; then
  if [ X"${squid}" = X"YES" -a -x /usr/local/sbin/squid ];
     then
     echo -n ' squid'; /usr/local/sbin/squid
  fi
fi

Son olarak da ayarlarimizin etkin kilinmasi icin:

# squid
# squid -k reconfigure

diyelim.

Squid kurulumu temel olarak tamamlanmis oldu, bizim planimiza gore isimizi gorecek bicimde calisiyor. Simdi Dansguardian kurulumuna gecelim.

3- ICERIK FILTRELEME ICIN DANSGUARDIAN KURULUMU

DansGuardian'dan kisaca bahsetmek gerekirse, kullanici ile proxy arasinda konuslanir, ve uzerinden gecen http trafigini filtreleme islemini gerceklestirir.

http://www.dansguardian.org adresinden son kararli surumu indirirek kurulumu gerceklestirelim. Su andaki surum 2.8.0.0 oldugu icin biz onu indirdik, buna gore adimlarimiz soyle olacaktir(Tabii oncelikle port agacindan wget'i kurdugunuzu varsayiyorum(/usr/ports/net/wget)):

# wget http://usmirror.dansguardian.org/downloads/2/Stable/dansguardian-2.8.0.6.source.tar.gz
# tar -zxvf dansguardian-2.8.0.6.source.tar.gz
# cd dansguardian-2.8.0.6
# ./configure
# make
# make install

Simdi, DansGuardian yapilandirmasina gecelim. /etc/dansguardian/dansguardian.conf dosyasi yapilandirmamizi yapacagimiz dosyadir. Bu dosyada temel olarak asagidaki degerleri ayarlayacagiz:

language = 'turkish' - Bu tanimlamayla /etc/dansguardian/languages dizini altinda yer alan dil seceneklerinden Turkce'yi secmis olduk. Bu gosterilecek hata/uyari mesajlarinin da dilini belirleyecek.

loglevel = 3 - Bu tanimlama da loglamaya nelerin tabi tutulacagini belirtir. Degerlerin aciklamasi soyledir:
0: Loglama Yok
1: Sadece Engellenenleri
2: Tum Metin Tabanli Islemleri
3: Tum Istekleri, ne var ne yoksa logla

logfileformat = 3 - Bu tanimlama da log dosyasinin hangi formatta islenecegini belirler. Biz Squid bicimi loglamayi tercih ettik, diger secenekler soyle:
1: DansGuardian Bicimi
2: CVS-style Bicimi
3: Squid Bicimi
4: Tab Sinirlandirmali Bicim

Burada sizin kullanim amaciniz onemli oldugu icin burayi gecelim, isteginize uygun olani secebilirsiniz, bir fikriniz yoksa 3 olarak devam edelim.

loglocation = '/var/log/dansguardian/access.log' - Bu tanimlamada da log dosyamizin nerede olacagini belirliyoruz.

filterip = 127.0.0.1 - Bu tanimlama DansGuardian'in hangi IP'yi dinleyecegini belirliyor. Biz PF'ten gelen talepleri dinleyecegimiz icin 127.0.0.1 girdik, bos birakirsaniz, DansGuardian tum adresleri dinler, hic sorun etmez.

filterport = 8080 - Bu tanimlama DansGuardian'in hangi port uzerinden calisacagini belirtir.

proxyip = 127.0.0.1 - Bu tanimlama proxy'mizin ip adresini tanimlar, ayni makinede oldugu icin bu degeri giriyoruz.

proxyport = 3128 - Bu tanimlama da proxy'mizin calistigi port numarasini belirtir. Proxy'miz degisiklik yapmadigimiz icin default port olan 3128 uzerinden calisiyor, boyle devam edebiliriz.

Ayarlarimizi da yaptiktan sonra hizlica DansGuardian'i nasil kullanacagimiza goz atalim. DansGuardian /etc/dansguardian altinda yer alan dosyalar yardimiyla kolayca islevsellestirilebilir. Yasaklanan kurallari tanimlayacagimiz dosyalar banned, izin verilen kurallari tanimalayacagimiz dosyalar ise exception ifadesiyle baslar. Bu dosyalardan bize lazim olanlari kisaca aciklamak gerekirse:

bannedextensionlist: Engellenen dosya uzantilari tanimlanir.
bannediplist: Engellenen IP adresleri tanimlanir.
bannedmimetypelist: Engellenen MIME tipleri tanimlanir.
bannedphraselist: Engellenen tamlamalar gibi daha detayli kurallar icindir. Ornegin ifadesi, icerisinde "deneme test" tamlamasi gecen sayfalari, , ifadesi de icerisinde hem deneme hem de test ifadeleri gecen sayfalari engeller.
bannedregexpurllist: Duzenli ifade kullanarak URL'de gecen ifadeler uzerinden engelleme yapmak icin kullanilir.
bannedsitelist:Engellenecek site isimleri tanimlanir. Bu dosyaya yazilan site tamamiyle engellenmis olur.
bannedurllist: Bu dosyada ise bir sitenin bir bolumu vs engellenebilir. Ornegin tamamen yasaklamak istemedigimiz bir sitenin /deneme dizinini yasaklamak icin bu dosyayi kullanabiliriz.
banneduserlist: Kullanici bazli engelleme icindir, kullanmadigim icin cok detayli bilmiyorum.
contentregexplist: Bilmiyorum. exceptioniplist: Izın verilen IP adresleri tanimlanir, bu dosyada yer alan IP adresleri icin filtreleme uygulanmaz.
exceptionphraselist: bannedphraselist gibi tamlamalar icindir, izin verilecek degerler girilir.
exceptionsitelist: Filtreleme yapilmayacak site adresleri tanimlanir. exceptionurllist: Izın verilen URL tanimlamalari girilir, bu adresler icin filtreleme yapilmaz.
greysitelist: exceptionsitelist dosyasina yazdigimiz siteler tum filtreleme islemlerinden(dosya uzantisi, mime tip vs) mahrum birakilarak tam anlamiyla tamamen izin verilen sitelerdir. Biz sadece bir adrese girilebilmesini, fakat diger engellemelerin(dosya tipi vs) devam etmesini istersek, bu siteyi greysitelist dosyasina girmeliyiz.
greyurllist: Tipki gresitelist gibi, sadece URL filtrelemesini kaldirip diger kurallarin islenmesini istedigimiz URL'ler icin bu dosyayi kulanabiliriz.

Tum bu aciklamalardan sonra, istediginiz duzenlemeyi yaptiktan sonra DansGuardian'i baslatmak icin:

# dansguardian -c /etc/dansguardian/dansguardian.conf

dememiz yeterli. DansGuardian'in yeniden baslatilmasi icin de -r parametresi verilebilir.

DansGuardian'i sistem acilisinda otomatik baslatmak icin tipki Squid icin yaptigimiz gibi /etc/rc.conf dosyasina dansguardian=YES ifadesini ekleyelim ve ardindan /etc/rc.local dosyasina asagidaki script parcasini yazalim.

if [ -f /etc/dansguardian/dansguardian.conf ]; then
  if [ X"${dansguardian}" = X"YES" -a -x /usr/sbin/dansguardian ];
     then
     echo -n ' dansguardian'; /usr/sbin/dansguardian
  fi
fi

Dansguardian hakkinda oldukca detayli, orneklerle aciklanmis guzel bir belge icin: http://www.enderunix.org/docs/dansguardian.pdf

4- PF(PACKET FILTER) AKTIF EDILMESI

OpenBSD uzerinde PF kullanmak icin oncelikle PF'i aktif etmemiz gerekir. Bu cok basit bir islem olup, diledigimiz yolu secerek bu islemi gerceklestirebiliriz:

Ya, /etc/rc.conf dosyasinda pf=NO satirini pf=YES olarak degistirecegiz, ya da /etc/rc.conf.local dosyasini yaratarak icerisine pf=YES satirini ekleyecegiz.

Biz rc.conf.local dosyasini kullanalim mesela;

# echo "pf=YES" > /etc/rc.conf.local

Simdi istedigimiz metodla PF'i aktif ettikten sonra sistemi yeniden baslatalim ve kisaca PF'in ayarlarindan bahsedelim.

Bu arada normal sistem calisirken PF'i aktif/pasif hale getirmek icin de pfctl uygulamasini kullanabiliriz.

# pfctl -e

komutuyla PF enable edilmis olur; ayni sekilde -d parametresi ile disable edebiliriz.

PF, bizim belirttigimiz herhangi bir dosyadan kurallari okuyabilir, ve o dosyaya uygun davranabilir. Default deger olarak /etc/pf.conf dosyasi kullanilmaktadir(Bu degeri /etc/rc.conf icerisinde pf_rules=/etc/pf.conf satirini duzenleyerek degistirebilirsiniz). Biz farkli bir dosyadan kural okutmak istersek(sadece okutmak degil, parse etmek, ya da sadece belirli bir kisim kurali cektirmek icin de olabilir) pfctl uygulamasini kullanabiliriz.

Ornegin, /home/deneme/pf_deneme.conf dosyasindan islem yaptirmak istersek, -f parametresine bu dosya yolunu giydirmemiz yeterli olur.

# pfctl -f /home/deneme/pf_deneme.conf

Artik PF calistigina gore sira geldi PF icin en temel ayarlarin yapilmasina. Biz sistemde degisiklik yapmadigimizi varsayarak /etc/pf.conf dosyasi uzerinden islem yapmaya devam edelim.

Burada yapacaklarimizdan ozetle bahsedecek olursak;
- Gerekli NAT tanimlamalarini yaparak, ilgili yonlendirmeleri yapacagiz
- Icerik filtreleme yapmak icin gerekli yonlendirmeyi yapacagiz
- DMZ olarak calisan bilgisayara gerekli izinleri verecegiz

Oncelikle DansGuardian ve Squid icin hangi port uzerinden hizmet vereceklerini ilgili kurulum sirasinda yapmistik. Buna gore, DansGuardian 8080, Squid 3128 portu uzerinden dinleme yapiyor. Biz gelen 80(www) taleplerini oncelikle 8080'e yonlendirecegiz(DansGuardian), DansGuardian da bunlari proxy uygulamasina(Squid) teslim edecek ve cikis saglanacak.

Simdi bunlara gore hazirlanmis pf.conf dosyamizi yazalim. Aciklamalar dosya icerisinde yer alacak. Bu yapida Harici bacagimizin adi ext_if, Ic aga bakan bacagimizin adi int_if, ve DMZ olan bacagimizin adi da dmz_if olarak gececek. DMZ olarak da bir mail server calistigini varsayalim. Burada donanim isimlerini kendi sisteminize gore degistirmek gerektigini bir daha hatirlatmakta fayda var.

Arabirim ve adreslerin kucuk bir ozetini toparlarsak:

Disariya bakan modem/router adresimiz(gateway): 192.168.0.2
Dis bacak adresimiz: 192.168.0.1
Dis bacak donanim adimiz: pcn0

Ic bacak adresimiz: 192.168.1.1
Ic bacak donanim adimiz: pcn1

DMZ server makinamiz: 192.168.2.2
DMZ bacak adresimiz: 192.168.2.1
DMZ donanim adimiz: pcn2

Ve son olarak, ic agimizdaki bilgisayarlarin gateway'inin 192.168.1.1, dmz bilgisayarimizin gateway'inin de 192.168.2.1 olacagini hatirlatalim.

pf.conf:

ext_if="pcn0"
int_if="pcn1"
dmz_if="pcn2"

ic_ag="192.168.1.0/24"
mail="192.168.2.2"

# Burada RFC'lere uymayan paketleri kolayca gozardi ettiriyoruz (misal SYN ile baslamayan vs.)
scrub in all

# NAT yapiyoruz
nat on $ext_if from !($ext_if) -> ($ext_if:0)

###################### < YONLENDIRME TANIMLARI > ######################
# Ic Kullanicilarin 80 istekleri 8080(DansGuardian) atiliyor
rdr pass log(all) on $int_if proto tcp from $ic_ag to any port 80 -> 127.0.0.1 port 8080

# Disaridan gelen Mail taleplerini dmz'e yonlendiriyoruz (25 => SMTP) (110 => POP3)
# Burada dikkat ederseniz pass kullanmadik, bir ustteki kuralda ise kullandik. Burada dikkat etmemiz gereken nokta su:
# pass kullanarak kurallarimizi kisaltabiliriz, daha yonlendirme yaparken ayni zamanda izin vermis oluruz.
# pass kullanmazsak asagidaki gibi mail taleplerine yonlendirme disinda ayrica izin vermemiz gerekir
rdr on $ext_if proto tcp from any to $ext_if port 25 -> 10.0.0.3 port 25
rdr on $ext_if proto tcp from any to $ext_if port 110 -> 10.0.0.3 port 110
###################### < /YONLENDIRME TANIMLARI > ######################

# Tum girdi ve ciktilari blokluyoruz. Yapimizda hersey bloklu, izin verilenleri biz belirleyecegiz mantigiyla gidiyoruz.
# Tam tersi de olabilir, tercihe baglidir elbette. Mesela buna ragmen ic kullanicilara da ileride tam yetki veriyoruz.
block in log(all)
block out log(all)

# Firewall'in nete cikmasi icin izin veriliyor
# Kurallarda kullandigimiz "keep state" ifadesi dikkatinizi cekecektir
# Kuralimizi yazarken her 2 taraf icin de gecerli oldugunu dusunuyorsak(sadece "in" ya da sadece "out" degil de, her 2 yon icin)
# "keep state" ifadesini kullanarak "durum koruma" yapmis oluruz, ve paketin "in" kuralini yazdigimizda "out" icin de gecerli olacagini soylemis oluruz
pass out keep state

# Loopback arabirimine izin veriliyor
pass quick on lo

# FTP'nin calismasi icin gerekli kural dizisini giriyoruz
pass in log(all) on $ext_if proto tcp to ($ext_if) port > 49151 user proxy keep state

# Ic kullanicilarin internete tam erisimi saglaniyor(burada dmz_if'e gidenlere de tam erisim vermis oluyoruz).
# Bu belge ornek oldugu icin detaya girmeyelim, fakat bunlari daha duzenli yazmamiz gerektigi de bir gercek
pass in log(all) on $int_if from $ic_ag to any keep state

# Disaridan gelen MAIL SERVER istekleri kabul ediliyor
pass in log (all) on $ext_if proto tcp from any to $mail port {25 110} keep state

# Mail Server'dan(dmz) Firewall'a erisim izni veriliyor
pass in log (all) on $dmz_if from $mail to any keep state

# Bir de mesela disaridan gelen SSH isteklerini kabul edelim
pass in log(all) on $ext_if proto tcp from any to ($ext_if) port 22 keep state

Bundan sonra PF ile ugrasmak, kurallari deneyerek cok da zor olmayan yapisini cozmek sizin elinizde. Umarim bir nebze giris yapabilmisimdir konuya.

- YARARLANILAN KAYNAKLAR:

- http://www.openbsd.org
- http://www.openbsd.org/faq/pf/
- http://www.squid-cache.org
- http://www.dansguardian.org
- http://www.webengr.com/development/tools/openbsd/tips/cdrom/