Nginx ile Sunucu Kaynaklarınızı Koruyun: Basit ve Etkili İstek Sınırlama Rehberi 
Selam sistemciler!
Bugün, özellikle küçük ölçekli sunucuları ve VPS'leri hedef alan, "yavaş" ama sürekli saldırılara karşı en sevdiğim savunma mekanizmalarından birini konuşacağız: Nginx Rate Limiting.
Bu saldırılar bazen bir login sayfasına saniyede yüzlerce POST isteği, bazen de basit bir "wp-admin" taraması şeklinde gelebilir. Amacı, sunucunuzun kaynaklarını (CPU, RAM, bağlantı havuzu) tüketmek veya gerçek kullanıcılarınızı yavaşlatmaktır. İşte tam burada, Nginx'in içinde gelen bu hafif silah devreye giriyor.
Rate Limiting Nedir ve Neden Önemlidir?
Basitçe söylemek gerekirse, rate limiting (hız sınırlama), belirli bir IP adresinden veya kullanıcıdan gelen istekleri, tanımladığınız bir zaman dilimi içinde sınırlamaktır. Örneğin, "Bu IP'den dakikada en fazla 60 istek kabul edilir, fazlası reddedilir" gibi.
Avantajları:
Temel Bileşenler: limit_req_zone ve limit_req
Nginx'te rate limiting iki ana direktif ile yapılır:
Adım 1: Temel Global Rate Limiting Kurulumu
Öncelikle, tüm site genelinde veya belirli IP'ler için bir sınırlama bölgesi oluşturalım. Nginx ana yapılandırma dosyanızı (`nginx.conf` veya `/etc/nginx/conf.d/rate_limit.conf` gibi bir dosya) açın.
`http {}` bloğunun içine aşağıdaki gibi bir bölge tanımlayalım:
Not: `$binary_remote_addr` değişkeni, IP adresini ikili (binary) formatta sakladığı için `$remote_addr`'a göre daha az bellek kullanır. `10m` (10 megabayt), yaklaşık 160 bin IP adresinin durumunu saklayabilir.
Şimdi, bu bölgeyi tüm sunucunuz için veya belirli bir `server {}` bloğu için uygulayalım:
Bu yapılandırma ile, herhangi bir IP adresinden sitem.com'a dakikada 60'dan fazla istek geldiğinde, Nginx fazla olan istekleri varsayılan olarak 503 (Service Temporarily Unavailable) hatası ile reddedecektir.
Adım 2: Daha İnce Ayar: Burst ve Nodelay Parametreleri
Yukarıdaki kural biraz katı. Ani bir trafik patlaması yaşayan normal bir kullanıcı da (örneğin sayfayı hızlıca yenileyen biri) engellenebilir. İşte burada burst parametresi devreye giriyor. Burst, kuyruk anlamına gelir.
Bu ne yapar? Bir IP dakikada 60 istek hakkına sahiptir. Eğer aniden 15 istek gönderirse, ilk 1 istek hemen işlenir, sonraki 10 istek (burst değeri) kuyruğa alınır ve uygun hızda (saniyede 1) işlenir. 61. istekten itibaren (1+10+50?) hesaplamalar karışır, ancak temel mantık, 11. istekten sonra gelenler (burst kapasitesini aşanlar) hemen 503 hatası alır.
Peki ya kuyruktaki isteklerin hemen işlenmesini istersem? İşte o zaman nodelay parametresini ekleriz:
`nodelay` ile, burst kapasitesi içindeki istekler (ilk 10+1) gecikme olmadan hemen işlenir. Ancak, burst kotası da hemen tüketilmiş olur. Bu, ani trafik patlamalarını tolere ederken, ardından gelen isteklerin tamamen engellenmesini sağlar. Kullanım senaryosuna göre `nodelay`'i ekleyip eklememek size kalmış.
Adım 3: Kritik Lokasyonları Hedef Almak (Login, API)
Tüm siteye değil de, sadece saldırıya açık noktalara sınırlama koymak daha akıllıcadır. Örneğin, WordPress kullanıyorsanız:
Önemli Nokta: `limit_req_status 429;` kullanarak, sınır aşıldığında dönecek HTTP kodunu daha anlamlı olan "429 Too Many Requests" olarak değiştirebilirsiniz. Bu, saldırgana veya hatalı bir bot'a durumu daha net anlatır. 
Test Etmek ve Logları İzlemek
Kurallarınızı test etmek için `ab` (Apache Benchmark) veya `siege` gibi araçları kullanabilirsiniz. Örneğin:
Daha da önemlisi, Nginx hata loglarını (`/var/log/nginx/error.log`) izlemektir. Rate limiting nedeniyle reddedilen istekler buraya şu şekilde kaydedilir:
"excess" değeri, izin verilen hızın ne kadar üzerinde olduğunuzu gösterir. Bu loglar, saldırıları tespit etmek için altın değerindedir.
Son Söz ve Uyarılar
Nginx rate limiting, hafif ve etkili bir araçtır, ancak tek başına tam bir güvenlik çözümü DEĞİLDİR. Sophisticated DDoS saldırılarına karşı yetersiz kalabilir. Onun için:
Umarım bu rehber, sunucunuzun kapısına sağlam bir bekçi dikmenize yardımcı olur. Siz sunucularınızda rate limiting için hangi stratejileri kullanıyorsunuz? Özellikle WordPress veya özel API'ler için farklı kurallarınız var mı? Yorumlarda deneyimlerinizi paylaşın, birlikte öğrenelim!
Selam sistemciler!
Bu saldırılar bazen bir login sayfasına saniyede yüzlerce POST isteği, bazen de basit bir "wp-admin" taraması şeklinde gelebilir. Amacı, sunucunuzun kaynaklarını (CPU, RAM, bağlantı havuzu) tüketmek veya gerçek kullanıcılarınızı yavaşlatmaktır. İşte tam burada, Nginx'in içinde gelen bu hafif silah devreye giriyor.
Rate Limiting Nedir ve Neden Önemlidir?
Basitçe söylemek gerekirse, rate limiting (hız sınırlama), belirli bir IP adresinden veya kullanıcıdan gelen istekleri, tanımladığınız bir zaman dilimi içinde sınırlamaktır. Örneğin, "Bu IP'den dakikada en fazla 60 istek kabul edilir, fazlası reddedilir" gibi.
Avantajları:
- Sunucu kaynaklarınızı (CPU, bellek) korur.
- Brute-force saldırılarının etkisini büyük ölçüde azaltır.
- Gerçek kullanıcılarınızın performansını ve erişimini garanti altına alır.
- Basit DDoS türü saldırılara karşı ilk savunma hattını oluşturur.
Temel Bileşenler: limit_req_zone ve limit_req
Nginx'te rate limiting iki ana direktif ile yapılır:
- limit_req_zone: İstekleri sınırlamak için kullanılacak bölgeyi (zone) ve kuralları tanımlar. Genellikle `http {}` bloğu içine yazılır.
- limit_req: Tanımlanan bölgeyi, belirli bir `location {}` bloğuna veya sunucuya uygular. `server {}` veya `location {}` bloğu içine yazılır.
Adım 1: Temel Global Rate Limiting Kurulumu
Öncelikle, tüm site genelinde veya belirli IP'ler için bir sınırlama bölgesi oluşturalım. Nginx ana yapılandırma dosyanızı (`nginx.conf` veya `/etc/nginx/conf.d/rate_limit.conf` gibi bir dosya) açın.
`http {}` bloğunun içine aşağıdaki gibi bir bölge tanımlayalım:
NGINX:
http {
# IP adresine göre bir sınırlama bölgesi tanımla.
# 'bir_zone_adi' bölgenin adı, 10m bellekte 10MB yer kaplar.
# 'rate=60r/m' dakikada 60 istek hızını belirler (saniyede 1 istek).
limit_req_zone $binary_remote_addr zone=bir_zone_adi:10m rate=60r/m;
# Diğer http ayarları...
}
Şimdi, bu bölgeyi tüm sunucunuz için veya belirli bir `server {}` bloğu için uygulayalım:
NGINX:
server {
listen 80;
server_name sitem.com;
# Tüm lokasyonlara global rate limit uygula (statik dosyalar dahil).
limit_req zone=bir_zone_adi;
location / {
# Uygulama kökü vs...
}
}
Adım 2: Daha İnce Ayar: Burst ve Nodelay Parametreleri
Yukarıdaki kural biraz katı. Ani bir trafik patlaması yaşayan normal bir kullanıcı da (örneğin sayfayı hızlıca yenileyen biri) engellenebilir. İşte burada burst parametresi devreye giriyor. Burst, kuyruk anlamına gelir.
NGINX:
server {
listen 80;
server_name sitem.com;
# 60r/m hızını koru, ancak 10 isteklik bir kuyruk (burst) oluştur.
# Kuyruktaki istekler gecikmeli olarak işlenir.
limit_req zone=bir_zone_adi burst=10;
location / {
# ...
}
}
Peki ya kuyruktaki isteklerin hemen işlenmesini istersem? İşte o zaman nodelay parametresini ekleriz:
NGINX:
limit_req zone=bir_zone_adi burst=10 nodelay;
Adım 3: Kritik Lokasyonları Hedef Almak (Login, API)
Tüm siteye değil de, sadece saldırıya açık noktalara sınırlama koymak daha akıllıcadır. Örneğin, WordPress kullanıyorsanız:
NGINX:
server {
# ... diğer ayarlar ...
location / {
# Ana sayfada rate limit uygulamayabilirsiniz.
try_files $uri $uri/ /index.php?$args;
}
# WordPress wp-login.php ve admin-ajax.php için ÇOK SIKI limit
location ~* ^/(wp-login\.php|wp-admin/admin-ajax\.php) {
# Çok daha agresif bir bölge tanımlayalım (http bloğunda)
# limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
limit_req zone=login_limit burst=3 nodelay;
# Sınır aşıldığında loglama yap (opsiyonel)
limit_req_status 429; # 429: Too Many Requests (daha anlamlı)
# Bu lokasyona özel fastcgi_pass vs. ayarlarınız...
include fastcgi_params;
fastcgi_pass php_handle;
}
# Genel PHP dosyaları için biraz daha esnek bir limit
location ~ \.php$ {
limit_req zone=bir_zone_adi burst=5;
# ... php işleme ayarları ...
}
}
Test Etmek ve Logları İzlemek
Kurallarınızı test etmek için `ab` (Apache Benchmark) veya `siege` gibi araçları kullanabilirsiniz. Örneğin:
Bash:
ab -n 100 -c 10 https://sitem.com/wp-login.php
Kod:
2023-10-01 12:00:00 [error] 12345#12345: *98765 limiting requests, excess: 5.340 by zone "login_limit", client: 203.0.113.1, server: sitem.com, request: "POST /wp-login.php HTTP/1.1", host: "sitem.com"
Son Söz ve Uyarılar
Nginx rate limiting, hafif ve etkili bir araçtır, ancak tek başına tam bir güvenlik çözümü DEĞİLDİR. Sophisticated DDoS saldırılarına karşı yetersiz kalabilir. Onun için:
- Bu kuralları, fail2ban gibi bir araçla birlikte kullanarak, sınırı aşan IP'leri geçici olarak tamamen engelleyebilirsiniz.
- Sunucu güvenlik duvarınızı (iptables/nftables veya cloud firewall) asla unutmayın.
- Kurallarınızı canlı sisteme uygulamadan önce bir test/staging ortamında mutlaka deneyin. Yanlış bir kural, gerçek kullanıcılarınızı engelleyebilir!
Umarım bu rehber, sunucunuzun kapısına sağlam bir bekçi dikmenize yardımcı olur. Siz sunucularınızda rate limiting için hangi stratejileri kullanıyorsunuz? Özellikle WordPress veya özel API'ler için farklı kurallarınız var mı? Yorumlarda deneyimlerinizi paylaşın, birlikte öğrenelim!