# Hardening Infrastructure Web: Mencegah Serangan Bruteforce dan DDoS pada Nginx Menggunakan Fail2ban, UFW, dan Rate Limiting

> Diterbitkan oleh Literally Web ID pada 21 Oct 2026
> Sumber: https://literally.web.id/articles/hardening-infrastructure-web-mencegah-serangan-bruteforce-dan-ddos-pada-nginx-menggunakan-fail2ban-ufw-dan-rate-limiting

---

Pernahkah kamu terbangun jam 3 pagi karena notifikasi *pager* berbunyi liar, CPU VPS melonjak hingga 100%, dan log Nginx dibanjiri ratusan ribu request per detik dari ribuan IP misterius? Sebagai seseorang yang sudah puluhan tahun mengawal infrastruktur skala besar, saya bisa bilang: selamat datang di dunia nyata pengelolaan server publik. Serangan *brute-force* SSH, botnet *scraping*, hingga lonjakan Layer 7 DDoS bukan lagi ancaman teoritis di atas kertas, melainkan gangguan harian yang wajib kita jinakkan. Hari ini, mari kita bedah bagaimana meracik benteng pertahanan Nginx menggunakan kombinasi mematikan: Fail2ban, UFW, dan Rate Limiting yang presisi.

## 1. Intisari Kilat: Fondasi dalam Sekali Lirik

Sebelum kita menyentuh terminal, mari kita pahami anatomi pertahanan host tunggal kita. Arsitektur keamanan ini berfokus pada tiga lapis pertahanan utama (Defense in Depth) yang bekerja secara simultan:

- **Lapis 1 (Network Layer - UFW):** Menyaring port akses dasar. Menutup celah yang tidak perlu, mengizinkan hanya port esensial (HTTP, HTTPS, SSH dengan port kustom), dan membatasi koneksi brute-force pada port manajemen.
- **Lapis 2 (Application/Web Server Layer - Nginx Rate Limiting):** Mengatur batasan kuota request per-IP (`limit_req_zone`) dan batasan koneksi simultan (`limit_conn_zone`). Ini menahan hantaman botnet sebelum mencapai backend PHP-FPM atau Node.js.
- **Lapis 3 (Active Response Layer - Fail2ban):** Membaca log Nginx dan SSH secara *real-time*, mendeteksi pola anomali atau kegagalan berulang, lalu secara otomatis memerintahkan UFW untuk memasukkan IP penyerang ke dalam daftar hitam (*jail*).

> [!IMPORTANT]
> Urutan eksekusi sangat penting. Pastikan konfigurasi Nginx rate limiting tidak memblokir crawler mesin pencari yang sah seperti Googlebot, atau SEO website Anda akan terjun bebas.

## 2. Kompas Keputusan: Kapan Memilih Solusi Ini vs Alternatif Lain

Sebagai arsitek, kita tidak boleh asal menerapkan *tools* hanya karena sedang tren. Mari gunakan matriks keputusan berikut sebelum mengeksekusi skrip:

- **Jika infrastruktur Anda adalah VPS tunggal (Single Host):** Kombinasi **UFW + Nginx Rate Limiting + Fail2ban** adalah pilihan paling efisien, ringan di RAM, dan tidak memerlukan biaya lisensi tambahan.
- **Jika Anda menghandle traffic enterprise lintas region dengan jutaan request per detik:** Jangan hanya mengandalkan Fail2ban di host lokal karena overhead pembacaan log akan melumpuhkan CPU. Pindahkan proteksi ke edge seperti Cloudflare WAF, lalu gunakan UFW dan Nginx hanya sebagai lapis pengaman terakhir (*fail-safe*).
- **Jika aplikasi Anda diserang bot berskala masif (Distributed Botnet):** Rate limiting berbasis IP lokal akan kewalahan jika bot menggunakan ribuan IP residential proxy. Solusinya, kombinasikan `limit_req` Nginx dengan challenge JavaScript/CAPTCHA di level CDN, atau integrasikan Fail2ban dengan modul `iptables` / `ipset` untuk memproses blokir jutaan IP tanpa memakan memori kernel.

