Fail2ban adalah alat keamanan dengan leverage tertinggi di VPS Linux — 15 menit untuk menginstal dan mengonfigurasi, dan ia diam-diam memblokir serangan brute-force sepanjang waktu tanpa intervensi manusia. Di DigitalOcean Droplet baru Commsult Indonesia dengan fail2ban berjalan, kami melacak 145 upaya SSH yang gagal dan 45 auto-ban dalam minggu pertama dari bot yang memindai internet.
Fail2ban adalah daemon yang memantau file log secara real-time menggunakan filter regex yang dapat dikonfigurasi. Ketika alamat IP memicu ambang kegagalan dalam jendela waktu (misalnya 5 login SSH yang gagal dalam 10 menit), fail2ban menambahkan aturan iptables atau nftables yang menjatuhkan semua traffic dari IP tersebut selama durasi larangan yang dapat dikonfigurasi.
Di Ubuntu/Debian: apt install fail2ban. Fail2ban dikirimkan dengan konfigurasi default di /etc/fail2ban/jail.conf — jangan pernah edit file ini secara langsung, karena pembaruan paket menimpanya. Sebagai gantinya, buat /etc/fail2ban/jail.local dengan override Anda. Jail SSH diaktifkan secara default di sebagian besar sistem.
Jail adalah kombinasi file log yang dipantau, filter (pola regex untuk mencocokkan kegagalan), dan tindakan (apa yang harus dilakukan saat ambang tercapai). Fail2ban dikirimkan dengan jail bawaan untuk SSH, Nginx, Apache, Postfix, Dovecot, dan lusinan layanan lainnya. Anda dapat menguji filter terhadap file log dengan fail2ban-regex.
┌─────────────────────────────────────────────────────┐
│ HOW FAIL2BAN WORKS │
└─────────────────────────────────────────────────────┘
Bot attempts SSH login
│
▼
/var/log/auth.log ──► fail2ban monitors in real-time
│
▼
Filter regex matches ──► Failure count for IP
"Failed password for..."
│
maxretry (3) exceeded?
│
YES │ NO
▼
iptables DROP rule added for IP
│
▼
bantime expires (1h) ──► Rule auto-removed
│
▼
Persistent offenders get escalating bans:
1h → 2h → 4h → 1 day → 1 weekDari pengalaman saya menjalankan fail2ban di server produksi Commsult Indonesia di Jakarta, tingkatkan bantime secara progresif untuk pelanggar berulang menggunakan pengaturan bantime.increment dan bantime.multiplier (tersedia di fail2ban 0.11+). Atur bantime.increment = true dan bantime.maxtime = 1w. Ini berarti pelanggaran pertama mendapat larangan 1 jam, pelanggaran kedua 2 jam, akhirnya meningkat menjadi larangan seminggu.
Di luar SSH, lindungi server Nginx Anda dengan jail fail2ban untuk kegagalan autentikasi HTTP, brute-force WordPress, dan anomali tingkat permintaan. Jail nginx-http-auth melarang IP yang gagal autentikasi HTTP basic. Jail nginx-badbots melarang user agent berbahaya yang diketahui.
Untuk API NestJS dengan autentikasi kustom, buat jail fail2ban kustom yang memantau log aplikasi Anda untuk event login yang gagal. Definisikan filter yang mencocokkan format log Anda, atur untuk dipicu setelah 5 kegagalan dalam 5 menit, dan larang selama 1 jam. Ini melindungi endpoint login API Anda dari serangan credential stuffing.
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 3
ignoreip = 127.0.0.1/8 YOUR_HOME_IP YOUR_OFFICE_IP
# Progressive banning
bantime.increment = true
bantime.multiplier = 2
bantime.maxtime = 1w
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/error.log
maxretry = 10
# Check status and manage bans
fail2ban-client status sshd
fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client set sshd banip 5.6.7.8Periksa status fail2ban: fail2ban-client status (mencantumkan semua jail aktif), fail2ban-client status sshd (menampilkan IP yang dilarang saat ini dan total larangan untuk jail SSH). Untuk membatalkan larangan IP secara manual: fail2ban-client set sshd unbanip 1.2.3.4. Periksa log fail2ban di /var/log/fail2ban.log untuk event larangan/pembatalan larangan.
Saya telah melarang IP rumah sendiri dari server produksi sebanyak dua kali — sekali saat menguji jail baru dengan pengaturan maxretry yang agresif, sekali saat sebuah skrip membuat panggilan API yang gagal berulang kali. Larangan fail2ban diterapkan segera dan diam-diam. Selalu tambahkan IP rumah, kantor, dan server CI/CD Anda ke pengaturan ignoreip di jail.local sebelum mengaktifkan jail yang agresif.
Jika situs Anda berada di belakang Cloudflare, event larangan di level fail2ban tidak efektif karena semua traffic berasal dari IP Cloudflare. Sebagai gantinya, konfigurasikan fail2ban untuk menggunakan tindakan API Cloudflare — saat larangan dipicu, fail2ban memanggil API Cloudflare untuk memblokir IP klien nyata di edge, sebelum mencapai server Anda.
Fail2ban adalah satu lapisan dalam strategi defense-in-depth, bukan solusi keamanan yang lengkap. Penyerang dapat merotasi IP di ratusan penyedia cloud dan proxy residensial, mengalahkan larangan IP tunggal. Kombinasikan fail2ban dengan: hanya autentikasi kunci SSH, firewall cloud yang membatasi SSH ke IP yang diketahui, pembaruan keamanan reguler, dan rate limiting Nginx untuk endpoint API.