magmalinux-iptables-eklentileri

7  Iptables Eklentileri

Bu bölümde, paket filtreleme bölümünde incelediklerimiz dışındaki Iptables eklentilerini inceleyeceğiz. Bu eklentiler iptables’a -m (ya da –match) parametresi verildiği zaman yüklenir.

7.1  State Eklentisi

Iptables’a -m state parametresi verilerek yüklenir. Bu parametre Linux çekirdeğindeki bağlantı izleme (connection tracking) modülünü aktif eder. Bu sayede, gelen paketin yeni bir bağlantı açıp açmadığını ya da varolan bir bağlantıya mı ait olduğunu öğrenebiliriz. Bağlantının dumunu izlememizi sağlayan bu modül sayesinde çok güçlü bir güvenlik duvarı oluşturabiliriz.

-m state parametresinden sonra, bu modülle birlikte gelen –state parametresi kullanılır. –state parametresine virgülle ayrılmış, bağlantı durumlarını içeren bir liste belirtilir. Bu listede aşağıdaki seçenekler (bağlantı durumları) bulunabilir:

 

  • NEW paketin yeni bir bağlantı açtığını belirtir.
     
  • ESTABLISHED paketin var olan bir bağlantıya ait olduğunu belirtir (Genellikle bir cevap paketidir).
     
  • RELATED paketin var olan bir bağlantıya ait olmadığını fakat var olan bir bağlantı ile ilişkili olduğunu belirtir (ICMP hata belirtme paketi veya FTP veri bağlantısını başlatan paket).
     
  • INVALID bir sebeple kimliği tayin edilemeyen bir paketi belirtir (Örneğin herhangi bir bağlantıya ait olmayan ICMP hata paketleri). Bu tip paketler genellikle DROP hedefine gönderilir.


Örneğin:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Yukarıdaki iki kuraldan ilki, gelen paketlerden yalnızca var olan bir bağlantıya ait olan ve var olan bir bağlantı ile ilişkili olan paketleri kabul eder. İkinci kural ise, giden paketlerden yeni bağlantı açan, var olan bir bağlantıya ait olan ve var olan bir bağlantı ile ilişkili olan paketleri kabul eder.

Diyelim ki, dışarıdan bağlananlara bütün portlarınızı kapatmak istiyorsunuz. İlk olarak INPUT zincirimizi temizleyelim ve INPUT zincirinin polikasını DROP yapalım:

# iptables -F INPUT

# iptables -P INPUT DROP

Bu durumda dışarıdan bize gelen bütün paketler engellenecek. Fakat, örneğin Firefox ile web'de gezinmek istersek, Firefox HTTP isteği gönderirken ve alırken 1024 üzeri portları kullandığından, karşıdaki sunucunun verdiği cevabın bize ulaşabilmesi için 1024'ten büyük bütün portlara izin vermemiz gerekir:

# iptables -A INPUT -p ALL –dport 1024:  -j ACCEPT

Yukarıdaki kural, aynı zamanda bizim için bir güvenlik tehlikesi olur. İşte bu noktada, yukarıda 1024'ten ve üzerindeki portları açmak yerine, state modülünü kullanabiliriz:

# iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

Bu kuralda, sadece var olan bağlantıya ait paketleri (ESTABLISHED) ve var olan bağlantı ile ilgili paketleri (RELATED) kabul ettik. Bize yeni bağlantı açan paketler (NEW) bu kural ile eşleşmeyeceğinden, INPUT zincirinin varsayılan politikası olan DROP uygulanacak ve bize dışarıdan açılan bağlantılar reddedilecek.
 

7.2  Limit Eklentisi

Iptables’a -m limit parametresi verilerek yüklenir. Bu eklenti; bir kuralın eşleşme oranını kısıtlayarak genellikle DoS saldırılarından korunmak için kullanılır. Örneğin:

# iptables -A INPUT -p tcp –dport 23 -m state –state NEW \

     -m limit –limit 5/minute –limit-burst 10 -j ACCEPT

