Rehber · DDoS koruması
Nginx ve Apache: Uygulama Katmanı Sıkılaştırma
Labris Networks Mühendislik Ekibi · Son güncelleme 13 Ağustos 2026 · 17 dk
Kısa cevap
Web sunucusu, uygulama katmanı saldırılarının karşılandığı ilk yerdir. İki ayar ailesi belirleyicidir: yavaş istemcileri kesen zaman aşımları ve kaynak başına eşzamanlı bağlantı ile istek hızı sınırları. Vekil arkasındaysanız gerçek istemci adresi kurulmadan ikisi de yanlış çalışır.
Web sunucusu, uygulama katmanı saldırılarının karşılandığı ilk yerdir ve çoğu kurulumda varsayılan ayarlarla çalışır. Varsayılanlar iyi niyetli istemciler için seçilmiştir; kötü niyetli olanın işini de kolaylaştırırlar.
İki ayar ailesi belirleyicidir. Zaman aşımları, yavaş bir istemcinin bir işçiyi ne kadar tutabileceğini söyler. Sınırlar, tek bir kaynağın ne kadar yer kaplayabileceğini.
Önce. Gerçek İstemci Adresi
Bu başlık en başta duruyor çünkü atlandığında sonraki her şey yanlış çalışır.
Sunucunuz bir yük dengeleyici, CDN ya da ters vekil arkasındaysa, gördüğü kaynak adres istemcinin değil o katmanındır. Kaynak başına konan her sınır, bütün trafiği tek adresten geliyor gibi sayar ve ilk yoğunlukta kendi vekilinizi kısıtlarsınız.
# nginx
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# apache — mod_remoteip
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 192.168.0.0/16
set_real_ip_from ve RemoteIPTrustedProxy listeleri daraltılmış olmalıdır. Her adrese güvenen bir yapılandırmada istemci kendi başlığını uydurabilir ve sınırlarınızı istediği gibi atlar. Güvenilen aralık, yalnızca gerçekten önünüzde duran katmanın adresleridir.
Yavaş İstemci Zaman Aşımları
Yavaş istek saldırısının fikri basittir: bağlantıyı aç, isteği gönderme ya da çok yavaş gönder, işçiyi meşgul tut. Hacim küçüktür, işçi havuzu tükenir.
# nginx
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
keepalive_timeout 15s;
reset_timedout_connection on;
# apache — mod_reqtimeout
RequestReadTimeout header=10-20,MinRate=500 body=10,MinRate=500
Timeout 30
KeepAliveTimeout 5
Apache tarafındaki MinRate, sabit bir süre yerine asgari hız tanımlar. İstemci veri göndermeye devam ettiği sürece süre uzar, ama belirlenen hızın altına düşerse bağlantı kapanır. Gerçekten yavaş bir mobil bağlantıyı kesmeden yavaş saldırıyı elemenin yolu budur.
Süreleri kısaltmadan önce kendi kullanıcılarınızın gerçek profiline bakın. Büyük dosya yükleyen bir uygulamada gövde zaman aşımını on saniyeye çekmek, saldırıyı değil kullanıcıyı keser.
Eşzamanlı Bağlantı ve İstek Hızı
# nginx — iki ayrı bölge. Bağlantı ve istek
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=genel:10m rate=30r/s;
limit_req_zone $binary_remote_addr zone=pahali:10m rate=2r/s;
server {
limit_conn perip 20;
limit_conn_status 429;
limit_req_status 429;
location / {
limit_req zone=genel burst=60 nodelay;
}
location /arama {
limit_req zone=pahali burst=5;
}
}
Üç ayrıntı önemlidir.
$binary_remote_addr kullanılır, $remote_addr değil. İkincisi metin olarak saklandığı için aynı bölgede kat kat az adres tutar.
burst ile nodelay birlikte anlam kazanır. burst tavanı aşan isteklerin kuyruğa alınacağı sayıdır; nodelay onların bekletilmeden hemen işleneceğini söyler. nodelay olmadan kuyruğa giren istekler yavaşlatılır ve kullanıcı bunu takılma olarak hisseder.
Durum kodu 429 seçilir, 503 değil. İkisi de çalışır ama 429 ne olduğunu söyler ve istemci tarafında doğru yorumlanır.
Apache tarafında karşılığı mod_qos ya da mod_ratelimit ile kurulur; mod_evasive sık önerilir ama süreç başına sayaç tuttuğu için çok süreçli MPM yapılandırmalarında beklendiği gibi çalışmaz. Bu, kurulmadan önce bilinmesi gereken bir sınırdır.
Pahalı Uçlar
Genel bir tavan, saldırıyı zorlaştırır ama asıl kazanç uç bazlı sınırdadır. Arka tarafta bir veritabanı sorgusu tetikleyen adres ile statik bir görsel aynı tavana tabi olmamalıdır.
Ayrım şu üç uçta neredeyse her uygulamada işe yarar. Arama, oturum açma denemesi ve form gönderimi. Uygulama katmanı saldırıları tam olarak bunları seçer.
Sınırı Açmadan Önce Ölç
Bir oran sınırının doğru eşiği, normal kullanımın nasıl göründüğü bilinmeden seçilemez. Tahminle konan eşik ya hiç tetiklenmez ya da yoğun bir günde gerçek kullanıcıyı keser.
# nginx — reddedilenleri ayrı kayda düşür
map $status $limitli { 429 1; default 0; }
access_log /var/log/nginx/limit.log combined if=$limitli;
Bu kaydı bir hafta izleyin. İçinde tanıdığınız kullanıcılar varsa eşik dardır. Yanlış pozitif burada ölçülmediği sürece görünmez kalır ve saldırı anında fark edilir.
TLS El Sıkışma Maliyeti
Şifreli trafikte yükün büyük kısmı veri aktarımında değil, oturum kurulumunda oluşur. Çok sayıda kısa bağlantı açan bir saldırı, bu maliyeti hedefler.
# nginx
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 1h;
ssl_session_tickets off;
Oturum önbelleği, dönen istemcinin tam el sıkışma yapmasını önler. ssl_session_tickets off ayrı bir tercihtir ve ileri gizlilik gerekçesiyle yapılır; başarım açısından bedeli vardır, bilerek seçilmelidir.
İşçi ve Tanıtıcı Sınırları
Web sunucusunun taşıyabileceği bağlantı sayısı, işletim sistemindeki dosya tanıtıcı sınırının üstüne çıkamaz. İkisi hizalanmamışsa sunucu, kendi ayarlarının çok altında tıkanır.
# nginx
worker_processes auto;
worker_rlimit_nofile 65535;
events { worker_connections 16384; }
# apache — event MPM
<IfModule mpm_event_module>
ServerLimit 16
ThreadsPerChild 64
MaxRequestWorkers 1024
MaxConnectionsPerChild 10000
</IfModule>
Apache’de MPM seçimi tek başına belirleyicidir. prefork her bağlantı için ayrı süreç açtığından yavaş istemci saldırılarında çok daha erken tükenir. event ise aynı donanımda kat kat fazla boşta bağlantı taşır. PHP’yi süreç içinde çalıştırmak için preforkta kalınıyorsa, PHP-FPM’e geçip evente taşınmak bu rehberdeki bütün ayarlardan daha fazla fark yaratır.
Linux tarafındaki karşılığı için sunucu sıkılaştırma rehberine bakın; oradaki LimitNOFILE değeri buradaki worker_rlimit_nofile ile uyumlu olmalıdır.
Sınırı Bilerek Kabul Etmek
Bu rehberdeki hiçbir ayar hacimsel saldırıyı karşılamaz. Erişim hattı dolduğunda nginx’in ne kadar iyi ayarlandığının bir önemi kalmaz; istekler sunucuya hiç ulaşmaz.
Web sunucusu sıkılaştırması, uygulama katmanı savunmasının son halkasıdır — ve tek halkası olmamalıdır.