Panduan Lengkap Fail2ban: Lindungi SSH dari Brute Force di Ubuntu 24.04 (2026)

Tutorial praktis konfigurasi Fail2ban di Ubuntu 24.04 dan Debian 12 untuk memblokir brute force SSH — jail.local siap pakai, jail recidive, integrasi nftables, monitoring, dan troubleshooting umum di tahun 2026.

Fail2ban Ubuntu 24.04: Anti Brute Force 2026

Jujur saja, kalau Anda baru pertama kali menyewa VPS, ada satu pengalaman yang hampir mustahil dihindari: dalam beberapa menit setelah server menyala, auth.log sudah penuh oleh ratusan percobaan login dari IP yang entah dari mana. Itu bukan paranoia — itu kenyataan. Serangan brute force SSH tetap menjadi vektor serangan paling umum terhadap server Linux publik di tahun 2026, dan sayangnya, mereka tidak akan berhenti.

Di sinilah Fail2ban masuk. Anggap saja sebagai bouncer otomatis untuk server Anda: dia memantau log, mengenali pola kegagalan, lalu menyuruh firewall untuk menendang IP nakal. Sederhana, ringan, dan luar biasa efektif.

Panduan ini membahas konfigurasi Fail2ban yang siap-produksi di Ubuntu 24.04 LTS dan Debian 12 — lengkap dengan integrasi nftables, jail recidive untuk pelanggar berulang, ban yang meningkat secara progresif (bantime.increment), serta tips monitoring dan troubleshooting dari pengalaman lapangan. Kita akan mulai dari nol, jadi tidak perlu khawatir kalau Anda belum pernah menyentuhnya sama sekali.

Apa Itu Fail2ban dan Bagaimana Cara Kerjanya

Singkatnya, Fail2ban adalah intrusion prevention framework berbasis Python. Dia membaca file log (atau jurnal systemd), mencocokkan baris log dengan filter regex, lalu menjalankan action — biasanya menambahkan aturan firewall — saat ambang batas kegagalan terlampaui dalam jendela waktu tertentu. Itu saja konsep intinya.

Ada tiga komponen yang perlu Anda kenali:

  • Filter: pola regex di /etc/fail2ban/filter.d/ yang mengenali entri log mencurigakan (misalnya sshd.conf).
  • Jail: kombinasi filter + log path + parameter maxretry, findtime, bantime, dan action.
  • Action: skrip di /etc/fail2ban/action.d/ yang memanipulasi firewall (iptables, nftables, ufw) atau mengirim notifikasi.

Di Ubuntu 24.04 dan Debian 12, Fail2ban versi 1.0.2+ memakai backend = systemd sebagai default. Artinya, dia membaca jurnal langsung lewat journalctl alih-alih polling file — jauh lebih hemat I/O, terutama di server bertrafik tinggi.

Prasyarat

  • Server Ubuntu 24.04 LTS atau Debian 12 dengan akses sudo.
  • SSH yang berjalan (port default 22 atau yang sudah Anda kustomisasi).
  • Firewall berbasis nftables (default di Debian 12 dan Ubuntu 24.04) atau iptables-nft.
  • IP statis administrator yang akan di-whitelist — ini krusial, kecuali Anda mau mengalami "self-ban" yang memalukan (lebih sering terjadi daripada yang Anda kira).

Langkah 1: Instalasi Fail2ban

Fail2ban tersedia di repository resmi, jadi instalasinya tidak macam-macam. Pastikan paket sistem mutakhir dulu:

sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
systemctl status fail2ban --no-pager

Verifikasi versi yang terpasang:

fail2ban-server --version
# Fail2Ban v1.0.2 (atau lebih baru)

Langkah 2: Buat jail.local — Jangan Pernah Edit jail.conf

Ini aturan emas yang sering diabaikan pemula: /etc/fail2ban/jail.conf akan ditimpa setiap kali paket di-upgrade. Saya pernah melihat konfigurasi tim yang hilang total setelah apt upgrade tahunan — dan ya, tidak menyenangkan. Praktik baku 2026 adalah menyimpan seluruh kustomisasi di jail.local (atau snippet di /etc/fail2ban/jail.d/):

