Sebagian besar paket hosting menjanjikan perlindungan DDoS. Biasanya itu berarti menyaring banjir besar paket sampah (lapisan 3 dan 4) sebelum mencapai server Anda. Itu tidak menghentikan seribu browser "asli" yang memuat halaman paling lambat Anda secara bersamaan. Serangan lapisan aplikasi (lapisan 7) itu tampak seperti pengunjung biasa, dan Anda harus menanganinya sendiri. Lihat apa itu perlindungan DDoS untuk latar belakangnya.
Kenali perbedaannya
- Banjir volumetrik: memenuhi saluran jaringan. Host atau upstream yang menyaringnya.
- Serangan protokol: menghabiskan tabel koneksi. Sebagian besar ditangani oleh jaringan.
- Serangan lapisan 7: permintaan HTTP yang tampak valid dan menghabiskan CPU, database, atau worker. Ini sampai ke aplikasi Anda.
Langkah 1: batasi laju di Nginx
Batasi seberapa cepat satu alamat dapat membuat permintaan. Tentukan zona di blok http lalu terapkan ke situs Anda.
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;
server {
location / {
limit_req zone=perip burst=20 nodelay;
limit_conn connip 20;
}
location = /login {
limit_req zone=perip burst=3 nodelay;
}
}
Gunakan batas yang jauh lebih ketat untuk login dan pencarian, karena keduanya mahal.
Langkah 2: cache apa yang bisa di-cache
Halaman yang di-cache hampir tidak membebani saat disajikan. Aktifkan caching FastCGI atau proksi untuk lalu lintas anonim, bahkan hanya 30 sampai 60 detik. Ini mengubah banjir permintaan identik menjadi segelintir permintaan sungguhan.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=site:50m inactive=10m;
fastcgi_cache site;
fastcgi_cache_valid 200 60s;
fastcgi_cache_use_stale updating error timeout;
Langkah 3: atur timeout yang wajar
Serangan koneksi lambat menahan worker tetap terbuka. Persingkat batasnya.
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;
Langkah 4: blokir pelanggar berulang dengan fail2ban
Blokir alamat yang melanggar pembatas laju. Nginx mencatat permintaan yang ditolak ke log error, dan sebuah filter dapat mencocokkannya.
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 1h
Langkah 5: pasang proksi di depan saat situasinya serius
Reverse proxy atau CDN dengan tantangan bot dapat menyerap serangan yang tidak sanggup ditahan satu VPS. Ingatlah untuk melindungi origin seperti dijelaskan di merahasiakan IP origin Anda, atau penyerang akan menghindarinya.
Bersiaplah sebelum terjadi
- Kenali halaman paling lambat Anda dan perbaiki atau cache.
- Terus lakukan pemantauan agar Anda cepat menyadari lonjakan.
- Siapkan rencana: batas lebih ketat, halaman pemeliharaan, server lebih besar.
Dasar-dasar di panduan UFW dan fail2ban melengkapi panduan ini.