Cara Mengatasi DDoS Ringan & Bot di Bare-Metal Server

Mengatasi Bot & Serangan DDoS Ringan pada Bare-Metal Server Menggunakan Rate Limiting
Mengatasi Bot & Serangan DDoS Ringan pada Bare-Metal Server Menggunakan Rate Limiting

Ringkasan

  • Strategi Pertahanan Berlapis: Menggabungkan Nginx, Fail2Ban, dan IPTables untuk menghentikan serangan bot sebelum mencapai application layer.
  • Optimasi Resource: Memahami mengapa pemblokiran di level kernel (IPTables) jauh lebih efisien daripada pemblokiran di level aplikasi.
  • Konfigurasi Presisi: Panduan teknis menerapkan rate limiting yang ketat untuk endpoint sensitif tanpa mengganggu pengalaman pengguna asli.
  • Otomatisasi Keamanan: Cara mengubah log error Nginx menjadi aksi pemblokiran otomatis menggunakan Fail2Ban.

Beberapa tahun lalu, saya mengalami momen yang cukup menegangkan saat mengelola infrastruktur server. Server bare-metal yang saya kelola tiba-tiba mengalami lonjakan penggunaan CPU dan memory hingga mencapai batas maksimal, padahal traffic pengguna normal tidak menunjukkan peningkatan yang signifikan. Setelah dilakukan analisis mendalam melalui log server, terungkap bahwa ada ribuan request per menit dari berbagai alamat IP yang mencoba melakukan brute-force login dan scraping data secara agresif.

Ini bukanlah serangan DDoS skala besar (volumetric attack) yang mampu melumpuhkan seluruh bandwidth data center, namun cukup untuk membuat aplikasi terasa lambat (latency tinggi) dan memenuhi penyimpanan log server. Karena saya menggunakan bare-metal server—yang berbeda dengan layanan cloud yang biasanya sudah dilengkapi dengan Web Application Firewall (WAF) otomatis atau fitur auto-scaling—saya harus membangun lapisan pertahanan mandiri.

Solusi yang paling efektif, ringan, dan terbukti stabil adalah kombinasi antara Nginx rate limiting (limit_req), Fail2Ban, dan IPTables. Ketiganya bekerja di lapisan (layer) yang berbeda, sehingga serangan bisa dihentikan sedini mungkin sebelum sempat membebani application layer (seperti Node.js, Python, atau PHP).

Mengapa Strategi Berlapis Efektif untuk DDoS Ringan & Bot?

Serangan DDoS ringan dan bot otomatis biasanya memiliki pola yang dapat diprediksi. Mereka cenderung mengirimkan request dalam jumlah besar dari satu atau beberapa IP, menggunakan pola request yang repetitif pada endpoint tertentu (seperti /login atau /search), seringkali menggunakan User-Agent yang aneh atau bahkan kosong, serta mengabaikan instruksi dalam robots.txt.

Dengan menerapkan pendekatan berlapis, kita menciptakan sebuah "filter" yang semakin ketat saat request bergerak masuk ke dalam server:

  • Nginx limit_req: Berperan sebagai garda depan di reverse proxy. Ia menahan request yang melebihi ambang batas kecepatan yang ditentukan.
  • Fail2Ban: Berperan sebagai analis. Ia membaca log Nginx secara real-time, mengidentifikasi IP yang berulang kali melanggar aturan rate limit, dan memberikan instruksi pemblokiran.
  • IPTables: Berperan sebagai eksekutor di level kernel. Ini adalah lapisan terendah dan paling hemat resource karena paket data dari IP terlarang langsung dibuang (drop) sebelum diproses oleh sistem operasi lebih jauh.

Hasil akhirnya adalah efisiensi resource. IP mencurigakan sudah "ditendang" di level kernel, sehingga aplikasi utama Anda tidak perlu membuang siklus CPU hanya untuk menolak request ilegal.

1. Mengaktifkan Rate Limiting di Nginx dengan limit_req

