Nginx Rate Limiting ile DDoS ve Brute Force Koruması
Nginx limit_req_zone ile DDoS ve brute force koruması: login sayfası sınırlama, burst yapılandırması ve log analizi.
Nginx Rate Limiting Nedir?
Rate limiting (hız sınırlama), belirli bir zaman diliminde bir kaynak (IP adresi, URL, kullanıcı) tarafından yapılabilecek istek sayısını sınırlayan güvenlik mekanizmasıdır. Nginx'in yerleşik ngx_http_limit_req_module modülü ile DDoS saldırılarını, brute force giriş denemelerini ve web kazımayı (scraping) etkili biçimde engelleyebilirsiniz.
Rate limiting olmayan bir sunucu, saldırganların saniyede binlerce istek göndererek hem kaynaklarını tüketmesine hem de şifre deneme saldırıları yapmasına açık kalır. Nginx'in token bucket algoritması tabanlı rate limiting implementasyonu, meşru kullanıcıları etkilemeden kötü niyetli trafiği engeller.
Temel Kavramlar
- limit_req_zone: Hız sınırı bölgesi tanımlar (paylaşılan hafıza alanı)
- limit_req: Tanımlanan bölgeyi uygulamanın yapıldığı yerde kullanır
- burst: Anlık istek artışlarına izin verilen ek istek sayısı
- nodelay: Burst isteklerinin kuyruğa alınmak yerine anında işlenmesi
Genel Rate Limiting Yapılandırması
nginx.conf dosyasının http bloğuna zone tanımlarını ekleyin:
sudo nano /etc/nginx/nginx.conf
http {
# IP başına 10 istek/saniye kuralı (10MB paylaşılan hafıza)
limit_req_zone $binary_remote_addr zone=genel:10m rate=10r/s;
# Login sayfası için daha sıkı kural (1 istek/saniye)
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
# API endpoint için
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/m;
# Rate limit aşıldığında 429 Too Many Requests döndür
limit_req_status 429;
# Log seviyesi
limit_req_log_level warn;
}
Site Yapılandırmasında Uygulama
sudo nano /etc/nginx/sites-available/mysite
server {
listen 80;
server_name example.com;
# Genel sınır (burst=20 ile anlık 20 ekstra isteğe izin ver)
limit_req zone=genel burst=20 nodelay;
# Login sayfasına özel sıkı sınır
location /login {
limit_req zone=login burst=5 nodelay;
limit_req_status 429;
try_files $uri $uri/ /index.php?$query_string;
}
# wp-login.php (WordPress) koruması
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
# XML-RPC engelleme (WordPress brute force)
location = /xmlrpc.php {
deny all;
return 444;
}
# API endpoint
location /api/ {
limit_req zone=api burst=10;
proxy_pass http://backend;
}
}
Gelişmiş: HTTP Metot ve User-Agent Filtreleme
server {
# Geçersiz HTTP metodlarını engelle
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$) {
return 405;
}
# Kötü niyetli bot'ları engelle
if ($http_user_agent ~* (wget|curl|python|scrapy|bot|crawler)) {
return 403;
}
# Boş User-Agent'ları engelle
if ($http_user_agent = "") {
return 444;
}
}
IP Tabanlı Engelleme
sudo nano /etc/nginx/conf.d/blocked_ips.conf
geo $blocked_ip {
default 0;
1.2.3.4/32 1; # Tek IP engelle
5.6.7.0/24 1; # Tüm /24 subnet engelle
}
server {
if ($blocked_ip) {
return 444;
}
}
Fail2ban ile Entegrasyon
Rate limit ihlallerini yapan IP'leri otomatik engellemek için Fail2ban kullanabilirsiniz:
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.local
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
action = iptables-multiport[name=nginx, port="http,https"]
logpath = /var/log/nginx/error.log
findtime = 600
maxretry = 10
bantime = 7200
Rate Limit Log Analizi
# Rate limit ihlallerini izle
sudo tail -f /var/log/nginx/error.log | grep "limiting requests"
# Son 1 saatte en fazla engellenen IP'ler
sudo awk '/limiting requests/{print $NF}' /var/log/nginx/error.log | \
sort | uniq -c | sort -rn | head -20
# 429 döndüren istekleri say
sudo awk '$9==429{print $1}' /var/log/nginx/access.log | \
sort | uniq -c | sort -rn | head -10
Test Etme
# ApacheBench ile test
ab -n 100 -c 10 http://example.com/
# Curl döngüsü ile test
for i in $(seq 1 20); do curl -o /dev/null -s -w "%{http_code}\n" http://example.com/login; done
Yapılandırmayı Yeniden Yükle
sudo nginx -t
sudo systemctl reload nginx
Sık Karşılaşılan Sorunlar
Meşru Kullanıcılar da Engelleniyor
burst değerini artırın veya belirli IP aralıklarını beyaz listeye alın:
geo $limit {
default 1;
127.0.0.1 0; # Localhost hariç tut
10.0.0.0/8 0; # İç ağ hariç tut
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=genel:10m rate=10r/s;
Sonuç
Nginx rate limiting ile sunucunuzu DDoS saldırılarına ve brute force denemelerine karşı güçlü biçimde korudunuz. limit_req_zone, burst ve nodelay parametrelerini doğru ayarlayarak meşru kullanıcı deneyimini bozmadan kötü niyetli trafiği engelliyorsunuz. Fail2ban entegrasyonu ile bu korumayı bir adım öteye taşıyabilirsiniz.
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!