Internete bağlanan her sistem potansiyel saldırı tehlikelerine gebedir. Bir saldırgan direkt olarak veya kendini gizleyerek sisteme sızmak isteyebilir. Güncel Linux çekirdeklerinde kullanılan firewalllarin son gözdesi iptables, paket filtrelemesi yaparak erişim yetkisini belli bir seviyede tutar. Bilinmelidir ki sistem kurulmaya başladığı andan itibaren, yönetim politikasinin belirlenmeye başlaması ve firewall'in bu politika üzerine inşası şarttır. Netfilter kurulmadan önce, kullanıcının gereksiz servisleri çalıştırmaması ve gerekli olanlarda daha seçici davranması gerekir. Daha seçici davranmasından kasıt bir servisin her zaman bir kaç tane daha alternatifi olmasıdır . Sendmail eski günlerdeki verdiği güveni artık verememektedir. Peki firewall bizi ne kadar korur? Firewall kurduktan sonra hiç bir saldırgan bizim sistemimize giremez deyip içimiz rahat edebilir mi? Eğer Firewall kurup makinamızı kapatıp hiç açmayacaksak bu doğrudur. Bunu yapmak için firewall kurmakta gerekmez zaten. Peki biz ne yapıyoruz. Tek başına firewall bir güvenlik görevlisi gibi çalışır. Bir şirketin koruma memurundan öteye gidemez. Yani içeri giren bir şahsın elini kolunu sallayak girmesine izin vermez. Belli bir aramadan geçirerek üzerinde tehlikeli madde bulunmadığına inandığı andan sonra içeri girmesine izin verir. Ama bulaşıcı bir hastalık taşıyıp taşımadığını bilemez çünkü bu görev ona ait değildir. Bu şu demektir firewall paket filitrelemesi yapar uygun bölgelere uygun paketleri geçirir. Ama paketlerin içindeki datalarla ilgilenmez. TCP-IP protokolunu bilenlerin ne demek isteğimi net anladığını umuyorum. Internete bağlanan her sistem potansiyel tehlike altındadır. Peki bağlanmayan sistem değil midir? Büyük şirketler çalışanlarına güvenirler ama içerden de tehlike gelebilir. IPtables arabirim filtremesi de yapar. Yani sadece Internetten değil birkaç arabirim bulunduran büyük bir ağda da erişim yetkisi düzenlenebilir. Büyük bir ağda gereklidir de. Iptables kurallar zinciri mantığı ile çalışır, bu zincirler INPUT, OUTPUT, FORWARD, olup paket adreslerini yönetmek için PREROUTING, POSTROUTING kullanılır. Kullanıcı isterse kendi tanımladığı bir zinciride ekleyebilir. TANIMLI ZİNCİRLER INPUT Gelen paketler için kurallar zinciri. OUTPUT Giden paketler için kurallar zinciri. FORWARD Yönlendirilen paketler için kurallar zinciri. PREROUTING Sadece NAT içindir. Gelen paketlerin değiştirilmesi için. POSTROUTING Sadece NAT içindir. Giden paketlerin değiştirilmesi için. Not : Bu zincirler silinemez. Netfilter da kurallar oluşturmak için iptables komutu kullanılır. Herhangi bir zincire gelen paket kurallardan herhangi biriyle uyuşana kadar ilerleyerek zincirin sonuna kadar ulaşır. Herhangi bir kuralla uyuşmayan paket işleme sokulmaz. Netfilter zincir kurallari if-then-else manığında çalışır. # Iptables -A INPUT -j ACCEPT -i eth1 -s 10.1.34.0/255.255.255.0 eth1 arabiriminden gelen 10.1.34.0 ağına ve 255.255.255.0 netmask'ına ait paketler kabul ediliyor. IPTABLES HEDEFLERİ ACCEPT Paketlerin geçisine izin verilir. DROP Paketlerin geçişine izin verilmez. REJECT Paketlerin erişimi reddedilir ve gönderen bilgilendirilir. RETURN Zincirin sonuna gönderilir. QUEUE Paketler kullanıcı alanına gönderilir. IPTABLES PARAMETRELERİ -A ZİNCİR Zincire kural ekler. -E ZİNCİR Zinciri yeniden adlandırır. -D ZİNCİR Zincirden bir kural siler. -D ZİNCİR Zincirden belirtilen numaradaki kurali siler. -L ZİNCİR Belirtilen zincirdeki kurallari gösterir. -E ZİNCİR Zinciri yeniden adlandirir. -l ZİNCİR Zincirde belirtilen numaralı alana kuralı ekler. -R ZİNCİR Zincirde kuralın yerine başkasını koyar. -R ZİNCİR Zincirde belirtilen numaralı alana bir başkasını koyar. -N ZİNCİR Yeni bir zincir oluşturur. -X ZİNCİR Kullanıcının eklediği bir zinciri siler. -F ZİNCİR Zincirdeki kuralların tümünü siler. -P ZİNCİR Zincire genel politika ekler. Not : Zincirler büyük harflerle yazılır. IPTABLES SEÇENEKLERİ! Kuralı tersine çevirir. -s Kaynak adresini belirtir.127.0.0.1/255.0.0.0 gibi.. -p UDP, TCP, ICMP, ALL protokollerinden biri kullanılır. ALL hepsi içindir. --sport Kaynak portu belirtir. etc/services da listelenen port isimleri olabilir ya da numarasıyla yazılabilir. --source-port --sport ile aynı -d Varış adresidir. --dport Varış portudur. --icmp-type ICMP tipini belirtir. -i arabirim eth1, ppp0 gibi.. -j Kural için belirtilen zincirde hedef belirtir. -j ACCEPT gibi.. --to-source Yeni kaynak ip'si yazar SNAT ile kullanılır. -o Çıkan ve yönlendirilen zincirlerde kullanılır.(-o ppp1 gibi) -t Tabloyu belirtir. Nat tablosu için -t nat şeklinde yazılır. -m Kullanılacak modülü belirtir.-m limit gibi --state State modülü içindir. NEW, INVALID, RELATED ve ESTABLISHED seçenekleri içindir. --tcp-flags TCP flag'laridir. ACK, FIN, RST, URG, SYN, PS veya ALL. --syn SYN paketlerini kontrol etmek içindir. --limit Saniye başina eşleşme hızını kontrol etmek için kullanılır. -V Iptables'ın versiyonunu öğrenmek için kullanılır. --mac-source Belirtilen fiziksel adres için işleme alınır yada alınmaz. Iptables'da CIDR adres biçimide kullanabilirsiniz 192.168.1.0/24 192.168.1.0/255.255.255.0 /8 255.0.0.0 (8 bitlik ağ alanı 24 bitlik host alanı) /16 255.255.0.0 (16 bitlik ağ alanı 16 bitlik host alanı) /24 255.255.255.0 (24 bitlik ağ alanı 8 bitlik host alanı) /26 255.255.255.192 (26 bitlik ağ alanı 6 bitlik host alanı) GENEL BİR SCRİPT İlk önce iptables komutunu yazar bir kural eklemek için -A yazıp hangi zincire uygulayacaksanız onu yazarsınız. Mesela: # iptables -A INPUT -s 10.1.34.1 -j ACCEPT 10.1.34.1 adresinden gelen tüm paketler kabul ediliyor veya tam tersi #iptables -A INPUT -j ACCEPT! -s 10.1.34.1 10.1.34.1 adresinin dişinda gelen tüm paketler kabul ediliyor. Tüm bir ağı kapsayan kurallar için ağ adreside belirtilebilir. #iptables -A INPUT -s 10.1.34.0/255.255.255.0 -j ACCEPT Anlaşıldığı gibi 10.1.34.0 ağındaki paketler kabul edilebilir. Iptables'ı öğrenmenin en iyi yolunun bir kurallar bütününü bulup onu okumaktan geçtiğine inanıyorum. Yukarıdaki iptables komutundaki ACCEPT 10.1.34.1 ağlari için paketin olumlu kabul edilerek bir sonraki zincire aktarılacağını göstermektedir. Iptables yazılmaya başlanırken önce paket yönlendirme kapatılır. Sonra tüm zincirlerdeki kurallar silinir. #echo 0 > /proc/sys/net/ipv4/ip_forward #iptables -F INPUT #iptables -F OUTPUT #iptables -F FORWARD Artik iptables'in durumuna baktığımızda boştur. Bakmak için #iptables -L -n parametreleri kullanılabilir yada Redhat sistemlerde #service iptables status yazılarak yazdığımız iptables'ın durumu görülebilir. Zincirlerin genel politikasını belirtmek için ise; #iptables -P INPUT DROP #iptables -P OUTPUT ACCEPT #iptables -P FORWARD ACCEPT Burada dışarıdan bağlantı yapmak isteyen paketlere izin verilmemektedir. Çıkan paketler ve iletilen paketlere izin verilmiştir. #iptables -A INPUT -j DROP -i eth1! -s 10.1.34.0/255.255.255.0 #iptables -A FORWARD -j DROP -i eth1! -s 10.1.34.0/255.255.255.0 eth1 arabiriminden gelen paketlerin kendi ağımıza ait olup olmadığı kontrol ediliyor. #iptables -A INPUT -j DROP -i! eth1 -s 10.1.34.0/255.255.255.0 #iptables -A FORWARD -j DROP -i! eth1 -s 10.1.34.0/255.255.255.0 eth1 dışında gelen paketlerin kaynak ip adreslerinin bizim ağımızla aynı olup olmadığı kontrol edilerek böle paketler reddediliyor. IP Spoof'lara engel olmak için önlem alınıyor. #iptables -A INPUT -j DROP! -i lo -s 127.0.0.0/255.0.0.0 #iptables -A FORWARD -j DROP -i! lo -s 127.0.0.0/255.0.0.0 loopback arabirimimiz için de aynı kontrolu yapıp bu paketleri reddediyoruz. #iptables -A INPUT -j ACCEPT -i lo Kendi sistemimizin haberleşmesi için gönderilecek ve alınacak paket trafiğine izin veriyoruz. #iptables -A INPUT -j ACCEPT -p -tcp -i eth0 –dport 80 -s 192.168.1.1 #iptables -A INPUT -m state –state ESTABLISHED, RELATED -i eth0 -p tcp –sport 80 -s 192.168.1.1 -d 10.1.34.0/255.255.255.0 -j ACCEPT #iptables -A OUTPUT -m state –state NEW -o eth0 -p tcp –sport 80 -d 10.1.34.0/255.255.255.0 -j DROP Dış ağdan web sunucumuza erişim izni veriyoruz. İkinci satırda ise kurulmuş bağlantılara izin vererek, web sunucumuzu kendi ağımızda çalışır hale getiriyoruz. Web server'ımız 192.168.1.1'dir. İstersek başka bir arabirime yada başka bir makinayida web sunucu olarak çalıştırabiliriz. Web sunucusu dışardan ve kendi ağımızdan gelen isteklere cevap vermekte fakat kendi ağımızla bağlantı kurmasına izin verilmemekte. Web server üzerinden ağımıza mudahale etmek isteyen olabilir. #iptables -A INPUT -i eth1 -p udp --dport 67:68 --sport 67:68 -j ACCEPT DHCP serverımızın varlığınıda kurallarımız arasına belirtiyoruz. #iptables -A INPUT -m state –state ESTABLISHED, RELATED -i eth0 -p! icmp -j ACCEPT Dış ağlara netfilter üzerinden erişim izni vermek için kurulu bağlantılar korunarak ICMP paketleri dışındaki bütün paketler kabul ediliyor. #iptables -A INPUT -m state –state NEW -i eth0 -j DROP #iptables -A FORWARD -m state –state NEW -i eth0 -j DROP Dış ağdan gelecek SYN paketlerini reddediyoruz. Dışardan bağlantı başlatılmasını bu sayede engelliyoruz. #iptables -A INPUT -j ACCEPT -p all -i eth1 -s 10.1.34.0/255.255.255.0 Ağımıza gelen tüm paketler kabul ediliyor. #iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE eth1'de olan ağımızın (10.1.34.0) eth0 dan çıkışını ayarlayıp maskeleme oluşturuyoruz. #iptables -A INPUT -j ACCEPT -p icmp -i eth0 –icmp-type 0 -d 192.168.1.1 #iptables -A INPUT -j ACCEPT -p icmp -i eth0 –icmp-type 8 -d 192.168.1.1 #iptables -A INPUT -j ACCEPT -p icmp -i eth0 –icmp-type 3 -d 192.168.1.1 ICMP paketlerine izin veriyoruz. ICMP . TÜM ICMP MESAJ TİPLERİ 0 Echo Cevabı 3 Hedefe ulaşılamıyor. 4 SQ 5 Tekrar Yöneltme 8 Echo İsteği 11 Parametre Problemi 12 Zaman Aşımı 13 Zaman Damgası İsteği 14 Zaman Damgası Cevabı 15 Bilgi İsteği 16 Bilgi Cevabı 17 Adres Maske İsteği 18 Adres Maske Cevabı #iptables -A INPUT -p tcp -i eth0 --tcp-flags SYN, ACK, FIN, RST RST -m limit --limit 1/s -j ACCEPT Port taramalarından korunmak için eşleşmeyi 1 saniye veriyoruz. #iptables -A INPUT -p icmp -i eth0 --icmp-type 8 -m limit --limit 1/s -j ACCEPT Ping of Death ataklar'dan korunmak için eşleşmeyi 1 saniye veriyoruz. echo 1 > /proc/sys/net/ipv4/ip_forward