Modul limit_req sudah terpasang secara bawaan (built-in) di Nginx. Kunci keberhasilannya terletak pada konfigurasi zona yang tepat agar tidak terjadi false positive (pengguna asli yang terblokir).

Buka konfigurasi Nginx Anda (biasanya di /etc/nginx/nginx.conf atau file konfigurasi site di sites-available), lalu tambahkan definisi zona di dalam blok http:


http {
    # Definisikan zona rate limiting
    # zone=one:10m artinya menggunakan memory 10MB untuk menyimpan state IP (cukup untuk ~160.000 IP)
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    
    # Zona khusus login yang sangat ketat untuk mencegah brute-force
    limit_req_zone $binary_remote_addr zone=login:10m rate=3r/m;
    
    # Zona untuk API agar tidak di-scrape secara masif
    limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s;

    # Zona untuk connection limiting untuk membatasi jumlah koneksi simultan
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}

Penerapan pada Server Block

Setelah mendefinisikan zona, Anda harus menerapkannya pada lokasi (location) yang spesifik di dalam blok server:


server {
    listen 443 ssl http2;
    server_name contoh.com;

    # Batasi maksimal 20 koneksi simultan per satu alamat IP
    limit_conn addr 20;

    location / {
        # burst=20 memungkinkan lonjakan singkat, nodelay langsung menolak jika limit terlampaui
        limit_req zone=one burst=20 nodelay;
        # ... konfigurasi proxy_pass
    }

    location /api/ {
        limit_req zone=api burst=50 nodelay;
        # ...
    }

    location ~ ^/(login|register|password/reset) {
        limit_req zone=login burst=5 nodelay;
        # ...
    }
}

Tips Profesional:

  • Burst: Sangat penting untuk memberikan burst. User asli seringkali memuat beberapa resource (CSS, JS, Images) secara bersamaan. Tanpa burst, user asli bisa terkena error 503.
  • Nodelay: Gunakan nodelay jika Anda ingin request yang melebihi limit langsung ditolak. Jika tidak digunakan, Nginx akan mencoba mengantre request tersebut, yang justru bisa membebani memory jika serangan terjadi secara masif.
  • Monitoring: Jangan langsung menerapkan angka yang sangat ketat. Gunakan limit_req_status 429; untuk mengirimkan kode HTTP 429 (Too Many Requests) sehingga Anda bisa memantau log dan menyesuaikan threshold.

Setelah melakukan perubahan, jangan lupa untuk memvalidasi konfigurasi dan melakukan reload:

sudo nginx -t
sudo systemctl reload nginx

2. Mengintegrasikan Fail2Ban untuk Auto-Ban IP

Nginx rate limiting hanya bersifat sementara; ia menolak request saat itu juga, tetapi IP penyerang masih bisa mencoba lagi. Di sinilah Fail2Ban berperan. Fail2Ban akan memantau error.log Nginx, dan jika sebuah IP terkena rate limit berkali-kali, Fail2Ban akan memerintahkan IPTables untuk memblokir IP tersebut sepenuhnya selama jangka waktu tertentu.

Instalasi Fail2Ban:

sudo apt update
sudo apt install fail2ban -y

Membuat Filter Kustom: Buat file filter untuk mengenali pola error limiting requests dari Nginx:

sudo nano /etc/fail2ban/filter.d/nginx-limit-req.conf

Isi dengan konfigurasi berikut:


[Definition]
failregex = limiting requests, excess: .* by zone.*client: 
            limiting connections by zone.*client: 
ignoreregex =

Mengonfigurasi Jail: Sekarang, buat aturan (jail) untuk menentukan kapan IP harus diblokir:

sudo nano /etc/fail2ban/jail.d/nginx-limit-req.conf

Isi dengan konfigurasi berikut:


