|
![]() |
|
![]() tarafýndan Vincent Renardias <vincent(at)renardias.com> Yazar hakkýnda: 1993'den beri GNU/Linux kullanýcýsý olan Vincent Renardias, 1996'da kendi geliþtirmelerine baþladý:Debian geliþtiricisi, GIMP ve GNOME'un Fransýzca çevirmeni, Marseille (PLUG)'daki Linux Kullanýcý Grubu'nun kurucusu...Þu an EFB' þirketinde ARGE yöneticisi.GNU/Linux hakkýnda yazmaya devam ediyor. Türkçe'ye çeviri: Özcan Güngör <ozcangungor(at)netscape.net> Ýçerik: |
Linux ile Paket Filtreleme![]() Özet:
Bu makale ilk defa Linux Magazine France'ýn güvenlik üzerine olan bölümünde yayýnlanmýþtýr.Editör, yazarlar ve tercümanlar, bu konu hakkýndaki her makalenin LinuxFocus'ta yayýnlanmasýna izin vermiþlerdir.LinuxFocus, bunlarý Ýngilizce'ye çevirir çevirmez size sunar.Bu iþle ilgili bütün kiþilere teþekkür ederim.Bu tanýtým, bu kökene ait bütün makalelerde yer alacaktýr.
|
Filtreleme mekanizmasý, baý istenmeyen paketleri yakalayan bir að olarak düþünülebilir.Önemli olan, uygun büyüklükte bir ay bulmak ve onu uygun bir yere yerleþtirmektir.
Paketli iyi bir þekilde filtrelemek için filtreleme mekanizmasý, korunacak að ile "dünyanýn geri kalan kýsmý" arasýna konmalýdýr.Bu genelde, biri iç aða, diðeri dýþarýyla baðlatý kuran router'a baðlý iki að arayüzleri(genellikle ethernet) ile yapýlýr.Böylece veriler, içeriðine göre veri geçiþine izin veren ya da vermeyen firewall içinden geçmek zorunda kalýr.
Filterleme mekanizmasýna sahip makina üç farklý þekilde ayarlanabilir:
- Basit" aðgeçidi: Bu en çok kullanýlan ayarlamadýr.Makina, iki að arasýna veya altaðlar arasýnda aðgeçidi olarak kullanýlýr.Yerel aðdaki bilgisayarlar, varsayýlan route olarak router yerine bu aðgeçidini kullanýrlar.
- Proxy-Arp" aðgeçidi: Bir önceki ayralama, aðý altaðlara böler.Bu da IP adreslerinin yarýsýný yok eder ve biraz can sýkýcýdýr.Að ve broadcast adresleri kullanlýrken, 16 adresli(aðmaskesi 28 bit olan) bir altað örneðinde sadece 14 adres kullanýlabilir.Altaða bir bit eklersek, 14 adresi 6'ya düþürürüz(8 IP eksi að ve broadcast adresleri).Bu IP kayýplarýný istemeyeceðiz için bu makalenin ileri bölümlerinde açýklanacak bir yöntemi kullanabilirsiniz.Dahasý, bu yöntemle, ne var olan makinalarýn að ayarlarýnda ne de router'da bir deðiþiklik gerekmez.
- Ethernet Köprüsü: bir ethernet aðgeçidi(IP að geçidi deðil) kurmak, filtereleme mekanizmasýnýn diðer makinalar tarafýndan görünmesini engeller.Bu tür bir ayar, Ethernet arayüzlerine herhangi bir IP adresi vermeden yapýlabilir.Bu makina, ping, traceroute gibi araçlarla bulunamaz.Bu yöntemi ancak 2.2.x kernel ile yapabilirsiz.Çünkü 2.4.x kernellerde bu özellik henüz tamamlanmadý.
Þimdi, filremizi nereye kuracaðýmýzý biliyoruz ve neyi engelleyeceðini neyi kabul edeceðini tanýmlamalýyýz.
Böyle bir filtreyi ayarlama iki þekilde yapýlabilir:
- Ýyi olaný: Sadece kuralýn kabul etiði paketler geçer diðerleri geçemez.
- Kötü olan:(maalesef en sýk kullanýlaný) sadece istenmeyen paketler durdurulur ve diðerleri kabul edilir.
Açýklamasý kolay:Ýlk durumda, bir kuralýn unutulmasý servisin doðru çalýmamasýna veya hiç çalýþmamasýna sebep olur.Genellikle hemen farkedilir ve gerekli kuralýn eklenmesi yeterlidir.
Ýkinci durumda, bir kuralýn unutulmasý, bulunmasý zor olan bir açýða neden olabilir.
Linux 2.4 ile en çok kullanýlan filtreleme yazýlýmý Netfilter'dir.Linux kernel 2.2'deki 'ipchains'i deðiþtirir.Netfilter iki bölümden oluþur:kernel ile derlenmesi gereken kernel desteði ve sisteminizde kullanýlabilir olan 'iptables' komutu.
Ýçinde açýlamasý olan bir örnek, uzun bir konuþmadan daha iyidir.Sonra filtreleme mekanizmasýnýn nasýl yükleneceðini ve nasýl ayarlanacaðýný açýklayacaðýz.Önce makina, Proxy-Arp kullanýlarak bir aðgeçidi olarak çalýþacak ve IP adreslerinin sayýsýný sýnýrlayacak.Sonra filtreleme mekanizmasýný ayarlayacaðýz.
Yazar, Debian daðýtýmý için bir önceliðe sahiptir ancak diðer daðýtýmlarla da yapýlýr.
Önce, kernelinizde Netfilter desteði olup olmadýðýný kontrol edin.Eðer varsa açýlýþ iletilerinde þunu görmelisiniz:
ip_conntrack (4095 buckets, 32760 max)
ip_tables: (c)2000 Netfilter core team
Yoksa, Netfilter desteðini seçtikten sonra kerneli tekrar derlemelisiniz.Aranan seçenekler, "Networking Options" altýndaki "Network Packet Filtering" altmeüsündedir."Netfilter Configuration" bölümünden, gerekli seçenekleri iþretleyin.Þüphe duyduüunuz seçeneklerde, hepsini seçebilirsiniz.Dahasý, Netfilter'i kernel eklemek, modül olarak kullanmaktan daha iyidir.Eðer herhngi bir sebeple Netfilter modüllerinde bir çalýþmazsa, filtreleme çalýþmaz.En iyisi olabilecel risklerden bahsetmeyelim.
Ayrýca 'iproute2' paketini de yüklemelisiniz(Bu sonuncusu, zorunlu deðil ancak örneðimizde kullancaðýz çünkü ayarlama scriptlerinin kolaylaþmasýný saðlayacaktýr).Debian ile, 'apt-get install iproute' komutunu vermeniz yeterlidir.
Diðer daðýtýmlarda, karþý gelen paketi bulun.Yükleyin veya aþaðýda kaynak kodu verilmiþtir.Ýndirin ve derleyin:
ftp://ftp.inr.ac.ru/ip-routing/
Þimdi iki Ethernet kartý ayarlanmalýdýr.Linux kernelinin, bir ethernet kartýný bulduktan sonra diðerini aramayý býraktýðýný belirtelim.Yani sadece ilk kart bulunacaktýr.
Çözüm için þunu lilo.conf dosyasýna ekleyin:
append="ether=0,0,eth1"
Þimdi Ethernet arayüzlerini ayarlayalým.Kullanacaðýmýz yöntem, bir IP adresinden tasarruf edebilmemiz için her iki karta da ayný adresi vermemize izin vermektedir.
Örneðin: 10.1.2.96/28 altaðýna sahip olalým.IP adreslerimiz 10.1.2.96 - 10.1.2.111 aralýðýndadýr.Router, 10.1.2.97 adresine ve filtreleme makinasý 10.1.2.98 adresine sahiptir.eth0 arayüzü, eðer bir hub ya da switch kullanýlmýyorsa, router'a bir RJ45 cross baðlantý ile baðlýdýr. eth1 arayüzü, bir hub/switch'e baðlanýp ordan yerel aða baðlanýr.
Her iki arayüz için de aþaðýdaki parametreler geçerlidir:
address : 10.1.2.98 netmask : 255.255.255.240 network : 10.1.2.96 broadcast: 10.1.2.111 gateway : 10.1.2.97
Sonra, ayarlamalarý bitirmek için, að kartlarýnýn ilk ayarlarýnýn yapýlmasýndan sonra aþaðýdaki script kullanýlýr:
net.vars: ayarlama deðiþkenleri PREFIX=10.1.2 DMZ_ADDR=$PREFIX.96/28 # Arayüz tanýmlamalarý BAD_IFACE=eth0 DMZ_IFACE=eth1 ROUTER=$PREFIX.97 net-config.sh: að ayarlarý scripti #!/bin/sh # Script çalýþýrken komutlaýr görebilmek için aþaðýdaki satýrýn baþýndaki diyezi silin # set -x # etc/init.d/net.vars dosyasýndaki önceden tanýmlanmýþ deðiþkenleri okuruz # Yerel aðdan þu anki rotalrý sileriz. ip route del $PREFIX.96/28 dev $BAD_IFACE ip route del $PREFIX.96/28 dev $DMZ_IFACE # Yerel aða eth1'den router'a eth0'da ulabilecek # þekilde ayarlarýz. ip route add $ROUTER dev $BAD_IFACE ip route add $PREFIX.96/28 dev $DMZ_IFACE # Her iki arayüzüde de Proxy-Arp'ý açarýz. echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp # Bir karta gelen verileri diðer karta iletebilmek # için IP yönlendirmesini açarýz. echo 1 > /proc/sys/net/ipv4/ip_forward
Bizim ayarlamalar için gerekli olan Proxy-Arp mekanizmasýna geri dönelim.
Ayný að içerisindeki bir makina diðeriyle konuþurken, kendi IP adresine karþý gelen Ethernet adresini(MAC adresini, donaným adresini) bilmesi gerekmektedir.Sonra kaynak makina þu soruyu yayýnlar: 1.2.3.4 IP ardesine sahip arayüzün MAC adresi nedir? ve karþý makina cevap vermek zorundadýr.
Bu "konuþma"nýn tcpdump ile alýnmýþ bir örneði:
- istek: 172.16.6.72 IP'li makina, 172.16.6.10 IP'li makinanýn MAC adresini sormaktadýr:
19:46:15.702516 arp who-has 172.16.6.10 tell
172.16.6.72
- cevap: 172.16.6.10 IP'li makina kart adresini gönderir:
19:46:15.702747 arp reply 172.16.6.10 is-at
0:a0:4b:7:43:71
Bu, bizi þu kýsa eçýklmamaya götürür: ARP istekleri, yayýnlamalarla(broadcast) ile yapýlýr. Böylece sadece bir fiziksel að ile sýnýrlýdýr.router'ýn MAC adresini öðrenmeye çalýþan korunan bir makinanýn isteði, filtreleme makinasý ile kesilmelidir. Proxy-ARP özelliðini açarak, sorunu çözmemiye yarým eder. Çünkü ARP istekleri sorar ve yayýlmak için bir karta gelenleri diðer karta gönderir veya tam tersi.
Bu durumda, yerel að ile dýþarýsý arasýndaki tefiði kontrol eden bir makina ile çalýþan bir aðýnýz olmalý.
Netfilter, dorudan paketler üzerinde oynamazý saðlar.Temel ayralamada, paketler 3 kural zinciri tarafýndan yönetilir:
- INPUT: bir arayüze gelen paketler için,
- FORWARD: bir arayüzden diðerine yönlendirilen bütün paketler için,
- OUTPUT: bir arayüzden çýkan bütün paketler için.
'iptables' komutu ile herhangi bir zincire, filtreleme davranýþýný etkileyen kurallar ekleyebiliriz, kurallarý silebiliriz veya deðiþtirebiliriz.
Dahasý, her zincir kendi varsayýlan poklitikasýna sahiptir. Yani herhangi bir kurala uyman paket geldiðinde ne yapacaðýný bilir.
Çok kullanýlan seçenekler þunlardýr:
- ACCEPT: paket geçebilir
- REJECT: paket reddedilir ve gerekli hata gönderilir (ICMP port ulaþýlamaz, TCP Sýfýrlama, duruma göre)
- LOG: syslog'a paketle ilgili not yazar,
- DROP: paket reddedilir ve bir hata gönderilmez.
Burada, iptables'ýn bütün zincirleri deðiþtirebilecek seçenekleri bulunmaktadýr.Ayrýntýlarýna daha sonra gireceðiz:
-N: yani bir zincir oluþturur.
-X: boþ bir zinciri siler.
-P: bir zincirin varsayýlan ploitikasýný deðiþtirir.
-L: bir zincirdeli kurallarý listeler.
-F: bir zincirdeki bütün kurallarý siler.
-Z: bir zincir içinde geçmiþ bütün paket sayaçlarýný ve byte'larýný sýfýrlar.
Bir zinciri deðiþtimek için aþaðýdaki komular kullanýlabilir:
-A: bir zincirin sonuna bir kural ekler.
-I: zincirin belirtilen yerine bir kural ekler
-R: belirtilen kuralýn zincir içindeki yerini deðiþtirir.
-D: bir zincirde, tanýtýlmýþ veya numarasý verilmiþ bir kuralý siler.
Pratik bir örnek görelim: Verilen bir makinadan gelen PING cevaplarýný (yani 'echo-reply' tipindeki ICMP paketleri) engelleyelim.
Önce, verilen makinayý ping'leyebildiðimizi deneyelim:
# ping -c 1 172.16.6.74 PING 172.16.6.74 (172.16.6.74): 56 data bytes 64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms --- 172.16.6.74 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.6/0.6/0.6 msÞimdi, 172.16.6.74 IP'li makinadan gelen ICMP-Reply ('-p icmp --icmp-type echo reply') paketlerini engelleyecek kuralý INPUT zincirine ekleyelim. Bu paketler, gözardý edileceklerdir ('-j DROP').
# iptables -A INPUT -s 172.16.6.74 -p icmp --icmp-type echo-reply -j DROP
Þimdi, bu makinayý ping'leyelelim:
# ping -c 3 172.16.6.74 PING 172.16.6.74 (172.16.6.74): 56 data bytes --- 172.16.6.74 ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss
Beklediðimiz gibi, cevaplar geçemiyor. 3 cevabýn(252 byte'lýk 3 paket) geçemediðini kontrol edebiliriz:
# iptables -L INPUT -v Chain INPUT (policy ACCEPT 604K packets, 482M bytes) pkts bytes target prot opt in out source destination 3 252 DROP icmp -- any any 172.16.6.74 anywhere
Ýlk duruma geri dönmek için, INPUT zincirindeki ilk kuralý silmeliyiz:
# iptables -D INPUT 1
Þimdi, PING tekrar çelýþýyor:
# ping -c 1 172.16.6.74 PING 172.16.6.74 (172.16.6.74): 56 data bytes 64 bytes from 172.16.6.74: icmp_seq=0 ttl=255 time=0.6 ms --- 172.16.6.74 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.6/0.6/0.6 ms #
Ýþe yarýyor !
Var olan 3 zincire (bunlar hiçbir zaman silinemez) yenilerini ekleyebilrsiniz ve bunlar üzerinde de bir akýþ tanýmlayabilirsiniz.Bu, örneðin, çeþitli zincirlerde ayný kuralý tekrarlamanýnýzý engeller.
Þimdi, bir firewall için minimum kurallarý ayarlayalým. SSH'e, DNS'e, http ve smtp'ye izin verir ve siðerlerini engeller.
Basitleþtirmek için, komutlar bir kabuk scriptinde yazýlmýþtýr. Script, yeni kurallar eklemeden önce var olanlarý siler. Bu numara, kurallarýn ikinci kez yazýlmasýný engeller.
rc.firewall #!/bin/sh # Kurallarýn silinmesi iptables -F iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD # Zincir, doðrultuya göre oluþturulur. # bad = eth0 (dýþarý) # dmz = eth1 (içeri) iptables -X bad-dmz iptables -N bad-dmz iptables -X dmz-bad iptables -N dmz-bad iptables -X icmp-acc iptables -N icmp-acc iptables -X log-and-drop iptables -N log-and-drop # Belirli zincir, paketleri engellemeden önce onlarý kaydeder iptables -A log-and-drop -j LOG --log-prefix "drop " iptables -A log-and-drop -j DROP # TCP bayraklarý kullanýlan paketler # ve hiç kullanýlmamýþ paketler engellenir. iptables -A FORWARD -p tcp --tcp-flags ALL ALL -j log-and-drop iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j log-and-drop # Bilinen IP adreslerinden gelen paketler engellenir. iptables -A FORWARD -i eth+ -s 224.0.0.0/4 -j log-and-drop iptables -A FORWARD -i eth+ -s 192.168.0.0/16 -j log-and-drop iptables -A FORWARD -i eth+ -s 172.16.0.0/12 -j log-and-drop iptables -A FORWARD -i eth+ -s 10.0.0.0/8 -j log-and-drop # Kurulmuþ baðlantýlara ait paketler geçirilir. iptables -A FORWARD -m state --state INVALID -j log-and-drop iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT # Paketin köküna baðlý olarak, karþý gelen zincir gönderlir. iptables -A FORWARD -s $DMZ_ADDR -i $DMZ_IFACE -o $BAD_IFACE -j dmz-bad iptables -A FORWARD -o $DMZ_IFACE -j bad-dmz # kalanlar engellenir. iptables -A FORWARD -j log-and-drop # Geçirilen ICMPler iptables -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type echo-request -j ACCEPT iptables -A icmp-acc -p icmp --icmp-type echo-reply -j ACCEPT iptables -A icmp-acc -j log-and-drop # Dýþarýsý -> Ýçerisi # posta, DNS, http(s) ve SSH geçirilir iptables -A bad-dmz -p tcp --dport smtp -j ACCEPT iptables -A bad-dmz -p udp --dport domain -j ACCEPT iptables -A bad-dmz -p tcp --dport domain -j ACCEPT iptables -A bad-dmz -p tcp --dport www -j ACCEPT iptables -A bad-dmz -p tcp --dport https -j ACCEPT iptables -A bad-dmz -p tcp --dport ssh -j ACCEPT iptables -A bad-dmz -p icmp -j icmp-acc iptables -A bad-dmz -j log-and-drop # Ýçerisi -> Dýþarýsý # posta, DNS, http(s) ve telnet geçirilir iptables -A dmz-bad -p tcp --dport smtp -j ACCEPT iptables -A dmz-bad -p tcp --sport smtp -j ACCEPT iptables -A dmz-bad -p udp --dport domain -j ACCEPT iptables -A dmz-bad -p tcp --dport domain -j ACCEPT iptables -A dmz-bad -p tcp --dport www -j ACCEPT iptables -A dmz-bad -p tcp --dport https -j ACCEPT iptables -A dmz-bad -p tcp --dport telnet -j ACCEPT iptables -A dmz-bad -p icmp -j icmp-acc iptables -A dmz-bad -j log-and-drop # Makinanýn kendisi için zincir iptables -N bad-if iptables -N dmz-if iptables -A INPUT -i $BAD_IFACE -j bad-if iptables -A INPUT -i $DMZ_IFACE -j dmz-if # Dýþ arayüz # Sadece SSH, bu makinaya geçirilir iptables -A bad-if -p icmp -j icmp-acc iptables -A bad-if -p tcp --dport ssh -j ACCEPT iptables -A bad-if -p tcp --sport ssh -j ACCEPT ipchains -A bad-if -j log-and-drop # Ýç arayüz iptables -A dmz-if -p icmp -j icmp-acc iptables -A dmz-if -j ACCEPT
Servis kalitesi hakkýnda birkaç söz. Linux, ToS(Type of service-servis tipi) alanýný deðiþtirebilir ve pakete farklý öncelikler verebilir. Örneðin, aþaðýdaki komut, dýþarý giden SSH paketlerini, baðlantý cevabýný artýracak þekilde deðiþtirir.
iptables -A OUTPUT -t mangle -p tcp --dport ssh -j TOS --set-tos Minimize-Delay
Ayný þekilde, '--set-tos Maximize-Throughput' ile FTP baðlantýlarýnýn, oturumun interaktifliðinin zararýna, veri aktarým oranýný artýrabilirsiniz.
Hepsi bu. Artýk etkili bir filtreleme sistemini ayarlamasýnýn temellerini biliyorsunuz. Yine de, güvenlik söz konusunu olduðunda firewall'un her derde deva olmadýðýný akýlýnýzdan çýkarmayýn.Bu sadece bir önlemdir. Firewall kurulumu, güçlü þifreler kullanmanýzý, son güvenlik yamalarýný yapmanýzý, saldýrý algýlama sistemleri kullanmanýzý, vs. engellemez.
|
Görselyöre sayfalarýnýn bakýmý, LinuxFocus Editörleri tarafýndan yapýlmaktadýr
© Vincent Renardias, FDL LinuxFocus.org |
Çeviri bilgisi:
|
2003-04-23, generated by lfparser version 2.35