ipset ile Linux Firewall: Binlerce IP'yi Tek Kural ile Engelleme
ipset Nedir ve Neden Kullanmalısınız?
Linux tabanlı sunucularda güvenlik duvarı yönetimi, sistem yöneticilerinin en kritik görevlerinden birini oluşturmaktadır. Özellikle SSH, web sunucuları ve posta servisleri gibi sürekli dış dünyaya açık hizmetler, binlerce farklı IP adresinden gelen bağlantı talepleriyle karşı karşıya kalır. Bu bağlantıların bir kısmı meşru kullanıcılardan gelirken, önemli bir bölümü otomatik saldırı araçları, brute force denemeleri ve kötü niyetli tarama aktivitelerinden oluşmaktadır.
Geleneksel iptables kuralları, her IP adresi için ayrı bir kural oluşturarak bu tür tehditleri engellemeye çalışır. Ancak binlerce hatta on binlerce IP adresini engellemeniz gerektiğinde, iptables kurallarının performansı ciddi şekilde düşer ve sistem kaynakları aşırı tüketilir. İşte tam bu noktada ipset devreye girer. ipset, Linux çekirdeğinde hash tabanlı veri yapıları kullanarak binlerce IP adresini tek bir kural ile yönetmenizi sağlayan güçlü bir araçtır.
ipset'in Temel Çalışma Prensibi
ipset, Netfilter projesinin bir parçası olarak geliştirilmiş ve iptables ile entegre çalışan bir uygulamadır. Temel olarak, IP adreslerini, ağları, port numaralarını ve hatta IP-port çiftlerini hash tablolarında saklar. Bu sayede bir IP adresinin listede olup olmadığını kontrol etmek O(1) karmaşıklığında gerçekleşir, yani liste ne kadar büyük olursa olsun arama süresi sabit kalır.
Geleneksel iptables yaklaşımında, engellemek istediğiniz her IP için ayrı bir kural oluşturmanız gerekir. 10.000 IP adresini engellemek istediğinizde, iptables 10.000 ayrı kural işler ve her paket geldiğinde bu kuralların tamamını sırayla tarar. ipset kullanıldığında ise tek bir kural ile 10.000 IP adresini içeren bir hash tablosuna referans verilir ve paketler çok daha hızlı bir şekilde işlenir.
Kurulum ve Temel Yapılandırma
ipset'i kullanabilmek için öncelikle sisteminize kurmanız gerekmektedir. Çoğu Linux dağıtımında ipset paketi varsayılan olarak yüklü değildir veya çekirdek modülü etkinleştirilmemiş olabilir. Kurulum süreci dağıtımınıza göre farklılık gösterecektir.
Debian ve Ubuntu Üzerinde Kurulum
Debian tabanlı sistemlerde ipset kurulumu son derece basittir. Terminalden aşağıdaki komutu çalıştırarak kurulumu tamamlayabilirsiniz:
sudo apt update
sudo apt install ipset
Bu komut, ipset aracını ve gerekli çekirdek modüllerini sisteminize ekleyecektir. Kurulum tamamlandıktan sonra ipset komutunu kullanmaya başlayabilirsiniz.
CentOS ve RHEL Üzerinde Kurulum
Red Hat tabanlı dağıtımlarda ise paket yöneticisini kullanarak kurulum yapmanız gerekmektedir:
sudo yum install ipset
sudo systemctl enable ipset
sudo systemctl start ipset
Kurulum sonrasında çekirdek modüllerinin otomatik yüklenmesi için systemd servisi etkinleştirilmelidir.
ipset Set Türleri
ipset, farklı kullanım senaryolarına uygun çeşitli set türlerini destekler. Doğru set türünü seçmek, hem performans hem de işlevsellik açısından kritik öneme sahiptir.
hash:ip - Tek IP Adresleri İçin
En temel set türü olan hash:ip, tekil IP adreslerini saklamak için kullanılır. Özellikle bilinen saldırgan IP'leri veya kara listedeki adresleri engellemek istediğinizde bu türü tercih etmelisiniz:
ipset create blocked_ips hash:ip
Bu komut, blocked_ips adında boş bir set oluşturur. Set oluştururken ek parametreler belirleyebilirsiniz. Örneğin, sayaçları etkinleştirmek ve paket sayısını takip etmek için:
ipset create blocked_ips hash:ip counters
hash:net - Ağ Blokları İçin
CIDR notasyonu ile belirtilen ağ bloklarını saklamak için hash:net türünü kullanmalısınız. Ülke engelleme veya büyük IP aralıklarını yönetmek istediğinizde bu tür idealdir:
ipset create blocked_nets hash:net
hash:net kullanırken dikkat edilmesi gereken önemli bir nokta vardır: 192.168.1.0/24 gibi bir ağ bloğu eklediğinizde, ipset bu ağdaki tüm bireysel IP adreslerini ayrı ayrı hash tablosuna ekler. Bu durum, büyük ağ blokları için çok sayıda girdi oluşturabilir.
hash:ip,port - IP ve Port Eşleşmeleri İçin
Bazı güvenlik senaryolarında, sadece IP adresi değil IP-port kombinasyonuna göre engelleme yapmanız gerekebilir. Örneğin, belirli bir IP'den gelen SSH bağlantılarını engellerken aynı IP'den web trafiğine izin vermek isteyebilirsiniz:
ipset create blocked_ssh hash:ip,port
IP Engelleme ve İzin Verme Kuralları Oluşturma
ipset ile oluşturduğunuz setleri iptables kurallarıyla entegre ederek ağ trafiğinizi kontrol edebilirsiniz. Bu bölümde, yaygın kullanım senaryolarını adım adım inceleyeceğiz.
Engelleme Listesi Oluşturma
Yeni bir engelleme listesi oluşturmak için önce seti yaratmanız, ardından engellemek istediğiniz IP adreslerini eklemeniz gerekir:
ipset create blocklist hash:ip
ipset add blocklist 1.2.3.4
ipset add blocklist 5.6.7.8
ipset add blocklist 10.0.0.0/8
Bu örnekte, blocklist adında bir set oluşturulmuş ve üç farklı IP bloğu eklenmiştir. İlk ikisi tekil IP adresleri, üçüncüsü ise bir CIDR bloğudur.
iptables Entegrasyonu
Oluşturduğunuz ipset setini iptables kurallarında kullanmak için -m set modülünü kullanmanız gerekir. Aşağıdaki örnek, blocklist setindeki tüm IP'lerden gelen trafiği engeller:
iptables -I INPUT -m set --match-set blocklist src -j DROP
iptables -I FORWARD -m set --match-set blocklist src -j DROP
Bu kurallar, gelen (INPUT) ve yönlendirilen (FORWARD) paketlerde, kaynak IP adresi blocklist setinde bulunanları düşürür. -I parametresi kuralı zincirin başına ekler, böylece diğer kurallardan önce işlenir.
Birden Fazla Set Kullanma
Gerçek bir üretim ortamında, genellikle birden fazla ipset seti kullanmanız gerekir. Örneğin, SSH brute force saldırıları için ayrı bir liste, web sunucusu saldırıları için ayrı bir liste tutabilirsiniz:
ipset create ssh_blocklist hash:ip
ipset create web_blocklist hash:ip
ipset add ssh_blocklist 203.0.113.50
ipset add web_blocklist 198.51.100.25
iptables kurallarında bu setleri ayrı ayrı kullanabilirsiniz:
iptables -A INPUT -p tcp --dport 22 -m set --match-set ssh_blocklist src -j DROP
iptables -A INPUT -p tcp --dport 80 -m set --match-set web_blocklist src -j DROP
Bu yapılandırma, SSH portuna (22) gelen saldırıları ve HTTP portuna (80) gelen saldırıları farklı listeler üzerinden engellemenizi sağlar.
Dinamik Engelleme Listeleri ve Otomatik Güncelleme
Statik engelleme listeleri oluşturmak işe yarar, ancak internet güvenliği dinamik bir ortamdır. Yeni saldırgan IP'leri sürekli olarak takip etmek ve engelleme listenize eklemek kritik önem taşır. Bu bölümde, dinamik engelleme listeleri oluşturma ve otomatik güncelleme stratejilerini inceleyeceğiz.
Harici Blocklist Servisleri
Internet üzerinde ücretsiz ve ücretli olarak sunulan birçok blocklist servisi bulunmaktadır. Bu servisler, bilinen saldırgan IP'leri, spam gönderen sunucuları ve kötü niyetli ağları düzenli olarak güncellenmiş listeler halinde sunar. Popüler blocklist kaynakları arasında AbuseIPDB, Spamhaus, Country IP Blocks ve çeşitli güvenlik blogları yer alır.
Örneğin, abuseipdb.com'dan IP listesi çekmek için basit bir bash betiği oluşturabilirsiniz:
#!/bin/bash
IPSET_NAME="abuseipdb"
BLOCKLIST_URL="https://api.abuseipdb.com/api/v2/blacklist"
API_KEY="YOUR_API_KEY"
wget -q -O - --header="Key: $API_KEY" --header="Accept: application/json" "$BLOCKLIST_URL" | \
jq -r '.data[].ipAddress' | while read ip; do
ipset add -exist $IPSET_NAME $ip
done
Bu betik, AbuseIPDB API'sinden kara liste IP'lerini çeker ve ipset setinize ekler. -exist flag'i, aynı IP zaten listede varsa hata vermeden geçişi sağlar.
Ülke Bazlı Engelleme
Bazı durumlarda belirli ülkelerden gelen trafiği tamamen engellemek isteyebilirsiniz. Bu, özellikle hedef kitleniz belirli bir bölgeyle sınırlıysa veya belirli ülkelerden ciddi güvenlik tehditleri alıyorsanız kullanışlıdır. Ülke IP bloklarını içeren ipset listeleri, çeşitli kaynaklardan indirilebilir:
# cn (Çin) IP blokları için örnek
ipset create china_blocklist hash:net
for net in $(curl -s https://www.ipdeny.com/ipblocks/data/countries/cn.zone); do
ipset add china_blocklist $net
done
Ülke bazlı engelleme konusunda dikkatli olmalısınız. Büyük ülkelerin IP blokları çok geniş olabilir ve bu durum hem bellek kullanımını artırır hem de false positive oranını yükseltir.
Kalıcılık ve Sistem Açılışında Otomatik Yükleme
ipset ile oluşturduğunuz setler çekirdek belleğinde saklanır. Bu nedenle sistem yeniden başlatıldığında tüm ipset verileri kaybolur. Kalıcı bir güvenlik yapılandırması için, setlerinizi diskte saklamalı ve sistem açılışında otomatik olarak yüklemelisinir.
ipset Kurallarını Kaydetme
Mevcut tüm ipset setlerini ve içeriklerini bir dosyaya kaydetmek için ipset save komutunu kullanın:
sudo ipset save > /etc/ipset.conf
Bu komut, sistemdeki tüm ipset setlerini ve bunların içeriklerini /etc/ipset.conf dosyasına yazar. Dosya içeriğini incelediğinizde, her set için oluşturma komutu ve içindeki tüm IP adreslerini görebilirsiniz.
Systemd Servisi ile Otomatik Yükleme
Çoğu modern Linux dağıtımı, ipset.service systemd birimini kullanarak ipset kurallarını sistem açılışında otomatik olarak yükler. Öncelikle servisi etkinleştirmeniz gerekir:
sudo systemctl enable ipset
sudo systemctl start ipset
Servis, /etc/ipset.conf dosyasını okuyarak setleri otomatik olarak oluşturur. Ancak bazı dağıtımlarda systemd servis yapılandırması varsayılan olarak gelmeyebilir. Bu durumda elle bir servis dosyası oluşturmanız gerekebilir.
iptables Kuralları ile Birlikte Kalıcılık
ipset kurallarınızı iptables kurallarınızla koordineli şekilde yönetmeniz önemlidir. Her ikisini de sistem açılışında yüklemek için, iptables-persistent paketini kullanabilirsiniz:
sudo apt install iptables-persistent
Bu paket, iptables kurallarını /etc/iptables/rules.v4 (IPv4) ve /etc/iptables/rules.v6 (IPv6) dosyalarına kaydeder. ipset.conf dosyası ile birlikte, her iki yapılandırma da sistem açılışında otomatik olarak yüklenir.
Performans Optimizasyonu ve En İyi Uygulamalar
ipset'in sunduğu performans avantajlarından tam olarak yararlanmak için bazı optimizasyon tekniklerini ve en iyi uygulamaları bilmeniz önemlidir.
Hashsize ve Maxelem Ayarları
ipset oluştururken hashsize ve maxelem parametrelerini ayarlayarak performansı optimize edebilirsiniz. hashsize, hash tablosunun başlangıç boyutunu belirlerken, maxelem tabloya eklenebilecek maksimum girdi sayısını sınırlar:
ipset create blocklist hash:ip hashsize 8192 maxelem 100000
hashsize değeri, setteki beklenen girdi sayısına göre ayarlanmalıdır. Daha büyük bir hashsize, daha az hash çakışması anlamına gelir ve arama performansını artırır.
Büyük Listeler İçin Toplu İşlemler
Binlerce IP adresini tek tek eklemek yerine, toplu işlemler kullanarak performansı artırabilirsiniz. Bunun için ipset restore komutunu kullanabilirsiniz:
# ipset_restore.txt dosyası içeriği:
create blocklist hash:ip
add blocklist 1.2.3.4
add blocklist 5.6.7.8
add blocklist 10.0.0.0/8
# ... binlerce satır
ipset restore /tmp/ipset_restore.txt
Bu yöntem, her IP için ayrı komut çalıştırmaktan çok daha hızlıdır ve büyük blocklist güncellemelerinde önemli zaman kazanmanızı sağlar.
Sayaç ve Zaman Damgası Kullanımı
ipset setlerinize sayaç ekleyerek, hangi IP'lerin en çok trafiğe neden olduğunu takip edebilirsiniz:
ipset create blocklist hash:ip counters
ipset -L blocklist
Çıktıda her IP için paket ve byte sayacını görebilirsiniz. Bu bilgiler, engelleme stratejilerinizi optimize etmek ve false positive oranınızı azaltmak için değerlidir.
Fail2ban ile Entegrasyon
Fail2ban, SSH, Apache, Nginx gibi servislerde başarısız oturum açma denemelerini tespit eden ve otomatik olarak engelleme kuralı oluşturan bir araçtır. Fail2ban'ı ipset ile entegre ederek, dinamik engelleme listeleri oluşturabilirsiniz.
Fail2ban Yapılandırması
Fail2ban'ı ipset backend'i ile kullanmak için, jail.local dosyasında aşağıdaki yapılandırmayı eklemelisiniz:
[DEFAULT]
banaction = iptables-ipset-proto4
[sshd]
enabled = true
banaction = iptables-ipset-proto4
Bu yapılandırma, fail2ban'ın iptables yerine ipset kullanarak engelleme yapmasını sağlar. Böylece binlerce başarısız deneme yapan IP adresi, tek bir ipset setinde toplanır ve iptables tek bir kural ile kontrol eder.
Otomatik Temizleme
Fail2ban ile oluşturulan engellemelerin belirli bir süre sonra otomatik olarak kaldırılmasını isteyebilirsiniz. Bunun için findtime ve bantime parametrelerini ayarlayabilirsiniz:
[sshd]
enabled = true
bantime = 3600
findtime = 600
maxretry = 3
Bu yapılandırma, 10 dakika içinde 3 başarısız deneme yapan IP'yi 1 saat boyunca engeller. Bantime sona erdiğinde, ipset otomatik olarak o IP'yi listeden kaldırır.
Güvenlik ve Dikkat Edilmesi Gereken Noktalar
ipset kullanımı güvenlik açısından birçok avantaj sunsa da, dikkat edilmesi gereken bazı önemli noktalar bulunmaktadır.
False Positive Riskleri
Büyük blocklist servislerini kullanırken, yanlış pozitif (false positive) riski her zaman mevcuttur. Bir IP adresi yanlışlıkla kara listeye eklenmiş olabilir ve bu durumda meşru kullanıcılar engellenmiş olur. Bu riski azaltmak için, yüksek güvenilirliğe sahip blocklist servislerini tercih etmeli ve mümkün olduğunca spesifik kurallar oluşturmalısınız.
Düzenli Gözden Geçirme
Engelleme listelerinizi düzenli olarak gözden geçirmeli ve gereksiz girdileri temizlemelisiniz. Zamanla, eski ve artık tehdit oluşturmayan IP'ler listenizde şişkinlik yapabilir:
# Sıfır sayaçlı girdileri bulma
ipset -L blocklist | grep "Packet count: 0"
Bu komut, hiç paket yakalamamış IP'leri listeler. Bu IP'lerin bir kısmı artık aktif tehdit oluşturmuyor olabilir ve güvenlik politikalarınıza göre kaldırılabilir.
Yedekleme Stratejisi
ipset yapılandırmanızı düzenli olarak yedeklemelisiniz. /etc/ipset.conf dosyasını ve iptables kurallarınızı içeren yedekler oluşturarak, olası bir felaket durumunda hızlıca kurtarma yapabilirsiniz:
# Cron ile düzenli yedekleme
0 3 * * * /usr/sbin/ipset save > /backup/ipset_$(date +\%Y\%m\%d).conf
Bu cron job, her gün saat 03:00'te ipset yapılandırmanızı yedekler.
Sonuç
ipset, Linux güvenlik duvarı yönetiminde devrim niteliğinde bir araçtır. Binlerce hatta on binlerce IP adresini tek bir kural ile yönetmenizi sağlayarak, hem performans hem de yönetilebilirlik açısından önemli avantajlar sunar. Geleneksel iptables kurallarının aksine, O(1) arama karmaşıklığı ile her boyutdaki listelerde sabit performans sağlar.
Doğru yapılandırıldığında, ipset SSH brute force saldırılarından, DDoS denemelerine, spam trafiğinden kötü niyetli tarama aktivitelerine kadar geniş bir yelpazede koruma sağlar. Fail2ban gibi araçlarla entegre çalışarak dinamik engelleme listeleri oluşturabilir ve tehditleri otomatik olarak engelleyebilirsiniz.
Güvenlik, sürekli bir süreçtir. ipset yapılandırmanızı düzenli olarak gözden geçirmeli, engelleme listelerinizi güncel tutmalı ve oluşan hatalı pozitifleri zamanında düzeltmelisiniz. Bu makalede anlatılan teknikler ve en iyi uygulamalar, Linux sunucularınızı güçlü ve etkili bir şekilde korumanıza yardımcı olacaktır.
nftables ile Kullanım
Linux çekirdeğinin daha yeni güvenlik duvarı altyapısı olan nftables, ipset ile native olarak çalışabilmektedir. nftables'ın kendi set yapısı olsa da, mevcut ipset listelerinizi nftables kurallarında kullanmaya devam edebilirsiniz. Bu özellik, iptables'tan nftables'a geçiş sürecinde büyük kolaylık sağlar.
nftables Kurallarında ipset Kullanma
nftables ile ipset setlerini kullanmak için, set modülünü etkinleştirmeniz ve kural tanımlamanız yeterlidir:
nft add rule ip filter input ip saddr @blocklist drop
Bu kural, blocklist adındaki ipset setindeki tüm kaynak IP'lerden gelen paketleri düşürür. nftables, ipset verilerine doğrudan erişebildiği için ek bir modül yüklemeye gerek yoktur.
iptables'tan nftables'a Dönüştürme
Mevcut iptables kurallarınızı nftables formatına dönüştürmek için ipset-translate aracını kullanabilirsiniz:
iptables-save | ipset-translate
Bu komut, iptables kurallarını ve ipset referanslarını otomatik olarak nftables kurallarına dönüştürür. Dönüştürme işlemi sonrasında, nftables kurallarınız eski ipset setlerinizle uyumlu çalışmaya devam eder.
IPv6 Desteği
ipset, IPv6 adreslerini de desteklemektedir. Günümüzde birçok saldırı hem IPv4 hem de IPv6 üzerinden gerçekleştirildiği için, her iki protokol için de engelleme listeleri oluşturmanız önerilir.
IPv6 ipset Oluşturma
IPv6 için ipset oluştururken, set türüne 'inet6' parametresini eklemeniz gerekir:
ipset create blocked_ipv6 hash:ip family inet6
ipset add blocked_ipv6 2001:db8::1
ipset add blocked_ipv6 2001:db8::/32
Bu örnekte, inet6 ailesi belirtilerek IPv6 adreslerinin hash tablosunda saklanması sağlanır. Aynı şekilde iptables veya nftables kurallarında bu seti kullanabilirsiniz.
Çift Yığın (Dual Stack) Yapılandırma
Hem IPv4 hem de IPv6 trafiğini tek bir ipset yapılandırması ile yönetmek isterseniz, iki ayrı set oluşturmanız ve her protokol için ayrı iptables kuralı eklemeniz gerekir:
# IPv4 blocklist
iptables -A INPUT -m set --match-set blocklist_v4 src -j DROP
# IPv6 blocklist
ip6tables -A INPUT -m set --match-set blocklist_v6 src -j DROP
Bu yapılandırma, sunucunuza gelen her iki protokoldeki tehlikeli trafiği de engeller.
Gerçek Dünya Kullanım Senaryoları
ipset'in gerçek dünya uygulamalarında nasıl kullanıldığını anlamak için, yaygın kullanım senaryolarını detaylı olarak inceleyelim.
SSH Brute Force Koruması
SSH sunucuları, internet üzerinden en sık hedef alınan servislerden biridir. Otomatik saldırı araçları, binlerce farklı kullanıcı adı ve şifre kombinasyonunu deneyerek sisteme girişmeye çalışır. ipset ile bu saldırıları etkili bir şekilde engelleyebilirsiniz.
İlk olarak, SSH için ayrı bir ipset seti oluşturun:
ipset create ssh_blocklist hash:ip timeout 3600
timeout parametresi, eklenen IP'lerin otomatik olarak silinme süresini belirler. Bu örnekte, engellenen IP 1 saat (3600 saniye) sonra otomatik olarak serbest bırakılır.
Ardından, iptables kuralını ekleyin:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m set --match-set ssh_blocklist src -j DROP
Fail2ban ile entegre etmek için, daha önce belirtilen yapılandırmayı kullanabilirsiniz. Fail2ban, başarısız giriş denemelerini tespit ettiğinde otomatik olarak IP'yi ssh_blocklist setine ekler.
Web Sunucusu Koruması
Nginx veya Apache web sunucuları, çeşitli saldırı türlerine maruz kalır. SQL injection, XSS, DDoS ve web tarama saldırıları yaygın tehditler arasındadır. ipset ile web sunucunuzu bu tehditlere karşı koruyabilirsiniz.
Örneğin, belirli bir IP'den aşırı istek geldiğinde engelleme yapmak için iptables rate limiting ile ipset'i birleştirebilirsiniz:
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-above 50/sec --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name web_limit -j SET --add-set web_blocklist src
iptables -A INPUT -p tcp --dport 80 -m set --match-set web_blocklist src -j DROP
Bu kurallar, saniyede 50'den fazla istek gönderen IP'leri web_blocklist ipset setine ekler ve ardından bu IP'lerden gelen tüm trafiği engeller.
E-posta Sunucusu Koruması
Posta sunucuları, spam ve kötü niyetli posta trafiğiyle doludur. ipset ile kara liste IP'lerini engelleyerek, sunucunuzun yükünü önemli ölçüde azaltabilirsiniz.
ipset create mail_blocklist hash:ip
iptables -A INPUT -p tcp -m multiport --dports 25,465,587,143,993 -m set --match-set mail_blocklist src -j DROP
Bu yapılandırma, posta sunucunuzun tüm portlarını (SMTP, IMAP, POP3) ipset blocklist koruması altına alır.