sunucuhataları
teknik çözüm merkezi
Ara Giriş Yap Üye Ol
🏠 Ana Sayfa 📚 Kurulum Rehberleri
Kategoriler
🌐 Web Sunucuları 🐧 İşletim Sistemleri 📦 Sanallaştırma & VPS 🖥️ Kontrol Panelleri 🔒 SSL & Güvenlik 📝 CMS & Uygulamalar 🗄️ Veritabanı 📧 Mail Sunucusu 🗨️ Forum ℹ️ Hakkımızda 📧 İletişim
Giriş Yap Üye Ol
Ana Sayfa Web Sunucuları Nginx Kurulumu Nginx Rate Limiting ile DDoS ve Brute Force Kor...
🟢 Nginx Kurulumu

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.

📅 11 Mayıs 2025 👁 9 görüntülenme ⏱ 4 dk okuma
𝕏 Paylaş
📋 İçindekiler göster/gizle

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.

🤔 Bu kurulumda sorun mu yaşıyorsunuz?

Hata mesajınızı kopyalayıp foruma konu açın. Topluluğumuz size özel durumunuza göre yardımcı olacaktır.

🗨️ Foruma Katıl & Yardım Al

Yorumlar

Henüz yorum yok. İlk yorumu siz yapın!

Yorum Yap

Yorumunuz onaylandıktan sonra yayınlanır.