sudo install -m 0644 /dev/null /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Isi dengan konfigurasi minimum berikut — hanya parameter yang Anda override, bukan menyalin seluruh jail.conf:

[DEFAULT]
# IP yang TIDAK PERNAH diblokir (ganti dengan IP statis Anda)
ignoreip = 127.0.0.1/8 ::1 203.0.113.42

# Parameter dasar
bantime  = 1h
findtime = 10m
maxretry = 5

# Ban bertingkat: pelanggar berulang dapat hukuman lebih lama
bantime.increment   = true
bantime.factor      = 2
bantime.maxtime     = 7d
bantime.rndtime     = 5m

# Gunakan jurnal systemd (default Ubuntu 24.04 / Debian 12)
backend   = systemd

# Aksi firewall: nftables-multiport (modern), bukan iptables
banaction = nftables-multiport
banaction_allports = nftables-allports

# Notifikasi email (opsional)
destemail = [email protected]
sender    = [email protected]
mta       = sendmail
action    = %(action_mwl)s

Penjelasan Parameter Kritis

  • bantime = 1h: lebih lama dari default 10 menit. Cukup untuk mengusir bot otomatis tanpa membahayakan pengguna sah yang sekadar salah ketik password.
  • findtime = 10m dengan maxretry = 5: lima kegagalan dalam 10 menit memicu ban.
  • bantime.increment = true: setiap kali IP yang sama balik lagi, durasi ban dikalikan bantime.factor hingga maksimum bantime.maxtime (7 hari). Bot persisten akhirnya menyerah sendiri.
  • backend = systemd: lebih hemat memori, dan tidak perlu otak-atik permission /var/log/auth.log.
  • banaction = nftables-multiport: mengelola tabel f2b-table di nftables, jauh lebih cepat dari iptables-legacy.

Langkah 3: Aktifkan Jail SSH

Tambahkan blok [sshd] di akhir jail.local. Kalau port SSH sudah Anda ganti (misalnya 2222), sesuaikan port:

[sshd]
enabled  = true
port     = ssh
filter   = sshd
mode     = aggressive
maxretry = 3
findtime = 5m
bantime  = 1d
# logpath tidak diperlukan jika backend=systemd

Mode aggressive mendeteksi pola yang lebih luas — termasuk "Did not receive identification string", "Bad protocol version", dan probing scanner otomatis seperti masscan. Mode default? Hanya menangkap kegagalan password saja. Sayang sekali.

Pastikan SSH Mencatat Detail yang Cukup

Buka /etc/ssh/sshd_config dan pastikan baris berikut tidak dikomentari:

LogLevel VERBOSE

Tanpa VERBOSE, sebagian kegagalan autentikasi (terutama public-key) tidak akan tercatat, dan filter Fail2ban tidak akan terpicu. Restart SSH setelah mengubahnya:

sudo systemctl restart ssh

Langkah 4: Tambahkan Jail recidive untuk Penyerang Persisten

Nah, ini bagian favorit saya. Jail recidive memantau log Fail2ban itu sendiri, lalu memberikan hukuman jangka panjang kepada IP yang sudah diban beberapa kali. Lapisan kedua yang luar biasa efektif terhadap botnet:

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
filter   = recidive
maxretry = 3
findtime = 1d
bantime  = 4w
banaction = nftables-allports

Artinya begini: kalau IP sudah diban 3 kali dalam 24 jam, dia diblokir di seluruh port selama 4 minggu. Cocok untuk botnet yang suka berpindah-pindah antar layanan.

Langkah 5: Restart dan Verifikasi

sudo systemctl restart fail2ban
sudo fail2ban-client status

Output yang sehat menampilkan daftar jail aktif:

Status
|- Number of jail:      2
`- Jail list:   recidive, sshd

Periksa jail SSH secara spesifik:

sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     127
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 4
   |- Total banned:     19
   `- Banned IP list:   45.143.x.x 185.93.x.x 162.243.x.x 5.181.x.x

Langkah 6: Verifikasi Aturan nftables

Fail2ban membuat tabel terisolasi sehingga tidak bentrok dengan firewall utama Anda — desain yang elegan, kalau Anda tanya saya:

sudo nft list table inet f2b-table
table inet f2b-table {
    set addr-set-sshd {
        type ipv4_addr
        elements = { 45.143.x.x, 185.93.x.x, 162.243.x.x }
    }
    chain f2b-chain {
        type filter hook input priority -1; policy accept;
        tcp dport { 22 } ip saddr @addr-set-sshd reject
    }
}

Pengujian: Simulasikan Brute Force dari Host Lain

Dari mesin client yang bukan ada di ignoreip, jalankan koneksi yang gagal beberapa kali:

for i in 1 2 3 4; do
  ssh -o PreferredAuthentications=password \
      -o PubkeyAuthentication=no \
      [email protected]
done

Pada percobaan ke-3 (sesuai maxretry = 3), koneksi akan ditolak oleh nftables sebelum bahkan sampai ke sshd. Cek log untuk memastikan:

sudo tail -f /var/log/fail2ban.log
# 2026-05-14 09:14:22,331 fail2ban.actions [834]: NOTICE  [sshd] Ban 198.51.100.77

Operasi Sehari-hari

Membuka Blokir IP yang Salah Ban

sudo fail2ban-client set sshd unbanip 198.51.100.77
sudo fail2ban-client unban --all          # cabut semua ban (gunakan hati-hati)

Menambahkan IP ke Whitelist Permanen

sudo fail2ban-client set sshd addignoreip 198.51.100.0/24

Statistik Cepat

# Total ban hari ini
sudo grep "Ban" /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)" | wc -l

# 10 IP paling sering menyerang
sudo zgrep -h "Ban" /var/log/fail2ban.log* \
  | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10

# Geo-lookup IP penyerang (butuh geoiplookup)
sudo apt install -y geoip-bin
sudo fail2ban-client banned | tr -d "[],'" | xargs -n1 geoiplookup

Hardening Tambahan yang Wajib Dipasangkan

Ini bagian yang sering saya tekankan ke teman-teman yang baru terjun ke admin Linux: Fail2ban itu satu lapisan, bukan solusi tunggal. Kombinasikan dengan kontrol berikut supaya pertahanan Anda benar-benar berlapis:

  1. Nonaktifkan autentikasi password. Di /etc/ssh/sshd_config: PasswordAuthentication no dan PubkeyAuthentication yes. Tanpa target password, brute force jadi sia-sia.
  2. Larang login root via SSH: PermitRootLogin no.
  3. Pindahkan port SSH ke nomor non-standar (misalnya 2222). Ini bukan obscurity sebagai keamanan — tapi setidaknya mengurangi 90% noise log, dan itu lumayan banget.
  4. Aktifkan 2FA via libpam-google-authenticator untuk akun sensitif.
  5. Default-deny firewall: pastikan nftables menolak semua port masuk kecuali yang eksplisit diizinkan.
  6. Unattended upgrades: sudo apt install unattended-upgrades supaya patch keamanan SSH otomatis terpasang. Lupakan ini, dan suatu hari Anda akan menyesal.

Troubleshooting Masalah Umum

1. Fail2ban Tidak Memblokir Apa Pun

Test regex filter terhadap log aktual:

sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/sshd.conf

Kalau hasilnya Matched lines: 0, kemungkinan besar LogLevel di sshd_config belum VERBOSE, atau jail menunjuk ke logpath yang salah. Kira-kira 80% kasus support Fail2ban di forum publik disebabkan dua hal ini.

2. Saya Terblokir Sendiri

Tenang, ini umum. Akses server lewat konsol VPS (web console DigitalOcean/Linode/Hetzner) dan jalankan:

sudo fail2ban-client unban --all
sudo nft flush table inet f2b-table

Setelah itu, tambahkan IP statis Anda ke ignoreip sebelum me-restart Fail2ban. Pelajaran mahal yang tidak perlu Anda alami dua kali.

3. Konsumsi Memori Tinggi

Pastikan backend = systemd di [DEFAULT]. Backend polling file membutuhkan jauh lebih banyak RAM di server bertrafik tinggi.

4. Konflik dengan UFW atau Docker

Docker menyisipkan aturannya sendiri di chain DOCKER-USER yang bisa melewati Fail2ban. Gunakan banaction = nftables-allports, atau atur prioritas chain secara manual. Menambahkan jaringan Docker ke ignoreip sangat tidak disarankan — lebih baik pakai firewalld atau nftables native.

Perbandingan dengan Alternatif Modern (2026)

ToolPendekatanKelebihanKekurangan
Fail2banLog-based, localRingan, matang, sederhanaReaktif; bot baru tidak diketahui
CrowdSecBehavior + threat intel komunitasBlocklist global, scenario fleksibelLebih kompleks, butuh agen
sshguardLog-based, ringanFootprint kecil, C nativeKurang fleksibel dari Fail2ban

Banyak admin tahun 2026 menjalankan Fail2ban dan CrowdSec berdampingan: Fail2ban menangani SSH lokal, sementara CrowdSec memberi community blocklist proaktif. Kombinasi yang, menurut saya pribadi, sweet spot antara kesederhanaan dan kecerdasan.

FAQ — Pertanyaan yang Sering Diajukan

Apakah Fail2ban cukup untuk mengamankan SSH server saya?

Tidak. Fail2ban hanyalah satu lapis. Anda tetap perlu menonaktifkan password authentication, memakai SSH key, melarang root login, dan mengupdate sistem secara rutin. Fail2ban mengurangi noise dan memperlambat penyerang — bukan menggantikan kontrol akses yang benar.

Berapa nilai bantime dan maxretry yang ideal?

Untuk server produksi dengan akses publik, baseline yang direkomendasikan 2026 adalah maxretry=3 dan bantime=1h dengan bantime.increment=true. Untuk lingkungan dengan banyak pengguna manusia (misalnya gateway VPN kantor), naikkan maxretry ke 5 dan findtime ke 30m supaya tidak menghukum salah-ketik wajar.

Apakah Fail2ban bekerja dengan IPv6?

Ya, sejak versi 0.10. Pastikan banaction Anda menggunakan varian yang mendukung dual-stack seperti nftables-multiport (default di Ubuntu 24.04). Whitelist juga mendukung notasi ::1 dan prefix IPv6.

Bagaimana cara Fail2ban berinteraksi dengan firewall ufw?

Fail2ban menyisipkan aturan sebelum chain ufw diproses, jadi ban tetap efektif meski Anda memakai UFW. Tapi untuk konsistensi, sebagian besar admin sekarang beralih langsung ke nftables dengan banaction = nftables-multiport.

Mengapa IP yang sudah diban masih bisa probing port lain?

Karena jail sshd default hanya memblokir port SSH. Untuk memblokir penyerang di seluruh port, gunakan banaction = nftables-allports di jail recidive — itulah inti tujuan recidive jail.

Kesimpulan

Konfigurasi Fail2ban yang baik di Ubuntu 24.04 atau Debian 12 sebenarnya selesai dalam 15 menit, dan langsung memangkas 95%+ noise brute force di auth.log Anda. Tiga kunci yang paling sering dilewatkan: (1) selalu pakai jail.local, bukan jail.conf; (2) aktifkan jail recidive untuk pelanggar berulang; dan (3) kombinasikan dengan SSH key authentication plus firewall default-deny. Setelah itu, cukup monitor /var/log/fail2ban.log sekali seminggu dan update ignoreip ketika IP administrator Anda berubah. Selamat — server SSH Anda kini jauh lebih tenang.

Tentang Penulis Editorial Team

Our team of expert writers and editors.