Sunucunuzu internete açtığınız anda saat başı yüzlerce brute force denemesiyle karşılaşırsınız. Bu bir abartı değil, gerçek. Herhangi bir VPS’e SSH portunu açık bırakın, birkaç saat sonra auth.log dosyanızı inceleyin: onlarca farklı IP’den binlerce başarısız giriş denemesi göreceksiniz. UFW’nin rate limiting özelliği bu saldırıları engellemek için son derece pratik ve etkili bir yöntem sunuyor. Bu yazıda UFW ile rate limiting’i nasıl kuracağınızı, nasıl özelleştireceğinizi ve gerçek dünya senaryolarında nasıl kullanacağınızı detaylıca ele alacağız.
Rate Limiting Nedir ve Neden Gerekli?
Rate limiting, belirli bir zaman diliminde bir IP adresinden gelen bağlantı sayısını sınırlayan bir mekanizmadır. UFW’nin yerleşik rate limiting özelliği, 30 saniye içinde 6 veya daha fazla bağlantı denemesi yapan IP adreslerini otomatik olarak engeller. Bu kural, özellikle brute force saldırılarına karşı ilk savunma hattınız olabilir.
Fail2ban gibi araçlar daha gelişmiş ve özelleştirilebilir çözümler sunarken, UFW’nin rate limiting özelliği kurulumu ve yönetimi son derece basit tutar. Küçük ve orta ölçekli sunucular için çoğu zaman bu yeterli gelir. Ayrıca iptables seviyesinde çalıştığı için kernel’ın netfilter katmanında işlediğinden performans açısından oldukça verimlidir.
UFW Kurulumu ve Temel Kontroller
Başlamadan önce UFW’nin sisteminizde kurulu ve aktif olduğundan emin olalım.
# UFW kurulumu (Ubuntu/Debian)
sudo apt update && sudo apt install ufw -y
# UFW durumunu kontrol et
sudo ufw status verbose
# UFW'yi etkinleştir (dikkatli ol, mevcut bağlantıları etkileyebilir)
sudo ufw enable
UFW’yi etkinleştirmeden önce SSH portuna izin vermeyi unutmayın, aksi takdirde kendinizi sunucudan kitleyebilirsiniz.
# Önce SSH'a izin ver, sonra UFW'yi aç
sudo ufw allow ssh
sudo ufw enable
Bu adımı atlamak, uzak sunucularda en sık yapılan hatalardan biridir. KVM konsolunuz yoksa bu hata sizi ciddi anlamda zor durumda bırakır.
UFW ile Temel Rate Limiting
UFW’nin rate limiting özelliği limit komutuyla uygulanır. SSH için basit bir kural şu şekilde eklenir:
# SSH için rate limiting uygula
sudo ufw limit ssh
# Veya port numarasıyla
sudo ufw limit 22/tcp
# Özel bir port kullananlar için (örneğin 2222)
sudo ufw limit 2222/tcp
Bu kadar basit. Şimdi UFW durumunu kontrol ettiğinizde yeni kuralı görebilirsiniz:
sudo ufw status numbered
Çıktı şuna benzer bir şey gösterecek:
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp LIMIT IN Anywhere
[ 2] 22/tcp (v6) LIMIT IN Anywhere (v6)
LIMIT kuralı arka planda iptables’a iki kural ekler: birincisi bağlantı hızını takip eden recent modülünü kullanır, ikincisi bu limiti aşan IP’leri engeller.
Arka Planda Neler Oluyor?
UFW’nin LIMIT kuralının iptables seviyesinde nasıl göründüğünü anlamak, sorun giderme süreçlerinde size yardımcı olur.
# UFW'nin oluşturduğu iptables kurallarını gör
sudo iptables -L ufw-user-limit -n -v
sudo iptables -L ufw-user-limit-accept -n -v
UFW, arka planda şuna benzer kurallar oluşturur:
# UFW'nin arka planda yaptığı işlemlerin manuel karşılığı
# (bunları elle çalıştırmanıza gerek yok, sadece anlayış için)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --set --name DEFAULT --rsource
iptables -A INPUT -p tcp --dport 22 -m state --state NEW
-m recent --update --seconds 30 --hitcount 6
--name DEFAULT --rsource -j REJECT --reject-with tcp-reset
Bu kurallar şunu söylüyor: “Son 30 saniye içinde aynı IP’den 6 veya daha fazla yeni bağlantı gelirse, bu IP’den gelen bağlantıları reddet.”
Gerçek Dünya Senaryosu 1: SSH Brute Force Koruması
Diyelim ki bir web sunucunuz var ve SSH’a internetten erişmeniz gerekiyor. İdeal olan SSH’ı sadece belirli IP’lerden kabul etmek ama her zaman statik IP’niz olmayabilir. Rate limiting bu durumda makul bir orta yol sunar.
# Mevcut SSH kuralını kaldır
sudo ufw delete allow ssh
# Rate limiting ile SSH kuralı ekle
sudo ufw limit ssh comment 'SSH brute force koruması'
# HTTP ve HTTPS için normal allow kuralları
sudo ufw allow http
sudo ufw allow https
# Kuralları kontrol et
sudo ufw status verbose
Bu yapılandırmayla, birisi SSH’a brute force dener denemez 30 saniye içinde 6 başarısız girişimden sonra otomatik olarak bloke edilecek.
Logları izlemek için:
# UFW loglarını gerçek zamanlı izle
sudo tail -f /var/log/ufw.log
# Engellenen IP'leri filtrele
sudo grep "LIMIT BLOCK" /var/log/ufw.log | awk '{print $12}' | sort | uniq -c | sort -rn
Gerçek Dünya Senaryosu 2: Web Uygulama Login Sayfası Koruması
Rate limiting sadece SSH için değil, web uygulamalarının login sayfaları için de kullanılabilir. Ancak burada dikkatli olmanız gerekiyor çünkü HTTP/HTTPS portlarına rate limiting uygulamak meşru kullanıcıları da etkileyebilir.
Daha akıllıca bir yaklaşım, uygulama katmanında (Nginx/Apache) rate limiting yapmak ve UFW’yi ağ katmanında tutmaktır. Ancak tek bir sunucuda basit bir uygulama çalıştırıyorsanız ve kaynak kısıtlaması yapmak istiyorsanız:
# Özel bir uygulama portu için rate limiting (örneğin Node.js uygulaması)
sudo ufw limit 3000/tcp comment 'Node.js app rate limiting'
# FTP brute force koruması
sudo ufw limit 21/tcp comment 'FTP brute force koruması'
# RDP (uzak masaüstü) koruması
sudo ufw limit 3389/tcp comment 'RDP brute force koruması'
UFW Uygulama Profilleri ile Çalışmak
UFW’nin uygulama profili sistemi, port numaralarını ezberlemenize gerek kalmadan kural eklemenizi sağlar.
# Mevcut uygulama profillerini listele
sudo ufw app list
# Belirli bir profil hakkında bilgi al
sudo ufw app info OpenSSH
# Uygulama profiliyle rate limiting
sudo ufw limit OpenSSH
Kendi özel uygulama profilinizi de oluşturabilirsiniz:
# Özel profil dosyası oluştur
sudo nano /etc/ufw/applications.d/myapp
Dosya içeriği:
[MyWebApp]
title=My Custom Web Application
description=Custom web application on port 8080
ports=8080/tcp
# Profili yükle ve rate limiting uygula
sudo ufw app update MyWebApp
sudo ufw limit MyWebApp
IPv6 Desteği ve Yapılandırması
UFW varsayılan olarak hem IPv4 hem IPv6 kurallarını otomatik oluşturur. Ancak bunun doğru çalışması için /etc/default/ufw dosyasını kontrol edin.
# UFW genel ayarlarını kontrol et
cat /etc/default/ufw | grep IPV6
IPv6 etkinleştirilmişse (IPV6=yes), ufw limit ssh komutunu çalıştırdığınızda hem IPv4 hem de IPv6 için ayrı kurallar otomatik oluşturulur. Status çıktısında her ikisini de göreceksiniz.
Eğer sadece IPv4 üzerinden rate limiting yapmak istiyorsanız:
# Sadece IPv4 için rate limiting
sudo ufw limit in on eth0 to any port 22 proto tcp
Gelişmiş Yapılandırma: /etc/ufw/before.rules
UFW’nin yerleşik rate limiting mekanizması 30 saniye / 6 deneme sabit değerleriyle çalışır. Bu değerleri özelleştirmek istiyorsanız before.rules dosyasını düzenlemeniz gerekir.
# Before rules dosyasını yedekle
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.backup
# Dosyayı düzenle
sudo nano /etc/ufw/before.rules
Dosyanın başına, *filter satırından önce şunları ekleyin:
# Özelleştirilmiş rate limiting kuralları
# 60 saniyede 3 denemeden fazlasını engelle
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# SSH için özel rate limiting: 60 saniyede max 3 deneme
-A ufw-before-input -p tcp --dport 22 -m state --state NEW
-m recent --set --name SSH_RATELIMIT --rsource
-A ufw-before-input -p tcp --dport 22 -m state --state NEW
-m recent --update --seconds 60 --hitcount 4
--name SSH_RATELIMIT --rsource -j DROP
Değişiklikleri uygulamak için:
sudo ufw reload
Bu yöntem daha agresif bir rate limiting sağlar. Özellikle sık saldırı hedefi olan sunucularda 30 saniye / 6 deneme yerine daha kısıtlayıcı değerler kullanmak mantıklıdır.
Whitelist: Güvenilir IP’leri Kural Dışı Tutmak
Rate limiting bazen meşru kullanıcıları da etkileyebilir, özellikle script ile otomatik bağlantı yapan sistemlerde. Güvenilir IP’leri whitelist’e alarak bu sorunu çözebilirsiniz.
# Belirli bir IP'ye her zaman izin ver (rate limiting'i bypass eder)
sudo ufw allow from 192.168.1.100 to any port 22
# Bir subnet için izin ver
sudo ufw allow from 10.0.0.0/24 to any port 22
# Kural sırasını kontrol et (allow kuralları limit kurallarından önce gelmeli)
sudo ufw status numbered
UFW kuralları sırayla işlenir. Eğer allow kuralı limit kuralından önce geliyorsa, whitelist’teki IP’ler rate limiting’den muaf tutulur. Sırayı kontrol etmek kritik önem taşır.
# Kural sırasını değiştir (örneğin 3. kuralı 1. pozisyona taşı)
sudo ufw delete 3
sudo ufw insert 1 allow from 192.168.1.100 to any port 22
Log Analizi ve Monitoring
Rate limiting’in gerçekten çalışıp çalışmadığını, kaç IP’nin bloke edildiğini görmek için log analizi şarttır.
# UFW loglama seviyesini ayarla
sudo ufw logging medium
# Log dosyasını izle
sudo tail -f /var/log/ufw.log
# Son 100 bloke edilen bağlantıyı göster
sudo grep "BLOCK" /var/log/ufw.log | tail -100
# En çok engellenen IP'leri listele
sudo grep "LIMIT BLOCK" /var/log/ufw.log |
grep -oP 'SRC=K[d.]+' |
sort | uniq -c | sort -rn | head -20
Daha kapsamlı bir analiz için basit bir script yazabilirsiniz:
#!/bin/bash
# ufw-rate-limit-report.sh
# UFW rate limiting raporu oluşturur
echo "=== UFW Rate Limiting Raporu ==="
echo "Tarih: $(date)"
echo ""
echo "--- Bugün Engellenen IP'ler ---"
today=$(date +"%b %e")
grep "LIMIT BLOCK" /var/log/ufw.log |
grep "$today" |
grep -oP 'SRC=K[d.]+' |
sort | uniq -c | sort -rn | head -10
echo ""
echo "--- Toplam Engelleme Sayısı ---"
grep -c "LIMIT BLOCK" /var/log/ufw.log
echo ""
echo "--- Hedef Port Dağılımı ---"
grep "LIMIT BLOCK" /var/log/ufw.log |
grep -oP 'DPT=K[d]+' |
sort | uniq -c | sort -rn
# Script'i çalıştırılabilir yap ve test et
chmod +x ufw-rate-limit-report.sh
sudo ./ufw-rate-limit-report.sh
UFW Rate Limiting’in Sınırlamaları
UFW’nin rate limiting özelliği güçlü ama bazı sınırlamaları var. Bunları bilmek, doğru araç seçimi yapmanıza yardımcı olur.
- Sabit eşik değerleri: Varsayılan 30 saniye / 6 deneme kuralı
ufw limitkomutuyla değiştirilemez. Özelleştirme için before.rules editlemek gerekir. - IP bazlı çalışır: Distributed brute force saldırılarında (her IP’den tek deneme) etkisizdir.
- Kalıcı ban yok: UFW rate limiting geçici bir blok uygular, IP’yi kalıcı olarak kara listeye almaz. Bu için Fail2ban veya manuel iptables kuralı gerekir.
- Uygulama katmanı körü: HTTP 200 dönen ama başarısız login olan istekleri ayırt edemez.
- Log rotasyonu: UFW logları büyüdükçe analiz zorlaşır, log rotasyonu ayarlanmalıdır.
Bu sınırlamalar göz önüne alındığında, UFW rate limiting’i Fail2ban ile birlikte kullanmak en iyi yaklaşımdır. UFW ağ katmanında hızlı filtreler uygularken, Fail2ban uygulama loglarını analiz ederek daha akıllı kararlar alır.
UFW ve Fail2ban Entegrasyonu
# Fail2ban kurulumu
sudo apt install fail2ban -y
# SSH jail yapılandırması
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
banaction = ufw
# Fail2ban'ın UFW'yi kullanmasını sağla
sudo nano /etc/fail2ban/action.d/ufw.conf
Bu entegrasyonla Fail2ban, brute force tespitini yaptıktan sonra engelleme işlemini UFW üzerinden gerçekleştirir. İki katmanlı bir koruma sağlanmış olur.
Kuralları Test Etme
Rate limiting kurallarınızın doğru çalıştığını test etmek için:
# Test sunucusundan (veya yerel ağdan) hızlı SSH deneme
# DİKKAT: Bunu sadece test ortamında ve kendi sunucunuzda yapın
for i in {1..10}; do
ssh -o ConnectTimeout=2 -o BatchMode=yes testuser@sunucu_ip 2>/dev/null
echo "Deneme $i tamamlandı"
sleep 1
done
6-7. denemeden itibaren bağlantıların reddedildiğini göreceksiniz. Log dosyasında LIMIT BLOCK girdilerini kontrol edebilirsiniz.
# Test sonrası logları kontrol et
sudo grep "LIMIT" /var/log/ufw.log | tail -20
Yapılandırmayı Kaydetme ve Yedekleme
UFW kurallarınızı yedeklemek iyi bir alışkanlıktır. Özellikle before.rules gibi dosyaları düzenlediyseniz:
# Tüm UFW yapılandırmasını yedekle
sudo cp -r /etc/ufw /etc/ufw.backup.$(date +%Y%m%d)
# Mevcut kuralları dışa aktar
sudo iptables-save > /root/iptables-backup-$(date +%Y%m%d).txt
# UFW kurallarını listele ve kaydet
sudo ufw status verbose > /root/ufw-rules-$(date +%Y%m%d).txt
Sistem yeniden başlatıldığında UFW’nin otomatik başlamasını sağlayın:
sudo systemctl enable ufw
sudo systemctl status ufw
Sonuç
UFW’nin rate limiting özelliği, karmaşık güvenlik araçlarını öğrenmeye vakit ayıramayan sistem yöneticileri için mükemmel bir başlangıç noktası. Tek bir komutla (ufw limit ssh) SSH brute force saldırılarına karşı etkili bir koruma katmanı ekliyorsunuz. Arka planda kernel’ın netfilter sistemi devreye giriyor ve gereksiz trafiği en düşük seviyede kesiyor.
Bununla birlikte, UFW rate limiting’i tek başına yeterli bir güvenlik çözümü olarak görmemek gerekiyor. Gerçek dünya ortamlarında şu katmanlı yaklaşımı öneririm:
- UFW rate limiting: İlk ve hızlı filtre katmanı, ağ seviyesinde koruma
- Fail2ban: Uygulama loglarını analiz eden, kalıcı ban uygulayan ikinci katman
- SSH hardening: Parola girişini kapatıp sadece anahtar tabanlı kimlik doğrulama kullanmak
- Port değişikliği: SSH’ı 22’den farklı bir porta taşımak (güvenlik yoluyla gizlilik değil, loglardaki gürültüyü azaltmak için)
- Düzenli log analizi: Yukarıdaki script gibi araçlarla günlük rapor almak
Rate limiting bir ağ güvenliği sihri değil, ama doğru kullanıldığında otomatik saldırıların büyük çoğunluğunu durduran pratik ve sıfır maliyetli bir önlem. Sunucunuza UFW kurduğunuz anda bunu aktif etmek için hiçbir gerekçeniz yok, bir dakikanızı ayırın ve ufw limit ssh komutunu çalıştırın.