Pardus/Linux iptables ile Güvenlik Duvarı Yönetimi

Protokoller ve modüller

Şimdiye kadar anlattıklarımızla ve verdiğimiz bir kaç örnekle kural ekleyerek IP adresi bloke etme, silme , güncelleme işlemlerini gördük.  Ancak daha fazlasını yaparak protokol bazında işlemlerde gerçekleştirebiliriz.

Oldukça basit bir örnek vererek başlayalım. Farzedelim ki, gelen tüm TCP trafiğini bloke etmek istiyor. Elbette pek pratik bir yaklaşım değil, fakat örneği anlamamız açısından oldukça yararlı. Bunu sağlamak için basitçe  -p  parametresini eklemeliyiz:

iptables -A INPUT -p tcp -j DROP

Bu işlemi  udp ve  icmp gibi protokolleri engellemek için de kullanabiliriz.ip6tables  ile ICMP trafiğini kontrol edebilmek için ipv6-icmp  komutuyla çalışmamız gerektiğini unutmayın.

Örneklerimizi biraz geliştirelim. Farzedelim ki belirli bir IP aralığından gelen SSH isteklerini engellemek istiyoruz. Bunun için öncelikle örnekte belirtilen gibi TCP trafiğini yakalamak gerekmektedir. Daha sonra isteğin yapıldığı hedef portu belirtmemiz gerekmektedir ki bunu da -m  parametresiyletcp modülünü kullanarak yapabiliriz. Daha sonra da paketin SSH servisi tarafından kullanılan porta gidip gitmediğine bakmamız gerekmektedir. Bu örnekte SSH servisinin standart 22 porttan dinlediği varsayılmaktadır. Yani bahsettiklerimizi örneklersek :

iptables -A INPUT -p tcp -m tcp --dport 22 -s 172.217.169.0/24 -j DROP

Şimdi, eğer ki hem SSH hem de VNC servisine bu IP aralığından erişimi kısıtlamak istediğinizi varsayarsak (VNC servisinin 5901 portundan dinlediğini kabul ediyorum), bunun için multiport modülünü kullanmamız gerekir ve bunun sayesinde --dports ile ilgili portları belirtebiliriz:

iptables -A INPUT -p tcp -m multiport --dports 22,5901 -s 172.217.169.0/24 -j DROP

Örneği farklılaştıralım biraz. Farzedelim ki, ICMP addres mask isteklerini (type 17) bloke etmek istiyoruz, o halde ilk önce trafik tipini yakalamamız gerekmektedir bunu da icmp modülününicmp-type parametresiyle sağlayabiliriz.:

iptables -A INPUT -p icmp -m icmp --icmp-type 17 -j DROP

Bir sonraki bölümde, önemli olduğunu düşündüğüm bağlantı takip (connection tracking) modülünü inceleyeceğiz. Daha başka modüllerden de yazının devamında yine bahsedeceğiz.

Bağlantı takip (connection tracking) modülü

INPUT zinciri kullanarak eklediğiniz kurallarla bloke ettiğiniz IPlerde bulunan servislere ulaşamadığınızı farketmiş olabilirsiniz. Bir şekilde INPUT zincirine yazılan kuralların OUTPUT zinicirini de etkilediğini düşünebilirsiniz. Fakat durum bundan ibaret değil.. Sisteminizden çıkan paketler hedef sunucuya ulaşacaktır, fakat sunucunun cevabını sisteminize alamayacağınız için, bir bağlantı sağlanamadığı algısı oluşturur(sonraki başlıkta farklı örneklerini görebilirsiniz)..

Burada iptables a belirtmemiz gereken şey, mevcut bir bağlantının parçası olan paketlere dokunmaması. Neyseki iptables durum kontrollü (statefull) bir güvenlik duvarı sunar ve bağlantıları takip etmek için “conntrack” isimli bir modül kullanır. conntrack modülünün takip ettiği bağlantıların durumları aşağıdakilerden birisi olabilir:

  • NEW: Bu durum bağlantının ilk paketi olduğunu belirtir.
  • ESTABLISHED: Bu durum paketlerin mevcut bir bağlantıya ait olduğunu belirtir. Bir bağlantının bu durumda olabilmesi için karşı taraftaki makinadan bir cevap almış olması gerekmektedir.
  • RELATED: Bu durum bağlantının başka “ESTABLISHED” durumda olan bir bağlantının parçası olduğunu belirtir. Örneğin; FTP bağlantıları – “RELEATED” ve “ESTABLISHED” bağlantı durumlarına örnek olur.
  • INVALID:  Bu durum, paketin geçerli herhangi bir durumu olmadığını belirtir. Bu durum farklı sebeplerden oluşabilir, bir sistemin ram kullanımının artması, ya da bazı özel tip ICMP trafikleri.
  • UNTRACKED:  NOTRACK hedefinde (target) bulunan herhangi bir takip modülü tarafından muafiyet kazanır ve takip edilmes.
  • DNAT: NAT tablosunda hedef adresi (destination) tekrar yazılan paketler için kullanılan “sanal” bir durumdur.
  • SNAT: DNAT gibi, bu durum da kaynak adresi (source) değiştirilen paketlerin bulunduğu durumdur.

Böylece, aşağıda belirtilene benzer bir kuralı diğer kuralların üzerine, genellikle en üste, koymanız gerekmektedir. --ctstate parametresi bağlantının durum etiketini değiştirmektedir.  Bazı eski kernellerde bu modül state  olarak adlandırılmaktadır ve --ctstate   parametresi yerine  --state parametresi kullanılır.

iptables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT

Ek olarak, INVALID durum etkiketine sahip paketleri DROP hedefine göndermek genellikle güzel bir fikirdir. Bu kuralı da bir önceki kuralın hemen altına ekleyebiliriz.

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP


, , , , , , , ,