## 3. Contekan Konfigurasi & Parameter Paling Sering Dicari

Mari langsung masuk ke konfigurasi teknis yang terbukti handal di medan perang produksi.

### A. Hardening UFW Firewall
```bash
# Reset UFW ke setelan default
sudo ufw --force reset

# Set policy default: Tolak semua akses masuk, izinkan semua keluar
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Izinkan SSH pada port kustom (misal: 2222) dan batasi percobaan brute-force
sudo ufw limit 2222/tcp

# Izinkan HTTP dan HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Aktifkan UFW
sudo ufw enable
```

### B. Konfigurasi Nginx Rate Limiting (di dalam file `nginx.conf` pada blok `http`)
```nginx
http {
    # Definisikan zona memori 10MB untuk melacak IP, batasi 10 request per detik per IP
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    
    # Definisikan zona koneksi simultan maksimal 20 koneksi per IP
    limit_conn_zone $binary_remote_addr zone=addr:10m;

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

        # Terapkan rate limiting pada endpoint login atau API sensitif
        location /api/v1/login {
            limit_req zone=one burst=5 nodelay;
            limit_conn addr 5;
            
            try_files $uri $uri/ /index.php?$query_string;
            # Konfigurasi proxy_pass atau fastcgi_pass ke backend PHP-FPM / Node.js
        }

        # Rate limiting umum untuk seluruh website
        location / {
            limit_req zone=one burst=20 nodelay;
            try_files $uri $uri/ /index.php?$query_string;
        }
    }
}
```

### C. Konfigurasi Custom Fail2ban Jail untuk Nginx
Buat file filter kustom di `/etc/fail2ban/filter.d/nginx-botsearch.local`:
```ini
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*" (403|404|444) .*$
ignoreregex = ^.*(robots.txt|favicon.ico|apple-touch-icon).*$
```

Lalu aktifkan jail tersebut di `/etc/fail2ban/jail.local`:
```ini
[nginx-badbots]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime  = 86400
banaction = ufw
```

## 4. Koleksi Mantra One-Liner Siap Salin untuk Keseharian

Simpan catatan ini di terminal Anda untuk keperluan audit kilat saat server sedang diserang:

- **Melihat 10 IP teratas yang paling banyak mengakses server saat ini:**
  ```bash
  awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
  ```
- **Mengecek status banned aktif pada Fail2ban secara real-time:**
  ```bash
  sudo fail2ban-client status nginx-badbots
  ```
- **Membuka blokir (unban) IP tertentu yang tidak sengaja terblokir:**
  ```bash
  sudo fail2ban-client set nginx-badbots unbanip 192.168.1.100
  ```
- **Memantau koneksi aktif TCP pada port 80 dan 443 secara instan:**
  ```bash
  ss -tuln | grep -E ':80|:443'
  ```

## 5. Jalur Bahaya: Dosa Besar yang Wajib Dihindari di Produksi

Sebagai penutup, mari catat jebakan batman yang sering menjatuhkan para engineer pemula maupun menengah:

> [!WARNING]
> **Jangan pernah menggunakan `banaction = iptables-multiport` tanpa memeriksa ulang aturan rantai (chain) UFW.** Fail2ban yang dikonfigurasi salah dapat menghapus seluruh aturan UFW Anda saat service direstart, membuat server terbuka telanjang ke internet.

> [!WARNING]
> **Hindari menyetel `nodelay` pada `limit_req` tanpa parameter `burst` yang proporsional.** Jika Anda melakukannya, pengguna sah yang mengklik beberapa halaman sekaligus dalam milidetik yang sama akan langsung mendapatkan halaman *Error 503 Service Temporarily Unavailable*, merusak pengalaman pengguna (*User Experience*).

Dengan fondasi UFW yang kokoh, pembatasan cerdas Nginx, dan pengawasan otomatis Fail2ban, infrastruktur web Anda kini siap menghadapi badai serangan harian di dunia maya. Tetap tenang, pantau log secara berkala, dan jadilah arsitek yang proaktif!