Proteksi DoS #
Nginx tidak bisa menangani serangan DDoS skala besar — itu butuh solusi di level network atau CDN. Tapi untuk serangan DoS yang lebih kecil dan penyalahgunaan koneksi (seperti slow HTTP attacks), Nginx punya beberapa mekanisme yang efektif.
limit_conn: Batasi Koneksi Simultan #
Sementara limit_req membatasi laju request, limit_conn membatasi jumlah koneksi simultan dari satu IP:
http {
# Definisikan zone untuk tracking koneksi
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
# Zone untuk total koneksi ke server
limit_conn_zone $server_name zone=conn_per_server:10m;
limit_conn_status 429;
limit_conn_log_level warn;
}
server {
# Maksimum 20 koneksi simultan per IP
limit_conn conn_per_ip 20;
# Maksimum 1000 koneksi total ke server ini
limit_conn conn_per_server 1000;
location /downloads/ {
# Lebih ketat untuk download — cukup 5 koneksi per IP
limit_conn conn_per_ip 5;
# Batasi bandwidth per koneksi (berguna untuk download besar)
limit_rate 500k;
# Bandwidth throttling dimulai setelah X bytes pertama
# (biarkan header dan awal konten loading normal)
limit_rate_after 1m;
root /var/www/downloads;
}
}
Timeout yang Tepat untuk Mencegah Slow Attacks #
Slow HTTP attacks (seperti Slowloris) bekerja dengan membuka banyak koneksi dan sengaja mengirim request sangat lambat — menjaga koneksi tetap terbuka tanpa benar-benar mengirim data. Ini bisa menghabiskan semua slot worker Nginx.
Timeout yang tepat adalah pertahanan utama:
http {
# Timeout untuk menerima header request dari klien
# Jika header tidak selesai terkirim dalam waktu ini → tutup koneksi
client_header_timeout 10s;
# Timeout untuk menerima body request
client_body_timeout 10s;
# Timeout untuk mengirim response ke klien
# (waktu antar dua write ke klien)
send_timeout 10s;
# Durasi koneksi keep-alive
keepalive_timeout 65s;
# Jumlah request maksimum dalam satu koneksi keep-alive
keepalive_requests 100;
# Tutup koneksi yang mengirim header dengan baris terlalu banyak
# (pertahanan terhadap header flooding)
large_client_header_buffers 4 8k;
}
Nilai 10 detik untuk client_header_timeout dan client_body_timeout sudah cukup ketat untuk menangkap slow attacks tapi masih toleran untuk koneksi yang sedikit lambat.
Batasi Ukuran Request #
Request yang sangat besar bisa menghabiskan memori server. Batasi ukurannya:
http {
# Ukuran maksimum body request (default: 1m)
# Sesuaikan dengan kebutuhan aplikasi
client_max_body_size 10m;
# Ukuran buffer untuk membaca body request
client_body_buffer_size 128k;
# Ukuran buffer untuk membaca header request
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# Jika body request besar, simpan sementara ke file di sini
client_body_temp_path /tmp/nginx_client_body;
}
Untuk endpoint yang butuh upload besar (misalnya upload video), override client_max_body_size di location spesifik:
location /upload/ {
client_max_body_size 500m; # Override untuk endpoint upload
proxy_pass http://upload_backend;
}
Blokir User-Agent yang Mencurigakan #
Banyak bot dan scraper menggunakan User-Agent yang bisa diidentifikasi. Ini bukan pertahanan yang kuat (mudah di-spoof), tapi cukup untuk mengurangi beban dari bot sederhana:
http {
map $http_user_agent $blocked_agent {
default 0;
"" 1; # Kosong — tidak ada UA
~*malicious-bot 1;
~*scrapy 1;
~*python-requests 1; # Hati-hati, legitimate tool juga bisa pakai ini
~*curl 0; # Jangan blokir curl — banyak legitimate use
}
}
server {
location / {
if ($blocked_agent) {
return 403;
}
proxy_pass http://backend;
}
}
Sembunyikan Informasi Server #
Informasi tentang versi software yang digunakan bisa dimanfaatkan penyerang untuk mencari exploit yang diketahui:
http {
# Sembunyikan versi Nginx dari header Server dan halaman error
server_tokens off;
}
server {
# Sembunyikan atau ubah header Server sepenuhnya
# (butuh modul headers-more, tidak bawaan Nginx open-source)
# more_set_headers "Server: webserver";
}
Batas Kemampuan Nginx vs Solusi DDoS #
Penting untuk realistis tentang apa yang bisa dan tidak bisa dilakukan Nginx untuk proteksi DoS:
Yang bisa Nginx tangani:
✓ Slow HTTP attacks (Slowloris, R.U.D.Y)
✓ Brute force login (dikombinasikan dengan rate limiting)
✓ Request flooding dari jumlah IP terbatas
✓ Penyalahgunaan API dari klien individual
✓ Bot sederhana dengan pola yang mudah diidentifikasi
Yang butuh solusi lain:
✗ DDoS volumetrik (traffic melebihi kapasitas bandwidth server)
✗ DDoS terdistribusi dari ribuan IP berbeda
✗ Serangan layer 3/4 (SYN flood, UDP flood)
✗ Bot canggih dengan browser fingerprint yang valid
Untuk proteksi DDoS yang serius, tempatkan Cloudflare, AWS Shield, atau layanan DDoS protection serupa di depan server. Nginx berfungsi sebagai lapisan pertahanan kedua, bukan pertama.
Ringkasan #
limit_connmembatasi koneksi simultan per IP — berbeda darilimit_reqyang membatasi laju request.client_header_timeoutdanclient_body_timeoutyang pendek (10 detik) adalah pertahanan efektif terhadap slow HTTP attacks seperti Slowloris.client_max_body_sizemencegah upload oversized yang bisa menghabiskan disk atau memori.server_tokens offmenyembunyikan versi Nginx dari header dan halaman error — langkah kecil tapi mudah dilakukan.- Nginx tidak bisa menggantikan solusi DDoS protection yang proper — gunakan Cloudflare atau layanan serupa untuk proteksi volumetrik.