[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 60
bantime = 3600
action = iptables-multiport[name=nginx-limit-req, port="http,https"]

Analisis Parameter:

  • maxretry = 5: IP akan diblokir setelah 5 kali melanggar rate limit.
  • findtime = 60: Pelanggaran harus terjadi dalam rentang waktu 60 detik.
  • bantime = 3600: IP diblokir selama 1 jam. Untuk serangan yang lebih persisten, Anda bisa meningkatkan ini menjadi 86400 (24 jam).

Restart Fail2Ban untuk menerapkan perubahan:

sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-limit-req

3. Memperkuat dengan IPTables (Lapisan Kernel)

Meskipun Fail2Ban sudah menggunakan IPTables, ada baiknya kita menambahkan aturan manual untuk menangani serangan yang lebih rendah levelnya, seperti SYN Flood atau koneksi TCP yang menggantung.

Berikut adalah beberapa aturan IPTables yang saya rekomendasikan untuk server bare-metal:


# 1. Batasi jumlah koneksi baru per IP untuk mencegah resource exhaustion
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
sudo iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 30 -j DROP

# 2. Proteksi SYN flood sederhana untuk mencegah TCP half-open attacks
sudo iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

# 3. Drop paket yang statusnya INVALID (paket yang tidak sesuai dengan state tracking)
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Agar aturan ini tidak hilang saat server melakukan reboot, instal iptables-persistent:

sudo apt install iptables-persistent -y
sudo netfilter-persistent save

Perbandingan Efisiensi Lapisan Pertahanan

Untuk memahami mengapa kombinasi ini sangat kuat, mari kita lihat perbandingannya dalam tabel berikut:

Lapisan Tools Kecepatan Blokir Penggunaan Resource Kegunaan Utama
Application Node.js/Python/PHP Lambat Tinggi Business Logic & Auth
Reverse Proxy Nginx limit_req Cepat Sangat Rendah Rate Limiting & Burst
Log-based Fail2Ban Sedang Rendah Auto-ban Pola Berulang
Kernel IPTables Sangat Cepat Paling Rendah Packet & Connection Filtering

Checklist Implementasi untuk Administrator Server

Jika Anda ingin mengamankan server Anda sekarang, ikuti checklist praktis ini:

  1. Audit Endpoint: Identifikasi endpoint mana yang paling berat (misal: pencarian database kompleks) dan terapkan rate limit khusus di sana.
  2. Konfigurasi Nginx: Terapkan limit_req_zone dan limit_conn_zone.
  3. Aktifkan Fail2Ban: Pastikan filter membaca log Nginx dengan benar dan bantime sudah sesuai dengan tingkat serangan.
  4. Hardening Kernel: Tambahkan aturan IPTables untuk SYN flood dan invalid packets.
  5. Whitelist: Sangat penting! Masukkan IP kantor, VPN, atau IP monitoring Anda ke dalam whitelist Fail2Ban agar Anda tidak terkunci dari server sendiri.
  6. Monitoring Berkala: Gunakan perintah fail2ban-client status nginx-limit-req untuk melihat berapa banyak IP yang sedang diblokir.

Penutup

Bot dan serangan DDoS ringan hampir pasti akan datang begitu aplikasi Anda mulai dikenal di internet. Perbedaan antara server yang tetap stabil dan server yang sering down adalah seberapa cepat dan sedalam Anda memblokir ancaman tersebut.

Kombinasi Nginx, Fail2Ban, dan IPTables adalah solusi cost-effective yang sangat tangguh untuk menahan serangan level menengah ke bawah tanpa perlu membayar layanan anti-DDoS pihak ketiga yang mahal. Kuncinya adalah: terapkan secara bertahap, monitor dampaknya, dan sesuaikan threshold berdasarkan traffic normal aplikasi Anda.

Jika Anda sedang mengalami serangan serupa atau ingin saya membantu mereview konfigurasi keamanan server Anda, jangan ragu untuk berbagi log (yang sudah di-sanitize). Biasanya, celah keamanan bisa ditemukan dengan cepat melalui analisis pola request.

Solusi yang relevan

Service

Jasa Pembuatan Website

Pembuatan website custom yang cepat, modern, dan siap jualan.

Lihat Solusi →

Dapatkan Artikel Terbaru!

Berlangganan newsletter kami untuk mendapatkan tips dan insight menarik langsung ke inbox Anda.

Kami tidak akan pernah membagikan email Anda (No Spam).