Limit eklentisi ile çalışırken –limit ve –limit-burst parametreleri kullanılır. –limit-burst parametresi ile toplamda kaç paketle eşleneceği belirtilir (Örneğimizde 10). –limit-burst parametresinde belirtilen değeri, bir kota gibi düşünebilirsiniz. –limit parametresinde belirtilen 5/minute örneği, –limit-burst ile belirtilen kotada dakika da 5 boş yer açar.

1. Başlangıçta kotanız en fazla 10 paket (–limit-burst 10)
2. Paketler geldikçe kotanız birer birer azaldı.
3. Her belirtilen zaman aralığında (sec (saniye), minute (dakika), hour (saat), day (gün)) kota da 5 paketlik yer açıldı (–limit 5/minute).

 

7.3  Recent Eklentisi

-m recent parametresi ile yüklenir. Limit modülüne benzemekle birlikte, bağlanan kullanıcıların IP adreslerini tutarak, IP adresine göre sınırlama yapar. Örneğin, aynı IP adresinden 60 saniye içerisinde en fazla 5 kere SSH bağlantısı açmasına izin vermek istiyorsak:

# iptables -A INPUT -p tcp –dport ssh –m state –state NEW -m recent –set
# iptables -A INPUT -p tcp –dport ssh –m state –state NEW -m recent \
        –update –seconds 60 –hitcount 6 -j DROP
# iptables -A INPUT -p tcp –dport ssh -j ACCEPT

kurallarını kullanabiliriz. Örneğin ilk kuralında recent modülü, -m recent –set ile ssh portuna bağlanan (–dport ssh) istemcinin IP adresini kaydeder.

İkinci kuralda, –update parametresi, eğer daha önceden aynı IP'den istek gelmişse, paketin bu kuralla eşleşmesini ve bu IP'den gelen isteklerle ilgili bilgileri günceller. Paket –seconds parametresinde belirtilen saniye icerisinde, aynı IP'den gelmiş ise kural eşleşir. Paketi gönderen –hitcount parametresi ile belirtilen sayıda bağlanmış ise kural eşleşir. Yani ikinci kuralda aynı IP adresi 60 saniye içerisinde (–seconds 60), 6. bağlantısını açma (–hitcount 6 ve –state NEW) girişiminde bulunmuşsa bu paketi kabul etmiyoruz.

Üçüncü kuralda; eğer ikinci kuralla eşleşmemişse, bu kullanıcı 60 saniye içerisinde 5 ten fazla bağlantı açmadığı için, bu paketi kabul ediyoruz.

Yukarıdaki örnek, 60 saniye içerisinde sunucuya yapılan toplam bağlantı sayısını 5 ile sınırlayacaktır (Yani recent modülünü başka portlar için de kullanırsanız (örneğin http portu); 60 saniye içerisinde ssh ile 3 kere, http ile 2 kere bağlandığınıldığında, bu kullanıcıdan bağlantı açan başka paket kabul edilmeyecektir). Eğer her port için 60 saniye içerisinde maksimum bağlantı sayısını ayrı ayrı 5 ile sınırlamak istiyorsanız, recent modülünü kullanırken, her kullandığınız port için ayrı bir IP adresi listesi oluşturmalısınız. Bunu yapmak için recent modülü ile birlikte –name parametresini kullanıyoruz. Örneğin:

# iptables -A INPUT -p tcp –dport ssh –m state –state NEW -m recent \

        –set –name "sshIPlistesi"

# iptables -A INPUT -p tcp –dport ssh –m state –state NEW -m recent \

        –name "sshIPlistesi" –update –seconds 60 –hitcount 6 -j DROP

# iptables -A INPUT -p tcp –dport ssh -j ACCEPT

 

# iptables -A INPUT -p tcp –dport http –m state –state NEW -m recent \

        –set –name "httpIPlistesi"

# iptables -A INPUT -p tcp –dport http –m state –state NEW -m recent \

        –name "httpIPlistesi" –update –seconds 60 –hitcount 6 -j DROP

# iptables -A INPUT -p tcp –dport http -j ACCEPT

–name parametresi –set parametresi ile birlikte kullanıldığında IP adreslerinin tutulacağı bir liste yaratır. Daha sonradan –update ile birlikte, –name parametresinde belirtilen listeye bakılarak işlem yapılır.