Nginx ile Basit Ama Etkili Rate Limiting (Hız Sınırlama) Kurulumu 🛡️

webnix

Üye
Katılım
14 Mart 2026
Mesajlar
2
Nginx ile Basit Ama Etkili Rate Limiting (Hız Sınırlama) Kurulumu 🛡️

Selam sistemciler! 🖥️ Bugün, özellikle küçük ölçekli saldırılara ve kötü niyetli botlara karşı sunucunuzu korumanın en temel ve etkili yöntemlerinden birinden bahsedeceğiz: Nginx Rate Limiting. Bu yöntem, "saniyede X istekten fazlasını kabul etme" mantığıyla çalışır ve kaynaklarınızı korumanızı sağlar. Hem basit hem de güçlü bir kalkan! ⚙️

Rate Limiting Nedir ve Neden Önemlidir?
Kısaca, belirli bir IP adresinden veya bağlantı noktasından gelen istek sayısını sınırlamaktır. Şunları önlemenize yardımcı olur:
  • Basit DDoS veya yavaşlama (slowloris) saldırılarını
  • Brute-force (kaba kuvvet) girişimlerini (örn: /wp-login.php, /admin)
  • API uç noktalarınızın kötüye kullanılmasını
  • Sunucunuzun kaynaklarının (CPU, RAM) bir IP tarafından tüketilmesini
Bu önlem, gerçek kullanıcılarınızı etkilemeden, otomatik bot trafiğini dizginler.

Nginx'te Rate Limiting Nasıl Çalışır?
Nginx, limit_req_zone ve limit_req direktiflerini kullanır. İşleyiş şöyledir:
1. Bir "zone" (bölge) tanımlarsınız. Bu bölge, IP'leri ve onların istek sayılarını sakladığımız hafıza alanıdır.
2. Bu bölgeyi, korumak istediğiniz lokasyonlara (location bloklarına) uygularsınız.
3. Nginx, bir IP'nin belirlediğiniz limiti aşıp aşmadığını bu bölgeyi kontrol ederek anlar.

Adım 1: Ana Nginx Konfigürasyonunda Zone'u Tanımlama
İlk iş, Nginx'in ana yapılandırma dosyasında (genellikle `/etc/nginx/nginx.conf` içindeki `http { }` bloğunda) bir limit bölgesi oluşturmak.

Aşağıdaki komutu kullanarak dosyayı düzenleyelim:
Bash:
sudo nano /etc/nginx/nginx.conf

`http {` bloğunun içine (tercihen en üst kısımlara) şu satırı ekleyin:
NGINX:
http {
    ...
    # Rate Limiting Zone Tanımı
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    ...
}

Bu satırın anlamı:
  • limit_req_zone: Zone oluşturma direktifi.
  • $binary_remote_addr: İstemcinin IP adresi. Binary format daha az hafıza kullanır.
  • zone=one:10m: "one" isimli bir zone oluştur. Bu zone, 10 megabyte (10m) hafıza kullansın. Bu boyut yaklaşık 160.000 IP adresi tutabilir.
  • rate=10r/s: İzin verilen hız. "Saniyede 10 istek" (r/s = requests per second). Dilerseniz `30r/m` (dakikada 30 istek) gibi de ayarlayabilirsiniz.
Değişikliği kaydedip çıkın (`Ctrl+X`, `Y`, `Enter`). Şimdilik Nginx'i yeniden başlatmaya gerek yok.

Adım 2: Rate Limiting'i Site Konfigürasyonuna Uygulama
Şimdi, bu kuralı korumak istediğiniz web sitesinin yapılandırma dosyasına uygulayalım. Örneğin, `/etc/nginx/sites-available/sitem` dosyasını açalım.
Bash:
sudo nano /etc/nginx/sites-available/sitem

Korumak istediğiniz `location` bloğunu bulun. Örneğin, tüm siteyi korumak için `server { }` bloğu içine, veya sadece giriş sayfasını korumak için `location / { }` içine aşağıdaki direktifi ekleyin:
NGINX:
server {
    listen 80;
    server_name sitem.com;

    # Rate Limiting tüm sunucu için etkin
    limit_req zone=one burst=20 nodelay;

    location / {
        root /var/www/html;
        index index.html;
    }

    # ADMIN PANELİ için DAHA SIKI bir limit (Opsiyonel)
    location /admin/ {
        limit_req zone=one burst=5 nodelay;
        # ... diğer yönlendirmeleriniz
    }
}

Buradaki parametreler:
  • zone=one: Yukarıda tanımladığımız "one" zone'unu kullan.
  • burst=20: "Patlama" kapasitesi. Bir IP aniden 10r/s limitini aşarsa (örneğin 30 istek gönderirse), ilk 10'u hemen işlenir, sonraki 20'si bir kuyruğa alınır ve limit dahilinde yavaş yavaş işlenir. 20'den fazlası ise 503 Hizmet Kullanılamıyor hatası alır. Bu, geçici trafik artışlarını yumuşatır.
  • nodelay: "Kuyruktaki" isteklerin gecikmesiz (delay olmadan) işlenmesini sağlar. `burst` ile birlikte kullanılır. Kaldırırsanız, kuyruktaki istekler yapay bir gecikmeyle işlenir.

Adım 3: Konfigürasyonu Test Edip Nginx'i Yeniden Başlatma
Önce yapılandırma dosyalarımızın sözdizimini kontrol edelim:
Bash:
sudo nginx -t
Eğer "syntax is ok" ve "test is successful" mesajlarını görürseniz, sorun yok demektir. 🐧

Şimdi Nginx'i yeniden başlatalım:
Bash:
sudo systemctl reload nginx  # veya sudo service nginx reload

Test Etme ve İnce Ayar
Kurulumunuz çalışıyor mu? Basit bir test için `ab` (Apache Benchmark) aracını veya `wrk` kullanabilirsiniz. Örneğin:
Bash:
ab -n 100 -c 20 http://sitem.com/
Bu komut, toplam 100 isteği, aynı anda 20 eşzamanlı bağlantı ile gönderir. Eğer limiti aşan IP'ler için `503` hata kodları görüyorsanız, rate limiting başarıyla çalışıyor demektir!

İnce Ayar İpuçları:
  • Statik dosyaları (resim, CSS, JS) hariç tutun: Bu dosyalar için rate limiting uygulamak gereksizdir. `location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { }` bloğunun içine `limit_req off;` yazabilirsiniz.
  • Beyaz Liste (Whitelist): Kendi IP'niz veya güvendiğiniz bir servisin IP'si için limiti kaldırmak isterseniz, `geo` ve `map` modüllerini kullanabilirsiniz. Bu biraz daha ileri seviye bir konu.
  • Loglama: Reddedilen istekleri loglamak için `limit_req_status` ve `error_log` ayarlarını inceleyebilirsiniz.

İşte bu kadar! 🌐 Oldukça basit bir konfigürasyonla, sunucunuzu otomatik saldırılara karşı önemli ölçüde korumuş oldunuz. Bu temel yapıyı, farklı `location` bloklarına farklı `rate` ve `burst` değerleri atayarak geliştirebilirsiniz.

Peki siz sunucularınızda rate limiting dışında hangi basit ve etkili güvenlik önlemlerini alıyorsunuz? Yorumlarda deneyimlerinizi paylaşın, birlikte öğrenelim! 🛡️
 

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