Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

iptables'ın string ve recent Modüllerini Kullanarak İçerik Tabanlı Filtreleme ve Kısa Süreli Yoğun İstek Engelleme

devster

Üye
Katılım
14 Mart 2026
Mesajlar
23
Merhaba arkadaşlar, bugün sizlere iptables'ın biraz daha az bilinen ama bir o kadar da güçlü iki modülünden, `string` ve `recent`'ten bahsedeceğim. Bu modüllerle, sadece IP adresine değil, paketin içeriğine bakarak filtreleme yapabilir ve kısa süreli yoğun saldırıları (örneğin brute-force) basit kurallarla engelleyebilirsiniz. Benim sunucularda özellikle WordPress veya benzeri yönetim panellerini korumak için sıkça kullandığım bir yöntem.

🔍 String Modülü ile İçerik Tabanlı Filtreleme Nedir?

`string` modülü, ağ paketlerinin veri yükü (payload) içinde belirli bir kelime veya kalıp (string) aramanızı sağlar. Örneğin, tüm ağ trafiği içinde "wp-admin" geçen veya "/etc/passwd" ifadesini arayan istekleri tespit edip engelleyebilirsiniz. Bu, basit tarama/istismar girişimlerini durdurmak için çok etkilidir.

⚙️ String Modülü ile Kural Nasıl Eklenir?

Diyelim ki, sunucunuza gelen HTTP/HTTPS trafiğinde, içinde "wp-login.php" geçen ve 80 veya 443 portuna yapılan istekleri DROP etmek istiyorsunuz. Kuralımız şöyle olacak:

Bash:
iptables -A INPUT -p tcp --dport 80 -m string --string "wp-login.php" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 443 -m string --string "wp-login.php" --algo bm -j DROP

Burada kullandığımız parametreleri açıklayayım:
- `-m string`: String modülünü kullanacağımızı belirtiyoruz.
- `--string "wp-login.php"`: Aramak istediğimiz kelime/ifade.
- `--algo bm`: Arama algoritması. `bm` (Boyer-Moore) genellikle daha hızlıdır, `kmp` de kullanılabilir.
- `-j DROP`: Eşleşme olursa paketi tamamen at.

⚠️ String Modülü Kullanırken Dikkat!

Bu modül çok güçlü ama dikkatli kullanılmazsa kendi trafiğinizi de engelleyebilirsiniz. Örneğin, kendi sitenizin admin paneline erişemeyebilirsiniz. Bu yüzden güvenilir IP'lerinizi öncelikle bir `ACCEPT` kuralı ile kabul etmek çok önemli. Ayrıca, bu tür kuralları INPUT zincirine değil, özel bir zincir oluşturup orada yönetmeniz, hata ayıklamayı kolaylaştırır.

🛡️ Recent Modülü ile Dinamik Engelleme Nedir?

`recent` modülü, belirli bir kurala uyan bağlantıları bir listede dinamik olarak tutmamızı sağlar. Örneğin, "30 saniye içinde 80. porttan 5'ten fazla bağlantı yapan IP'yi 1 saat engelle" gibi kurallar yazabiliriz. Bu, SSH brute-force veya yorum spam'i gibi saldırılara karşı altın değerindedir.

⚙️ Recent Modülü ile SSH Brute-Force Koruması

SSH portunuz (22) için bir koruma kuralı oluşturalım. Hedefimiz, 60 saniye içinde 3 bağlantı denemesi yapan IP'yi 300 saniye (5 dakika) boyunca engellemek.

Bash:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name SSH --rsource -j DROP

İlk kuralın işlevi: SSH portuna yapılan her YENİ (`--state NEW`) bağlantıyı, `SSH` adlı listeye kaydeder (`--set`). Kaynak IP'yi (`--rsource`) listeye ekler.

İkinci kuralın işlevi: Aynı şekilde yeni bir bağlantı geldiğinde, bu IP `SSH` listesinde var mı diye bakar (`--update`). Eğer bu IP, son 60 saniye içinde listeye 3 defa (`--hitcount 3`) kaydedilmişse, bu paketi `DROP` eder ve aynı zamanda listedeki kaydı günceller (engelleme süresini sıfırlar). Yani IP, 60 saniyelik pencere içinde 3. denemeden sonraki ilk paketle engellenir ve bu engelleme, o andan itibaren 60 saniye daha devam eder.

💎 İki Modülü Birleştirerek Güçlü Bir Kural

Şimdi bu iki gücü birleştirelim. Diyelim ki birisi HTTP isteğinin içinde "sqlmap" (bir SQL injection aracı) kelimesi geçiriyor. Bu tek bir isteği engellemek yerine, bu IP'yi bir süreliğine tamamen kara listeye alalım.

Bash:
iptables -A INPUT -p tcp --dport 80 -m string --string "sqlmap" --algo bm -m recent --set --name BADGUY --rsource
iptables -A INPUT -m recent --name BADGUY --update --seconds 3600 -j DROP

İlk kural: 80. porta gelen ve içinde "sqlmap" kelimesi geçen bir paket tespit ederse, kaynak IP'yi `BADGUY` adlı listeye ekler (`--set`).

İkinci kural: `INPUT` zincirinin başlarında bir yerde (örneğin, genel kabul kurallarından hemen sonra) yer alır. Gelen herhangi bir paket için, kaynak IP `BADGUY` listesinde var mı diye kontrol eder (`--update`). Eğer bu IP son 3600 saniye (1 saat) içinde listeye eklenmişse, o IP'den gelen TÜM trafiği `DROP` eder. Yani, zararlı bir içerik gönderen IP, 1 saat boyunca tamamen engellenmiş olur.

Önemli Not: Bu tür kuralları yazdıktan sonra, mutlaka iptables-save komutu ile kalıcı hale getirmelisiniz. Aksi takdirde sunucu yeniden başlatıldığında kurallarınız silinir. Debian/Ubuntu için /etc/iptables/rules.v4, CentOS/RHEL için /etc/sysconfig/iptables dosyasına kaydedin.

Umarım bu rehber, sunucu güvenliğinizi bir adım öteye taşımanıza yardımcı olur. Bu kurallar, bir güvenlik duvarının (firewall) yerini tutmaz ama onu çok güçlü bir şekilde tamamlar. Siz bu modülleri kendi sunucularınızda nasıl kullanıyorsunuz? Özel kurulumlarınız veya farklı kullanım senaryolarınız varsa aşağıya yazın, tartışalım. Sorularınız için çekinmeyin, aşağıya yazabilirsiniz.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri