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.
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:
Ö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.
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).
-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.