|
|
![]() |
Murat Balaban, 17 Mayis 2003
3. duzeltme.
Bu makalede, Yahoo!, Apache, Netcraft, Sony gibi buyuk olcekli kurulumlarin isletim sistemi fonksiyonlarini basari ile
goturen FreeBSD uzerinde efsanevi BSD paket
filter'i enfes ve muthis derecede etkin ve etkili
kullanan basarili bir `paket filter` olan Ipfilter'in bir `production`
firewall makinasi uzerinde kurulumu anlatilmaktadir. Eger, sanal ortamdan
korumaniz gereken `top-secret` bilgiler tasiyan
birkac yuz ile birkac bin arasi makinaniz var, ticari firewall cozumlerini
size kakalamaya calisan pazarlamacilarin istedigi
kadar cok paraniz da yoksa, bu dokumani okumaya
devam edin. FreeBSD+ipfilter tam size gore.
Cunku siz `cok sey` istiyorsunuz ama, `az paraniz` var. ;)
Bu dokumanin en guncel hali; http://www.enderunix.org/docs/ipfilter.html adresindedir. Aksi belirtilmedigi takdirde bu kabil dokumanlarin haklari kendilerini yazan yazarlarda saklidir. Bu dokuman da, parca parca ya da tamamen herhangi bir sekilde, yazarinin izni dahilinde dagitilabilir. Yazar, bu dokumani okuyanlarin ugrayacaklari herhangi bir zarardan oturu sorumluluk kabul etmez. Use at your own risk! Bu makalede, yeni kullanicilara ipfilter paketinin tanitimi, ve guzel firewall dizayni hakkinda bir kac bilgi verebilmek amaciyla yazilmistir. Kullanicinin temel network kavramlari, temel isletim sistemi kavramlari, paket filtreleme, tcp/ip hakkinda genel bilgisi oldugu kabul edilmektedir. Temel seviyede FreeBSD tecrubesi isinizi kolaylastirir, calisir bir sisteme kavusmak icin gerekli degildir, ama temel *NIX bilgisi gerekmektiedir!!!. Fakat firewall'inizin isletimini devam ettirmek icin BSD ogrenmek zorundasiniz!!!. Egerki, Linux uzerinde bir firewall uygulamasi ( ipchains'la ) Ismail'in Ipchains-Howto'sunu okuyun efendim. Adresi: http://www.enderunix.org/docs/ipchains.html
Burada, temel ( www/smtp/ssh/pop/imap gibi ) birkac servisin firewall kontrolu altinda alinmasi, ve organizasyonun internet cikisinin firewall'imizdan yapilmasi icin gerekli konfigurasyonu, ipfilter'i genel olarak anlatarak yapacagiz. Burda DMZ ve trusted net arasinda herhangi bir kural konmamistir. Gene zaman darligi nedeniyle bu konu ileriki bir tarihe atilmistir.
Ayrica, kurallari, rulegroup'lar haline getirilmesi de burada
anlatilamistir. Bu da ileriki bir tarihte yapilmaya calisilacaktir.
Fragmented paketlerin hepsi `ignore edilmistir`. Firewall'imiz
fragmented paket kabul etmez. Isterseniz `keep frags` kelimesiyle burada
da degisiklik yapabilirsiniz.Eger, herhangi bir konuda yardima
ihtiyaciniz olursa, [email protected] adresine mail atabilirsiniz.!
Bu dokumanda, bir oncekilere ek olarak, FTP protokolunun filtrelenmesini anlatacagim. Ayrica bir de ipfilter kurup kullanmis ve basari saglamis arkadaslarin yayinlanmasina izin verdikleri basari oykulerini burada yayinlayacagim. Eger sizin de yayinlanmasini istediginiz basari oykuleriniz varsa bana hic tereddut etmeden mail atiniz: murat ~ enderunix.org Bir de SIk Sorulan Sorular kismina bir soru daha eklendi.
EnderUNIX grubu'nun hazirladigi FreeBSD Kurulum Kilavuzu'nu kullanarak FreeBSD kurulumunuzu kolayca yapabilirsiniz. http://www.enderunix.org/docs/freebsd_kurulum/
Ipfilter, Darren Reed (darrenr % pobox.com) tarafindan yazilmis, firewall ortamlarinda basariyla uygulanan bir TCP/IP paket filtreleme programidir. BSD'nizin kernal'ina loadable module olarak yuklenebilecegi gibi, statik olarak da derlenebilir, fekat tavsiye edilen static olarak derlemenizdir. http://avalon.coombs.anu.edu.au/~avalon/ adresinde yazildigi uzere, Ipfilter,
FreeBSD
NetBSD
HP-UX
uzerinde kurulu geliyor, ve asagidaki platformlar uzerinde de derleyip calistirmisler var:
OpenBSD ( daha yeni bir zamana kadar bu isletim sisteminde de default geliyordu )
Solaris/Solaris-x86 2.3 - 8
SunOS 4.1.1 - 4.1.4
BSD/OS-1.1 - 4
IRIX 6.2
Eger, paketi baska bir platformda denemek isterseniz,
ipfilter'i
ftp://coombs.anu.edu.au/pub/net/ip-filter/ adresinden
indirip derleyebilirsiniz. Peki ipfilter neleri yapabiliyor?
paketi acik ve secik olarak gecirebiliyor yada bloke ediyor.
network arayuzlerini (network interface) ayirt edebiliyor.
ag/makina bazinda filtreleme yapabiliyor
herhangi bir protokolu (tcp/udp/icmp gibi ) filtrelebiliyor
bloke edilmis paketler icin, istenirse geri ICMP
error/TCP reset paketi
gonderebiliyor.
TCP, UDP ve ICMP paketleri icin `packet state`
yapabiliyor. Iste bu
ozelligi cok hos. ve onu Linux'un ipchains'indan cok cok one geciren bir
ozelligi.Bu konuya ileriki kisimlarda deginecegiz.
Ayni kurali butun fragmente paketlere uygulayarak
herhangi bir IP paketi
uzerinde fragment-state uygulayabiliyor.
Network/Port Address Translator (NAT/PAT) yapabiliyor.
Linux'ta IP-Masquareding
bunun ismi.
Gercek transparent-proxy ortamlari icin `redirector` olabiliyor.
Port bazinda filtreleme yapabiliyor
Istenilen paketleri loglayabiliyor.
Iste bunlar Ipfilter'in onemli gordugum ozellikleri.
Simdi, kurmaya baslayalim...
Once, firewall ortamimizi dizayn edelim: Bir internet
agimiz var, bir adet DMZ yani server zone'umuz var, bir de trusted-net'imiz,
yani pc'lerimizin felam oldugu bolge var. Yani toplam, birbirinden
fiziksel katmanlari ayri 3 agimiz var:
Dolatisiyla, firewall olacak makinamizda 3 ethetnet kartina ihtiyacimiz
var. Bunlar, buyuk ihtimalle, hele hele GENERIC kernel kullaniyorsaniz
acilis sirasinda asagidaki gibi taninacaktir:
fxp0: <Intel Pro 10/100B/100+
Ethernet> port 0x6400-0x641f mem
0xe4000000-0xe40fffff,0xe4100000-0xe4100fff irq 10 at device 10.0 on
pci0
fxp0: Ethernet address 00:d0:c2:a0:a4:c1 fxp1: <Intel Pro 10/100B/100+
Ethernet> port 0x6400-0x641f mem
0xe4000000-0xe40fffff,0xe4100000-0xe4100fff irq 3 at device 10.0 on pci1
fxp1: Ethernet address 00:a0:c9:a0:a4:c2
fxp2: <Intel Pro 10/100B/100+ Ethernet> port 0x6400-0x641f mem
0xe4000000-0xe40fffff,0xe4100000-0xe4100fff irq 9 at device 10.0 on pci2
fxp2: Ethernet address 00:a0:c9:a0:a4:c3
Dolayisiyla ethernet arayuzlerimiz fxp0, fxp1 ve fxp2. bunlardan
fxp0 internete bagli kartimiz, IP: 193.140.205.219
fxp1 DMZ'e bagli kartimiz, IP: IP: 192.168.0.1
fxp2'de pc'lerimizin bagli oldugu zone olacaktir. 172.16.0.1 -- 16 bit ag adresli.
Simdi de, makinamiz bir gateway olacagi, yani paketleri
interface'leri arasinda forward edecegi icin, ip forwarding'i
etkinlestirmemiz lazim, bunun icin, /etc/sysctl.conf'ta:
net.inet.ip.forwarding=0 satirini net.inet.ip.forwarding=1 olarak
degistirelim. Eger bu dosya yoksa olusturun, ve icine
net.inet.ip.forwarding=1 satirini ekleyin. Sonra makinayi reboot
ediyoruz. Eger, reboot etmek istemiyorsaniz:
pathfinder:~# sysctl -w
net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
Simdi. FreeBSD'nizi basariyla kurdunuz,
pathfinder:~# netstat -a | grep
LISTEN
tcp4 0 0 *.ssh *.* LISTEN
tcp46 0 0 *.ssh *.* LISTEN
tcp4 0 0 *.sunrpc *.* LISTEN
Evet, gordugunuz gibi, default olarak bir suru
servisimiz hic gereksiz yere calisiyor. Bunun icin inetd yi disable
ediyoruz.
pathfinder:~# kill -9 inetd_pid
FreeBSD'nin acilirken okudugu dosyalardan olan /etc/rc.conf u favori
editorunuzle aciniz, Burada asagidaki satirlari ekleyin:
pathfinder:~# vi /etc/rc.conf
Orada, ipfilter ve ipnat'i calisir hale getirelim, gereksiz servisleri kapatalim:
ipfilter_enable="YES"
ipfilter_program="/sbin/ipf"
ipfilter_rules="/etc/ipf.rules"
ipfilter_flags=""
ipnat_enable="YES"
ipnat_program="/sbin/ipnat"
ipnat_rules="/etc/ipnat.rules"
ipnat_flags=""
ipmon_enable="YES"
ipmon_program="/sbin/ipmon"
ipmon_flags="-Ds"
sendmail_enable="NO"
inetd_enable="NO"
usbd_enable="NO"
portmap_enable="NO"
yapalim. Makinayi reboot ettiginizde, makina acilirken
"Configuring Ipfilter" diyerek ipfilter'i calistiracaktir.
Ya da, reboot etmek istemiyorsaniz;
pathfinder:~# ipf -Fa -f /etc/ipf.rules
pathfinder:~# ipnat -CF -f /etc/ipnat.rules
yapiniz. burada `ipf` ve `ipnat` programlari filter ve nat rule'larini
manipule eden baslica programlar oluyorlar.
Ama durun, hemen simdi reboot etmeyelim, cunku ipfilter'i kernel icine
derlememiz lazim:
Ipfilter, FreeBSD 4.3 Release ile beraber geliyor,
fekat kernel'da destegini vermek gerekiyor, Onun icin, /usr/src/sys/i386/conf/GENERIC
ya da konfigurasyon dosyaniz neyse, ona minimum su iki satiri eklemeniz
gerekiyor:
options IPFILTER
options IPFILTER_LOG
Basitce, sonra:
pathfinder:~# /usr/sbin/config GENERIC
pathfinder:~# cd ../../compile/GENERIC
pathfinder:~# make depend
pathfinder:~# make
pathfinder:~# make install
pathfinder:~# reboot
sonra, olaraki kernel'i derleyeceksiniz. Daha detayli
kernel derlemek icin de:
http://www.enderunix.org/freebsd/doc/handbook/kernel.html
adresindeki Kernel Handbook'tan yardim alabilirsiniz...
Ipfilter, her rule'un eklenmesinde ayni
binary'nin defalarca calistirilmasi yerine, calistiginda parse ettigi
bir ruleset dosyasi
kullanir. Ipfilterin paket filtelemesi, by-default, /etc/ipf.rules'deki
ruleset'i, NAT'i da, /etc/ipnat.rules'dakileri okuyarak calisir. Simdi,
/etc/ipf.rules dosyasini acalim, hem rule yazalim, hem de ipfilter'in
calisma mantigini anlatalim: Firewall kurallari, yukaridan asagiya
okunur ve her yeni kural, ruleset'in sonuna eklenir.
pass in all
pass out all
Bir paket geldiginde, bilgisayar once, `pass in all` kuralini uygular,
sonra da `pass out all`. Linux ipchains/iptables/ipfwadm ile ilgilenmis
olanlar bilirler, orda bir paket geldiginde, kurallar yukaridan asagiya
incelenir, eger paketi ilgilendiren bir kural yakalanirsa, ruleset'in
taranmasi biter, ve o kural, nihai kural olarak pakete uygulanir. Fakat,
durum ipfilter'de durum boyle degil. Her paket icin, ruleset'deki butun
kurallar kontrol edilir. Bu durum da `quick` kelimesiyle
degistirilebilmektedir. Her neyse, devam edelim:
Yukaridaki kurallar her ingilizce bilen erkisinin anlayabilecegi uzre,
gelene gidene eyvallah demektedir. yani gelen ve giden butun paketlere
gecis izni vemektedir. Biraz daha ilerleyelim, peki bu napiyor?
block in quick from 192.168.0.0/16 to any
192.168.0.0 ag adresli, 192.168.255.255'den yayin yapan, yani 16-bit ag
adresine sahip paketlerin gecisine, diger kurallari incelemeyi birakarak
(quick kelimesiyle ) izin vermiyor. Peki bu napiyor?
block in quick on tun0 from 192.168.0.0/16
to any
gene ayni sey gecerli, ama bu defa tun0 arabirimi uzerinde bu kural
gecerli (tun0 bsd'de point-to-point baglantinin interface'idir). Peki bu?
block in log quick on tun0 from
192.168.0.0/16 to any
Bu da, bir onceki kuralla ayni etkiye sahip, ama bu sefer, bu paketi
match eden paketleri logluoyor.
pass in quick on tun0
proto icmp from any to 193.140.205.0/24 icmp-type 0
pass in quick on tun0 proto icmp from any to 193.140.205.0/24 icmp-type
11
proto icmp, kuralin icmp paketleri icin gecerli oldugunu berlitiyor.
Himm, icmp paketinin tipini bile belirtebiliyorsunuz: ping ve traceroute
calissin diye:)
block in log quick on
tun0 proto tcp from any to 193.140.205.219/32 port = 513
tcp/udp paketleri icin port belirleyebiliyoruz.
makinamizin remote shell portuna giden paketleri bloke ediyoruz
simdi.
Simdi, Cisco kullananlariniz heman hatirlayacaksiniz, cisco'da
`established tcp` paketlerinin gecisini saglayan established kelimesini.
ipfw'de established, ipfwadm'de setup/established' dir o hani? Iste,
ipfilter, bu established baglantilarin gercekten onlar mi olduklarini
gercekten cok iyi takip edebiliyor. Hem de, sadece tcp bazinda degil,
udp ve icmp bazinda da! Bu fonksiyonellik icin kullanmaniz gereken
sihirli sozcuk: keep state
Simdi, biraz olayin felsefesine girelim. Istemeyenler
bir sonraki paragraftan devam edebilirler. ipfilter'da, gelen ve giden
paketler icin aslinda, ruleset kontrol edilmez. Aslinda kontrol edilen
`state table` dir. bu tablo, firewall'dan sorgusuz sualsiz gecmeesine
izin verilen tcp/udp/icmp sessionlarin tutuldugu bir tablodur. Bir nevi
bir guvenlik acigi gibi gorunse de aslinda degil. Neden mi? Butun
tcp/ip baglantilarinin bir baslangici, bir devami bi de sonu vardir.
Yani ortasi olmayan bir son'lu baglanti olmaz! ya da baslangici olmayan!.
Eger, firewall kurallarimiz, bir baglantinin baslangicina izin veriyorsa,
mantiki olarak, ortasina ve dahi sonuna da izin verecektir, degil mi?
Iste, keep state olayi, firewall'in sadece yeni (diger bir deyisle SYN
flag'i set edilmis ) paketler uzerinde islem yapmasini ve orta ve sonla
ugrasmamasini sagliyor. Eger bir baglanti'da SYN paketinin gecmesine
izin
veriliyorsa, sonra gelen ACK ve FIN paketlerine de izin veriliyor. Iste
state-table bu izin verilen baglantilardan olusuyor. Keep state bize
gelen her incoming baglanti icin, outgoing kurallarimizda bir `pass out
...` kurali eklemekten kurtariyor. Oyle ya, bi taraftan gelen bir
paket, ayni zamanda bizden oraya ulasabilmeli. Incoming olarak bi pakete
izin veriyorsak, ondan kaynaklanan outgoing paketlerde otomatik olarak
state table'a yaziliyor. Simdi de, FIN saldirilarini, bu state tablosu
yardimiyla, ve de `flags S` kelimesi yardimiyla engelleyelim. Bu kelime
ustunde SYN flag basili paketler demektir;
pass in quick on tun0 proto tcp from any
to 193.140.205.1/32 port = 23 flags S keep state
Simdi, 193.140.205.1 makinasina sadece SYN flagi basili paketler izin
veriliyor, yani, kimde bize direk olarak FIN paketi yollayamaz, once SYN
le established bi baglantisinin olmasi lazim.
Eveeet, simdi firewall kurallarimizi yazmaya baslayalim:
Simdi, iki cesit firewall dizayni var. Ontanimli olarak, butun paketlere
izin verip, iclerinden istediklerimizi yasaklamak. Ontanimli olarak,
butun paketleri bloke edip, iclerinden istedilerimize
izin vermek. Biz 2. secenegi uygulayacagiz.
pass out quick on lo0
pass in quick on lo0
loopback arayuzune gelis-gidis izni verelim. lo0 makinanin kendisi
oldugu icin bu kural zorunlu!
block in quick on fxp0
all with opt lsrr
block in quick on fxp0 all with opt ssrr
Bazi sacma sapan paketlerin rahatimizi bozmamasi icin bunu ekliyoruz.
bkz:
http://www.openbsd.org/faq/faq6.html
block in quick on fxp0
proto tcp from any to any flags FUP
Nmap gibi programlarin `tcp-ip fingerprinting` yontemiyle agimizdaki makinalarin isletim sistemini tespit etme amaclarini bu kuralla onluyoruz.
block return-icmp(port-unr) in quick on fxp0 from any to any port = 113
ident portuna erisim oldugunda, portumuzun kapali oldugunu port
unreachable icmp paketi ile iletiyoruz. Bu, sunun icin gerekli: mesela
bir makinaya telnet baglantisi aciyorsunuz. Karsi makina, sizin 113
portunuza baglanmaya calisacak, orda calismasi *gereken* identd ile
konusmak isteyecektir. Ama firewall'da biz default olarak butun
paketleri drop ettigimiz icin, ve de, 113 icin gecis izni olmadigi
nedeniyle, karsi makina belli bi sure 113'e baglanmaya calisacak bize de
telnet baglantisini bir sure acmayacaktir. Bu nedenle, biz, bu
makinalara portun unreachable oldugunu bildiriyoruz ki, o makina da
time-out'a dusmeyi
beklemeden, o portun kapali oldugunu ogrenip, denemekten vazgecerek,
bize baglantiyi derhal aciyor.
block in quick on fxp0
from 192.168.0.0/16 to any
block in quick on fxp0 from 172.16.0.0/12 to any
block in quick on fxp0 from 10.0.0.0/8 to any
block in quick on fxp0 from 127.0.0.0/8 to any
block in quick on fxp0 from any to 192.168.0.0/32
block in quick on fxp0 from any to 192.168.0.255/32
block in quick on fxp0 from any to 172.16.0.0/32
block in quick on fxp0 from any to 172.16.255.255/32
block out quick on fxp0 from any to 192.168.0.0/16
block out quick on fxp0 from any to 172.16.0.0/12
block out quick on fxp0 from any to 10.0.0.0/8
block out quick on fxp0 from any to 127.0.0.0/8
Burda da yaptgimiz sey, het turlu non-routable private ip uzayindan, bizim networkumuze, bizim agimizdan da, disariya bu kabilden paketlerin cikmasini engelliyoruz. Bu, ip spoofing denen olayin bir nevi onune gecmek icin.
pass in quick on fxp0 proto icmp from any
to 192.168.0.0/24 icmp-type 0
pass in quick on fxp0 proto icmp from any to 192.168.0.0/24 icmp-type 3
pass in quick on fxp0 proto icmp from any to 192.168.0.0/24 icmp-type 11
ICMP_ECHO_REPLY, 'a izin verelim ki, insanlar ping cekerek bizim up &
alive oldugumuzu anlayabilsinler, icmp-type 11 ttl expired, 0,
echo-reply, 3, destination-unreachable, icin oluyor arkadaslar. Bu
hangisiydi hatirlamiyorum, galiba firewall rfc ile belirtilen
standartlara uyum icin. yani belli internet servisleri calistiriyorsaniz,
minumum echo_reply ve ttl expired'a izin vermek zorundasiniz. Ama arkada
oyle, web/smtp/dns felam gibi servisiniz yoksa buna da izin vermeyin,
tavsiye etmiyorum,
cunku bu kadarcik icmp bile, cok *evil* seyler icin kullanilabiliyor !
Firewall arkasinda calisan sql serveriniza icmp ASLA izni vermeyin
mesela, insanlarin orda bir sql server var uzakta deyip, onunla yerli
yersiz ugrasmasini istemeyiz degil mi?
pass in quick on fxp0
proto tcp from any to 193.140.192.223 port = 25 flags S keep state
pass in quick on fxp0 proto tcp from any to 193.140.192.40 port = 80
flags S keep state
pass in quick on fxp0 proto tcp from any to 193.140.192.223 port = 110
flags S keep state
Burda da, mail sunucumuza, 25 ve 110 (smtp ve pop3) port erisimini , web
sunucumuza da 80 ( www ) flags s ve keep-state sihirli sozcuklerini
kullanarak izin veriyoruz.
pass out quick on fxp0 proto tcp from any
to any keep state
pass out quick on fxp0 proto udp from any to any keep state
pass out quick on fxp0 proto icmp from any to any keep state
Evet, bizim agimizdan disari butun cikisa izin! Evet, biliyorum guzel bi
dizayn sayilmaz pek, ama simdilik bu kadar, ileri de vakit olursa bu
detaylara da gireriz icabinda.
block return-rst in quick on fxp0 proto
tcp from any to any
block return-icmp-as-dest(port-unr) in quick on fxp0 proto udp from any
to any
block in log quick on fxp0 proto icmp from any to any
Diger butun tcp paketler icin, default olarak, tcp-reset paketi
yolluyoruz. Udp paketler icin de, gercek destination adresi, pakete
basarak (firewallin ip'sini degil) icmp port unreachable paketi
yolluyoruz. icmp'leri de logluyoruz ;)
Evet arkadaslar, simdi /etc/ipf.rules dosyamiz adam oldu sayilir. Simdi
de, /etc/ipnat.rules dosyamiza bakalim.
Firewall teknolojilerininen buyul kiyaklarindan
biri de, hic suphesiz, bir suru bilgisayarin, Internet servis
saglayicilarin ruhu bile duymadan tek bir dis arayuz araciligiyla
internetle bulusabilmesidir. Yani bir suru bilgisayarin tek bir ip/internet
baglantisi ile internete cikmasi. Linux dunyasi bunu, IP Masquerading
olarak biliyor, ama aslindan bunun ASIL ismi, Network Address
Translation yani NAT. ipfilter, bize ip'eri ip'lere `map` etmeyi olasi
kiliyor. Aslinda, ipfilter, NPAT yapiyor, yani Network
Port & Address Translation.Ipfilter sayesinde, kaynak ve hedef port ve
adresi kolaylikla degistirebiliyoruz.
map fxp0 172.16.0.0/16 ->
193.140.192.219/32
Ne zaman ki fxp0 arayuzumuze 172.16.0.0 blogundan bir paket gelse, paket,
kaynak adres ve portu belirttigimiz (193.140.192.219) adresininkiyle
degistiriliyor, orijinal hedef port ve adres korunarak yollaniyor. Hatta,
ipfilter, bu islemi yaparken, ayni zamanda bunu bir litede tutarki,
gelen paketleri de karsilayabilsin, istenilen adrese geri yollasin.
Fekaat,
yukaridaki kuralin bir eksigi var. Ya biz internete acilan
ehternet'imiziz Ip'sini bilmiyorsak, yani mesela baglantimiz dinamic
point-to-point baglantisi ise? O zaman IP yerine 0/32 yazarsak, NAT,
kurali uygularken, tun0 ya da herneyse o arayuzdeki IP'yi otomatik
bulacak, ve 0/32 yerindekullanacaktir!.
map tun0 172.16.0.0/16 -> 0/32
Simdi.... yukaridaki kuralimiz hala eksik sayilir. Yukarida kaynak porta
herhangi bir manipulasyon yapilmiyor, bu da problemlere yol acabilir.
Mesela, 172.16.3.3 makinasi da, 172.16.3.9 makinasi da, kaynal portu
1300 olan bir paket yolladi. E simdi, dis arayuzumuzden ayni IP'den iki
ayni port disari cikacak? Luckily, durum boyle degil, ifilter `portmap`
kelimesiyle portlari da kendisinin yonetmesine imkan sagilyor.
map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:30000
Evet, simdi soyle bir senaryo dusunelim: 193.140.192.40 Ip'sinde, 80. portta calisan bir IIS webserverimiz var. `.com` dunyasinda, makinamiz sIk sIk rahatsiz edilecektir... Biz bunu `prilileged port`lar olan 0-1024 arasinda bir portta degil de, port > 1024 calistirmak istiyoruz. Mesela8000. portta. E ama, insanlar standart port olan 80'e baglanmak isteyeceklerdir. Insanlar bizim web serverimizin 8000. portta oldugunu hangi cehennemden ogrenecekler? Isin asli oyle degil, ipfilter, bize `redirection` sayesinde bunu gerceklestirebilm imkanini sagliyor:
rdr fxp0 193.140.205.219/32 port 80 ->
192.168.0.5 port 8000
Dis arayuzumuz olan fxp0'da 193.140.205.219/32 IP'sine 80. portuna gelen
paketler, firewall'imizin arkasindaki 192.168.0.5 makinasinin 8000.
portuna yonlendiriliyor. ipnat, paketler uzerinden gecerken, paketlerin
tekrar yazimina olanak sagladigi icin, `application proxy` prograrinin
uygulanabilmesi icin cok guzel bir mekan oluyor. Bu da, ftp gibi bazi
protokollerin NAT'inda,
mudahil olmayi sagliyor. Bu, da cogu ftp server'in `active connection`
tutmasindan dolayi, ortaya cikabilecek problemleri onluyor:
map fxp0 0/0 -> 193.140.192.219/32 proxy
port ftp ftp/tcp
Fakat ftp ile ilgili yukaridaki kuralimizin butun diger NAT
kurallarindan once yazilma zorunlulugu vardir. Secure LAN'imizi da
internet'e cikaralim:
map fxp0 192.168.0.0/24 ->
193.140.192.219/32 portmap tcp/udp 12500:60000
map fxp0 192.168.0.0/24 -> 193.140.192.219/32
evet, simdi de,
pathfinder:~# ipnat -CF
-f /etc/ipnat.rules
ile ipnat kurallarimizi etkin hale getiriyoruz.
12.1 IPFSTAT:
Ipfstat'i en basit formunda calistirdiginizda, firewall'inizin neler
yaptigini gormenizi saglayacak istatistiki bilgiler verecektir.
pathfinder:~# ipfstat
input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
input packets logged: blocked 99286 passed 0
output packets logged: blocked 0 passed 0
packets logged: input 0 output 0
log failures: input 3898 output 0
fragment state(in): kept 0 lost 0
fragment state(out): kept 0 lost 0
packet state(in): kept 169364 lost 0
packet state(out): kept 431395 lost 0
ICMP replies: 0 TCP RSTs sent: 0
Result cache hits(in): 1215208 (out): 1098963
IN Pullups succeeded: 2 failed: 0
OUT Pullups succeeded: 0 failed: 0
Fastroute successes: 0 failures: 0
TCP cksum fails(in): 0 (out): 0
Packet log flags set: (0)
none
Eger, bu listeyi, her kuralimizin neler yaptigini `hit-count` lariyla detayli olarak gormek istersek -hio parametresini ekliyoruz:
pathfinder:~# ipfstat -hio
2451423 pass out on fxp0 from any to any
354727 block out on ppp0 from any to any
430918 pass out quick on ppp0 proto tcp/udp from 193.140.205.0/24 to any
keep state keep frags
Hatirlarsaniz /etc/ipf.rules 'lari yazarken magic state table' dan
bahsetmistim ;) Iste state table'in su andaki durumunu gormek isterseniz:
pathfinder:~# ipfstat -s
281458 TCP
319349 UDP
0 ICMP
19780145 hits
5723648 misses
0 maximum
0 no memory
1 active
319349 expired
281419 closed
100.100.100.1 -> 193.140.205.219 ttl 864000 pass 20490 pr 6 state 4/4
pkts 196 bytes 17394 987 -> 22 585538471:2213225493 16592:16500
pass in log quick keep state
pkt_flags & b = 2, pkt_options & ffffffff = 0
pkt_security & ffff = 0, pkt_auth & ffff = 0
12.2 IPMON:
ipfstat, bize yukaridaki turden accounting bilgisi saglamasi acisindan
gercekten cok guzel bir program, ama bazen bundan daha fazlasini
isteyebiliyoruz. Yani, gelen giden paketlerin loglanmasini
isteyebiliyoruz. Iste ipmon bunun icin yazilmis bi tool. Eger,
state-table'imizi calisirken gormek istersek:
pathfinder:~# ipmon -o S
01/08/1999 15:58:57.836053 STATE:NEW 100.100.100.1,53 ->
193.140.205.15,53 PR udp
01/08/1999 15:58:58.030815 STATE:NEW 193.140.205.15,123 ->
128.167.1.69,123 PR udp
01/08/1999 15:59:18.032174 STATE:NEW 193.140.205.15,123 ->
128.173.14.71,123 PR udp
01/08/1999 15:59:24.570107 STATE:EXPIRE 100.100.100.1,53 ->
193.140.205.15,53 PR udp Pkts 4 Bytes 356
01/08/1999 16:03:51.754867 STATE:NEW 193.140.205.13,1019 ->
100.100.100.10,22 PR tcp
01/08/1999 16:04:03.070127 STATE:EXPIRE 193.140.205.13,1019 ->
100.100.100.10,22 PR tcp Pkts 63 Bytes 4604
NAT table? Iste burda :
pathfinder:~# ipmon -o N
01/08/1999 05:30:02.466114 @2 NAT:RDR 193.140.205.253,113 <- ->
193.140.205.253,113 [100.100.100.13,45816]
01/08/1999 05:30:31.990037 @2 NAT:EXPIRE 193.140.205.253,113 <- ->
193.140.205.253,113 [100.100.100.13,45816] Pkts 10 Bytes 455
pass out quick on lo0
pass in quick on lo0
block in quick on fxp0 all with opt lsrr
block in quick on fxp0 all with opt ssrr
block in quick on fxp0 proto tcp from any to any flags FUP
block return-icmp(port-unr) in quick on fxp0 from any to any port = 113
##
## Default is block all, so i didn't specifically blocked icmp
##
## block non-routable for spoofing protection --
block in quick on fxp0 from 192.168.0.0/16 to any
block in quick on fxp0 from 172.16.0.0/12 to any
block in quick on fxp0 from 10.0.0.0/8 to any
block in quick on fxp0 from 127.0.0.0/8 to any
block in quick on fxp0 from any to 192.168.0.0/32
block in quick on fxp0 from any to 192.168.0.255/32
block in quick on fxp0 from any to 172.16.0.0/32
block in quick on fxp0 from any to 172.16.255.255/32
block out quick on fxp0 from any to 192.168.0.0/16
block out quick on fxp0 from any to 172.16.0.0/12
block out quick on fxp0 from any to 10.0.0.0/8
block out quick on fxp0 from any to 127.0.0.0/8
##
## !!!! DANGER icmp types 0, 11 allowed to DMZ
##
pass in quick on fxp0 proto icmp from any to 192.168.0.0/24 icmp-type 0
pass in quick on fxp0 proto icmp from any to 192.168.0.0/24 icmp-type 11
## for web server
pass in quick on fxp0 proto tcp from any to 192.168.0.1 port = 80 flags
S keep state
## for smtp servers
pass in quick on fxp0 proto tcp from any to 192.168.0.5 port = 25 flags
S keep state
pass in quick on fxp0 proto tcp from any to 192.168.0.3 port = 25 flags
S keep state
## pop3 for smtp servers
pass in quick on fxp0 proto tcp from any to 192.168.0.3 port = 110 flags
S keep state
pass in quick on fxp0 proto tcp from any to 192.168.0.5 port = 110 flags
S keep state
## ssh sadece apache.cslab.itu.edu.tr 'den
pass in quick on fxp0 proto tcp from 160.75.80.171/32 to 192.168.0.11
port = 22 flags S keep state
## imap for only our localnet
pass in quick on fxp0 proto tcp from 193.140.205.0/24 to 192.168.0.5
port = 143 flags S keep state
## mssql server port unu uzaktaki bir makina icin acmamizi istemisler:
pass in quick on fxp0 proto tcp from 193.140.205.55/32 to 192.168.0.43
port = 1433 flags S keep state
## disari cikisa kayitsiz sartsiz izin veriyoruz:
pass out quick on fxp0 proto tcp from any to any keep state
pass out quick on fxp0 proto udp from any to any keep state
pass out quick on fxp0 proto icmp from any to any keep state
## diger butun tcp paketler icin by-default tcp reset paketi yolluyoz.
block return-rst in quick on fxp0 proto tcp from any to any
## icmp'ler icin de port unreachable, hem de destination adresi source
adres yaparak:
block return-icmp-as-dest(port-unr) in quick on fxp0 proto udp from any
to any
## icmp'leri de bloke edip logluyoruz.
block in log quick on fxp0 proto icmp from any to any
#
# See /usr/share/ipf/nat.1 for examples.
# edit the ipnat= line in /etc/rc.conf to enable Network Address
Translation
#map ppp0 10.0.0.0/8 -> ppp0/32 portmap tcp/udp 10000:20000
## wishmaster ipnat.rules
## all networks ftp transaction
map fxp0 172.16.0.0/16 -> 193.140.192.219/32 proxy port ftp ftp/tcp
## map pathfinder to 212.174.107.33
map fxp0 172.16.3.3/32 -> 193.140.205.33/32 portmap tcp/udp 12500:60000
map fxp0 172.16.3.3/32 -> 193.140.205.33/32
## map secure lan to 193.140.192.219
map fxp0 192.168.0.0/24 -> 193.140.192.219/32 portmap tcp/udp
12500:60000
map fxp0 192.168.0.0/24 -> 193.140.192.219/32
## map local lan to 107.13
map fxp0 172.16.0.0/16 -> 193.140.192.219/32 portmap tcp/udp 12500:60000
map fxp0 172.16.0.0/16 -> 193.140.192.219/32
## Squid Redirection
#rdr fxp1 0/0 port 80 -> 172.16.0.1 port 8080 tcp
## for web server
rdr fxp0 193.140.205.219 port 80 -> 192.168.0.1 port 80
## for smtp servers
rdr fxp0 193.140.205.219 port 25 -> 192.168.0.5 port 25
rdr fxp0 193.140.205.220 port 25 -> 192.168.0.3 port 25
## pop3 for smtp servers
rdr fxp0 193.140.205.219 port 110 -> 192.168.0.5 port 110
rdr fxp0 193.140.205.220 port 110 -> 192.168.0.3 port 110
## ssh sadece apache.cslab.itu.edu.tr 'den
rdr fxp0 193.140.205.219 port 22 -> 192.168.0.11 port 22
## imap for only our localnet
rdr fxp0 193.140.205.220 port 143 -> 192.168.0.5 port143
## mssql server port unu uzaktaki bir makina icin acmamizi istemisler:
rdr fxp0 193.140.205.134 port 1433 -> 192.168.0.43 port 1433
Bu iki dosyayi, kaydedip makinayi restart etmeniz, ya
da restart etmemek istiyorsaniz,
pathfinder:~# ipf -Fa -f /etc/ipf.rules; ipnat -CF -f /etc/ipnat.rules
girmeniz yeterli olacaktir.
Bunun icin once, FTP servisinin calisma mantigini ogrenmelisiniz. Bir FTP oturumunda, iki baglanti kanali acilir: Kontrol kanali ve Veri kanali. Kontrol kanali, ftp baglantisinin kontrol edilgi kanaldir ki, istemci'nin herhangi bir portundan ftp sunucusunun 21. portuna acilir. RETR, STOR ve LIST gibi veri komutlari ise, istemci ile sunucu arasinda bir Veri kanali acilmasi ile calisabilirler. Istemci ile Sunucu arasindaki bu Veri Kanali da iki turlu acilabilir:
Pasif veri kanali: Istemci sunucuya PASV komutu
gonderir. Sunucu data baglantisi icin kendi tarafinda baska bir ip/port
ikilisi'ne veri baglantisini acar ve istemciye bu ip/port ikilisini
bildirir. Istemci de bu ip/port'a baglanir ve data islemini buradan
yapar.
a) Istemci sunucunun 21. portuna baglanir (Sunucuya dogru 21. port
acilmali)
b) Dosya alma/kaydetme/listeleme gibi bir islem yapacagi zaman istemci
PASV komutu'nu verir
c) Sunucu baska bir ip/port'a bind eder ve orada veri kanali icin
dinlemeye baslar (Sunucuya dogru bu port da acik olmali)
Peki c sikkinda dedigimiz bu portu nereden bilecegiz? Cunku bu tamamen
random olarak sunucu ve istemci arasinda anlik olarak belirleniyor? Evet
haklisiniz, bu port numarasini bilmemize imkan yoktur. Ama, modern FTP
sunucularin hemen hemen hepsinde, data connection icin kullanilacak port
araligini bildirebilmektesiniz. Iste yapmaniz gereken, boyle bir port
araligini FTP Sunucunuzda konfigure etmeniz ve sunucuya dogru bu
aralikta baglantilara izin vermeniz. Mesela FreeBSD'nin Ftp sunucusu on
tanimli olarak data baglantilari icin 49152 - 65535 arasini
kullanmaktadir.
Aktif veri kanali: Bu baglanti turunde ise FTP Sunucu
aktif durumdadir. Data kanali icin FTP Sunucu, kendi 20.portundan istemcinin bir portuna
baglanti kurar. Bu durumda:
a) Istemci N. portundan sunucunun 21. portuna baglanir. (Sunucuya dogru 21. port
acilmali)
b) Dosya alma/kaydetme/listelem gibi bir islem yapilacagi zaman istemci
PORT komutunu verir Istemci N+1 portunda dinlemeye baslar.
c) Sunucu kendi 20. portundan data baglantisi icin istemcinin N+1. portuna baglanir. (Istemciye
dogru bu port acik olmali).
Eger Sunucu filtreliyorsaniz, Pasif ftp data baglantilarini dogru filtrelemeniz daha kolay olacaktir, ama istemci filtreliyorsaniz Aktif ftp baglantilarini filtrelemeniz daha kolay oluyor, cunku ipfilter'in ftp_proxy'si aktif baglantilari takip edip gereken ip'ye gereken. portu acabilmektedir.
Karadeniz Teknik Universitesi: 2001 yilinda 2 Mbit/sec internet baglantisini korumak icin Windows NT uzerinde Gauntlet Firewall calisiyordu.Kampusdeki 2000 civarindaki istemcinin NAT ile internete cikarilmasi ve sunucularin trafigini filtreleme gorevlerini yapmaya calismaktaydi. NAT session'lari arttigi zaman Gauntlet yeni isteklere cevap veremiyor, haftada bir gibi bir surede reboot edilmesi gerekiyordu. KTU Rekt�r Dan��man� ve Network Y�neticisi Bilal Kinay bey ile bu kampusu 1 gecede uzerinde ipfilter calisan bir FreeBSD makinasina gecirdik. Bilal bey'in en son mailinde dedigine gore, KTU'nun su anki trafigi 16 Mbit/sec mis, yakinda 34 Mbit/sec olacakmis. Bilal bey artik eve ve cocuklarina daha fazla vakit ayirabiliyormus :) Ayrintili bilgi icin: kinay ~ ktu.edu.tr.
Bilgi guvenliginin dogasi gizliligi gerektirdigi icin, buradaki basari oykulerini ilgili kisilerin onay vermesi ile yayinlayabiliyoruz ancak. Eger sizin de burada yayinlanmasini istediginiz basari oykuleriniz varsa bana mail atiniz: murat ~ enderunix.org
Fragment Filtering
Performance Tuning (State table ile alakali)
Scalable ipfilter ozellikleri
Round robin redirection
TCP/IP Illustrated (vols 1, 2) Stevens.
Building Internet Firewalls Chapman & Zwicky.
ipf howto: http://www.obfuscation.org/ipf/
Linux Firewall Howto
OpenBSD Networking FAQ: http://www.enderunix.org/openbsd/faq/faq6.html
Lutfen soru sormadan once bu dokumani bir daha okuyun
Eger sorunuza cevap bulamazsaniz false.net/ipfilter adresindeki mail
arsivlerini okuyun. Eger hala aradiginizi bulamazsaniz !!! bana mail
atin belki bir kac ay icinde cevap verebilirim.
Murat Balaban murat ~ enderunix.org
http://www.EnderUNIX.ORG/
http://www.enderunix.org/murat/
Copyright (c) 2003 Murat Balaban Kaynak gosterilmek sartiyla
kullanilabilir.
EnderUNIX Software Development Team Member