Cara Install Fail2ban di Ubuntu 24.04
Panduan instalasi Fail2ban di Ubuntu 24.04 untuk blokir bot SSH. Pelajari cara cek status sshd dan solusi jika nilai Total failed tetap 0 pada fail2ban-client.
Apa yang sebenarnya dilakukan Fail2ban
Fail2ban adalah daemon pembaca log. Program ini memantau pesan autentikasi SSH Anda. Jika terjadi beberapa kegagalan dari satu alamat dalam waktu singkat, program ini menjalankan perintah firewall untuk memblokir alamat tersebut untuk sementara. Itulah fungsi utamanya. Konfigurasinya hanya sekitar tiga puluh baris dalam satu file. Pada Ubuntu 24.04, instalasinya hanya menggunakan satu perintah apt yang langsung memberikan perlindungan sebelum Anda melakukan pengeditan apa pun.
Pahami apa yang bisa dan tidak bisa dilakukan oleh program ini. Fail2ban tidak melakukan autentikasi, tidak mengenkripsi data apa pun, dan tidak menghentikan satu upaya login yang terencana — hanya upaya berulang dari sumber yang sama. Fail2ban adalah filter gangguan dan pembatas laju (rate limiter), bukan kunci pengaman. Tugasnya adalah menghentikan pemindaian latar belakang pada port 22 agar tidak membuang CPU, bandwidth, dan ruang log Anda, serta memperlambat penyerang yang harus menggunakan satu alamat dalam satu waktu.
Apa yang tidak digantikan oleh Fail2ban
Fail2ban adalah lapisan ketiga, bukan lapisan pertama. Jika server Anda masih menerima kata sandi SSH, botnet yang tersebar di ribuan alamat dapat terus melakukan tebakan. Hal ini terjadi karena setiap alamat tetap berada di bawah ambang batas pemblokiran Anda dan tidak pernah memicu pemblokiran. Pertahanan utama terhadap hal tersebut adalah autentikasi berbasis kunci (key-only authentication). Metode ini membuat tebakan kata sandi menjadi mustahil, tidak peduli berapa banyak percobaan yang dilakukan. Fail2ban yang digunakan bersama autentikasi berbasis kunci memiliki dua fungsi berguna: mengurangi kebisingan brute-force pada log Anda, dan mengusir pemindai (scanner) lebih awal agar mereka berhenti membanjiri port tersebut. Anggaplah ini sebagai pertahanan berlapis (defence in depth). Fail2ban bekerja di belakang autentikasi kunci dan di belakang firewall, bukan di depannya.
Prasyarat, dan realitas Ubuntu 24.04
Anda memerlukan VPS yang menjalankan Ubuntu 24.04 dengan akses root atau sudo, dan SSH yang sudah berfungsi — idealnya menggunakan autentikasi kunci. Fail2ban sangat hemat sumber daya: hanya membutuhkan beberapa puluh megabyte RAM, dan tidak memerlukan penyetelan limit.
Berikut adalah bagian yang sering salah pada panduan lama. Selama bertahun-tahun, saran standarnya adalah "instal Fail2ban, lalu tambahkan backend = systemd, karena Ubuntu berhenti menulis /var/log/auth.log." Saran tersebut merujuk pada perubahan nyata — citra server dan cloud modern dikirim tanpa rsyslog, sehingga log SSH hanya masuk ke systemd journal dan file teks tersebut sudah tidak ada — namun pada Ubuntu 24.04, paket Fail2ban sudah mengantisipasi hal ini. Paket tersebut menyertakan /etc/fail2ban/jail.d/defaults-debian.conf, dan file itulah, bukan default upstream, yang sebenarnya dijalankan oleh server Anda:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueBaca dengan teliti, karena ini menjawab dua pertanyaan sebelum Anda melakukan apa pun. backend = systemd berarti SSH jail membaca journal, sehingga hilangnya auth.log tidak menjadi masalah. banaction = nftables berarti pemblokiran diterapkan melalui nftables, yang merupakan firewall yang sebenarnya digunakan Ubuntu 24.04, bukan iptables lama. Dan [sshd] enabled = true berarti jail sudah aktif sejak booting pertama. Kesimpulannya: apt install fail2ban standar pada Ubuntu 24.04 sudah memblokir SSH brute-force secara otomatis. Sebagian besar tugas Anda adalah mengonfirmasi hal tersebut, menyetel kebijakan, dan memastikan Anda tidak terkunci dari sistem sendiri.
Jebakan auth.log lama masih sering terjadi dalam tiga situasi, dan penting untuk mengenalinya: Anda menginstal Fail2ban dengan pip alih-alih apt, sehingga tidak ada defaults-debian.conf; Anda berada di dalam container tanpa hak istimewa yang tidak memiliki systemd journal untuk dibaca; atau Anda mengikuti tutorial lama dan menempelkan backend = auto ke dalam jail.local Anda sendiri, sehingga menimpa default yang sudah berfungsi. Bagian mode kegagalan menunjukkan secara tepat tampilan masing-masing situasi tersebut.
Langkah 1: Instal dan konfirmasi status pemblokiran
sudo apt update
sudo apt install -y fail2banUbuntu 24.04 menyertakan Fail2ban 1.0.2, dan paket ini menarik python3-systemd sebagai dependensi wajib, sehingga backend journal memiliki semua kebutuhan yang diperlukan. Layanan ini akan mengaktifkan dan menjalankan dirinya sendiri:
sudo systemctl status fail2banAnda memerlukan active (running). Kemudian periksa jail yang sudah berjalan:
sudo fail2ban-client status sshdPada VPS publik yang sudah aktif selama beberapa menit, Anda sering kali sudah melihat kegagalan yang terhitung dan alamat yang diblokir — pemindaian internet pada port 22 berlangsung terus-menerus. Hal ini membuktikan bahwa konfigurasi standar sudah berfungsi. Dari tahap ini, Anda hanya perlu melakukan penyempurnaan, bukan membangun dari awal.
Langkah 2: Edit jail.local, jangan pernah edit jail.conf
Fail2ban menyimpan pengaturan default aslinya di /etc/fail2ban/jail.conf. Jangan mengedit file tersebut. Setiap apt upgrade dari paket dapat menggantinya, dan perubahan Anda akan hilang tanpa peringatan. Fail2ban membaca file dalam urutan tetap — jail.conf terlebih dahulu, kemudian semua file di jail.d/, lalu jail.local — dan nilai terakhir yang digunakan. File .local adalah milik Anda, dan pembaruan paket tidak akan pernah mengubahnya. Aturan yang sama berlaku untuk filter, di mana file *.local akan menimpa file filter.d/*.conf bawaan.
Jadi, buatlah jail.local kecil yang hanya menimpa beberapa pengaturan yang Anda butuhkan, dan biarkan jail.conf serta jail.d/defaults-debian.conf bawaan tetap utuh sebagai referensi.
Step 3: Tulis /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localMasukkan teks berikut, dan ubah alamat pada baris ignoreip menjadi IP publik Anda:
[DEFAULT]
# Ubuntu 24.04 already sets these two in jail.d/defaults-debian.conf.
# Pinning them here documents the dependency and survives if that
# file is ever removed or changed by an upgrade.
backend = systemd
banaction = nftables
# Ban for one hour ...
bantime = 1h
# ... if an address fails ...
maxretry = 5
# ... 5 times within 10 minutes.
findtime = 10m
# Never ban these. PUT YOUR OWN IP HERE.
ignoreip = 127.0.0.1/8 ::1 10.0.0.24
# Longer bans for repeat offenders: 1h, 2h, 4h ... up to a week.
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = trueSetiap baris memiliki fungsi spesifik:
bantime,findtime,maxretryadalah kebijakan sistem. Nilai defaultbantimehanya sepuluh menit; satu jam adalah batas minimum yang lebih masuk akal. Lima kegagalan dari satu alamat dalam sepuluh menit akan memicu pemblokiran. Pengguna asli mungkin salah mengetik kata sandi satu atau dua kali; lima kegagalan dalam sepuluh menit adalah indikasi skrip.ignoreipadalah pengaman Anda. Masukkan alamat publik tempat Anda terhubung dari sini agar Fail2ban tidak mengunci akses Anda ke server sendiri. Koneksi rumah dengan IP yang berubah-ubah adalah alasan untuk menggunakan pendekatan VPN di akhir tutorial ini, bukan alasan untuk mengabaikan baris ini.bantime.increment = truemembuat setiap pemblokiran berulang menjadi lebih lama dari sebelumnya — satu jam, lalu dua jam, lalu empat jam — hinggabantime.maxtime. Alamat yang terus mencoba masuk akan diblokir secara bertahap.
Cari alamat yang akan dimasukkan ke daftar putih (whitelist) dari mesin tempat Anda melakukan SSH, bukan dari server:
curl -s ifconfig.meAnda dapat membuat jail.local yang disesuaikan dengan port dan kebijakan pemblokiran Anda di sini, lalu tempelkan ke dalam file:
Step 4: Restart and verify it is reading the journal
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t menjalankan uji konfigurasi terlebih dahulu. Kesalahan pengetikan pada jail.local akan menyebabkan kegagalan di sini daripada membiarkan layanan mati tanpa peringatan. Status jail yang normal terlihat seperti ini:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 14
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 10.0.0.66Angka yang membuktikan Fail2ban benar-benar membaca login Anda adalah Total failed. Jika angka tersebut di atas nol, atau meningkat saat Anda sengaja gagal login dari mesin lain, maka journal berhasil dibaca dan proses selesai. Jika angka tetap di 0 tidak peduli berapa kali Anda gagal login — dan Anda yakin tidak sedang melakukan pengujian dari alamat di ignoreip — lihat bagian mode kegagalan di bawah.
Perhatikan baris Journal matches masih menyebutkan sshd.service. Pada Ubuntu, unit SSH sebenarnya adalah ssh.service, tetapi filter yang tersedia juga mencocokkan _COMM=sshd. OpenSSH pada 24.04 mencatat kegagalan dari proses bernama sshd, sehingga pencocokan tetap berhasil. Detail tersebut hanya relevan jika Anda menggunakan OpenSSH versi terbaru (9.8 atau lebih baru, di mana per-connection worker adalah sshd-session); mode kegagalan telah mencakup kasus tersebut.
Step 5: Pantau pemblokiran nyata, atau paksa pemblokiran untuk pengujian
Pemblokiran nyata akan terjadi secara otomatis dalam hitungan menit pada VPS publik apa pun. Untuk memantaunya, gunakan perintah tail pada log:
sudo tail -f /var/log/fail2ban.logTampilan pemblokiran adalah sebagai berikut:
2026-07-15 10:31:40,502 fail2ban.filter [812]: INFO [sshd] Found 10.0.0.66 - 2026-07-15 10:31:40
2026-07-15 10:31:44,118 fail2ban.actions [812]: NOTICE [sshd] Ban 10.0.0.66Untuk menguji seluruh sistem tanpa menunggu, blokir alamat dokumentasi secara manual — jangan pernah menggunakan alamat Anda sendiri:
sudo fail2ban-client set sshd banip 10.0.0.66Sistem akan mencetak 1, dan alamat tersebut muncul di bawah Banned IP list dalam fail2ban-client status sshd. Sekarang konfirmasikan bahwa pemblokiran benar-benar ada di firewall. Pada Ubuntu 24.04, yang digunakan adalah nftables, bukan iptables:
sudo nft list table inet f2b-tableAnda akan melihat set bernama addr-set-sshd yang berisi 10.0.0.66, dan chain f2b-chain yang menolak setiap sumber dalam set tersebut. Jika fail2ban-client menyatakan sebuah alamat diblokir tetapi tidak ada yang muncul di nft list, tindakan pemblokiran Anda tidak sesuai dengan firewall — lihat catatan nftables/iptables pada bagian kegagalan sistem.
Step 6: Unban yourself, and recover if you are locked out
Jika Anda memblokir alamat yang tidak seharusnya diblokir — yaitu alamat Anda sendiri — hapus blokir tersebut:
sudo fail2ban-client set sshd unbanip 10.0.0.66Perintah ini mengembalikan 1 jika berhasil. Untuk menghapus semua blokir di setiap jail:
sudo fail2ban-client unban --allJangan mengandalkan sesi SSH yang sedang terbuka untuk menyelamatkan Anda: blokir nftables menolak setiap paket dari alamat yang diblokir ke port 22 — termasuk koneksi yang sudah terbentuk — sehingga sesi yang ada akan membeku saat blokir diterapkan. Jika Anda memblokir diri sendiri dan tidak memiliki entri ignoreip, Anda akan terkunci hingga masa blokir berakhir — lakukan pemulihan melalui konsol web penyedia layanan Anda (VNC atau serial), yang tidak menggunakan SSH, lalu tunggu hingga bantime berakhir atau jalankan perintah unban di sana.
Step 7: Membuat ban bersifat persisten dan meningkat
Fail2ban menyimpan ban aktif dalam database SQLite kecil di /var/lib/fail2ban/fail2ban.sqlite3, sehingga ban tetap ada setelah layanan dimulai ulang atau sistem di-reboot; data tidak akan hilang. Baris bantime.increment yang telah Anda tambahkan akan membuat setiap pelanggar berulang mengalami peningkatan durasi ban — meningkat sekitar dua kali lipat dari satu jam hingga satu minggu.
Untuk kebijakan "three strikes" di seluruh sistem, Fail2ban menyediakan jail recidive yang memantau /var/log/fail2ban.log miliknya sendiri dan memberikan ban durasi lama kepada alamat yang telah diblokir berulang kali di semua jail. Karena [DEFAULT] Anda sekarang menggunakan backend systemd, arahkan kembali jail ini ke file log yang seharusnya dibaca:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5backend = auto dengan logpath eksplisit menjaga recidive tetap membaca fail2ban.log biasa, tempat baris Ban yang dihitung sebenarnya muncul — pengaturan default systemd yang Anda tetapkan secara global akan mengarahkannya ke journal, di mana baris tersebut tidak ada.
Step 8: Pasangkan dengan SSH berbasis kunci saja, atau lebih baik lagi dengan VPN
Fail2ban hanya bekerja optimal jika menggunakan autentikasi kunci. Di dalam file konfigurasi di /etc/ssh/sshd_config.d/ — misalnya /etc/ssh/sshd_config.d/00-hardening.conf — atur:
PasswordAuthentication no
KbdInteractiveAuthentication noKemudian sudo systemctl restart ssh. Dengan menonaktifkan kata sandi, serangan brute force tidak akan berhasil sama sekali; Fail2ban kemudian berfungsi untuk mengurangi kebisingan log dan mengusir pemindai lebih awal. Lebih aman lagi jika Anda mematikan SSH dari internet publik sepenuhnya: letakkan SSH di balik WireGuard VPN yang dihosting sendiri dan gunakan firewall pada port 22 agar hanya merespons melalui tunnel. Tidak ada yang bisa melakukan brute-force pada port yang tidak dapat mereka jangkau, sehingga Fail2ban menjadi pertahanan cadangan, bukan pertahanan utama.
Fail2ban tidak hanya untuk SSH. Setiap layanan yang mencatat kegagalan login dapat menggunakan jail — seperti server email, situs nginx, atau password manager Vaultwarden yang dihosting sendiri yang login webnya tidak ingin Anda biarkan terbuka terhadap serangan credential stuffing. Setelah aplikasi web berada di balik situs nginx dengan sertifikat Let's Encrypt, arahkan filter Fail2ban ke log aksesnya dengan cara yang sama seperti jail SSH mengarah ke journal.
Mode kegagalan, dengan string persis yang akan Anda lihat
"Have not found any log file for sshd jail", dan Fail2ban tidak akan berjalan. Ini adalah masalah auth.log lama, dan pada Ubuntu 24.04 Anda hanya mengalaminya jika ada sesuatu yang menimpa default paket — instalasi pip tanpa defaults-debian.conf, kontainer tanpa journal, atau backend = auto nyasar yang Anda tempel ke jail.local. Pada backend file tanpa /var/log/auth.log, sshd jail tidak dapat menemukan log dan seluruh daemon berhenti. fail2ban.log menunjukkan:
ERROR Failed during configuration: Have not found any log file for sshd jailKarena error tersebut bersifat fatal, layanan tidak pernah berjalan, dan fail2ban-client status kemudian melaporkan gejala turunannya:
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?Baris "socket path" tersebut tidak berarti Fail2ban rusak — itu berarti ia tidak pernah berjalan karena satu jail tidak dapat menemukan lognya. Mengatur backend = systemd di [DEFAULT], yang sudah dilakukan oleh paket Ubuntu untuk Anda, memperbaiki kedua pesan tersebut sekaligus.
Jail aktif tetapi Total failed tidak pernah bergerak. Daemon sedang berjalan dan journal sedang dibaca, namun kegagalan nyata menumpuk di journalctl -u ssh sementara penghitung tetap di 0. Pertama, singkirkan hal yang jelas: Anda sedang melakukan pengujian dari alamat yang terdaftar di ignoreip, sehingga kegagalan Anda sendiri dikecualikan secara desain. Jika bukan itu penyebabnya, Anda menggunakan build OpenSSH di mana worker per-koneksi adalah sshd-session (9.8 dan versi setelahnya), yang journal _COMM adalah sshd-session, bukan sshd, sehingga pencocokan bawaan melewatkannya. Perluas pencocokan pada blok [sshd]:
[sshd]
enabled = true
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-sessionRestart, lakukan kegagalan login dengan sengaja dari alamat yang tidak ada di ignoreip, dan konfirmasi Total failed akhirnya naik.
Anda memblokir diri sendiri: Connection refused. Anda tidak memasukkan alamat Anda sendiri ke dalam ignoreip, mencoba beberapa login yang salah, dan sekarang:
ssh: connect to host 10.0.0.10 port 22: Connection refusedPenolakan tersebut, alih-alih timeout yang senyap, adalah verdict reject default dari aksi nftables yang sedang bekerja — terhadap Anda. Perbaiki seperti pada Langkah 6: buka blokir dari sesi pada alamat lain yang tidak diblokir, atau dari konsol penyedia — sesi yang sudah terbuka dari alamat yang diblokir juga akan membeku. Kemudian tambahkan alamat Anda ke ignoreip agar hal ini tidak terjadi lagi.
Fail2ban mengatakan sebuah alamat diblokir, tetapi masih bisa terhubung. Penghitung di status sshd naik, namun alamat tersebut masih dapat menjangkau port 22. Ini adalah ketidakcocokan antara ban-action-versus-firewall, dan pada Ubuntu 24.04 ini hampir selalu berarti Anda menimpa banaction = nftables yang berfungsi dengan banaction = iptables-multiport yang disalin dari panduan lama, pada sistem tanpa lapisan iptables. fail2ban.log menunjukkan:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'Hapus penimpaan tersebut dan biarkan aksi nftables bawaan paket tetap ada, atau, jika Anda mengelola firewall sepenuhnya melalui ufw dan ingin blokir muncul di sana, atur banaction = ufw di [DEFAULT]. Restart dan konfirmasi aturan muncul dengan sudo nft list ruleset | grep f2b.
Fail2ban tidak akan berjalan setelah mengedit jail.local. Kesalahan pengetikan — heading nyasar atau nilai waktu yang salah — membuat layanan menolak untuk berjalan. Minta Fail2ban untuk memeriksa konfigurasi sebelum dijalankan:
sudo fail2ban-client -tIa akan menyebutkan file dan jail yang bermasalah, misalnya Errors in jail 'sshd'. Skipping..., sehingga Anda dapat memperbaiki sumbernya alih-alih menebak-nebak.
FAQ
Apakah instalasi Fail2ban bawaan di Ubuntu 24.04 benar-benar memblokir serangan SSH?
Ya. Paket ini menyertakan /etc/fail2ban/jail.d/defaults-debian.conf, yang mengaktifkan jail sshd, mengatur backend = systemd agar membaca systemd journal alih-alih /var/log/auth.log yang tidak ada, dan mengatur banaction = nftables agar pemblokiran diterapkan melalui firewall asli Ubuntu. Konfigurasi apt install fail2ban standar melindungi SSH sejak booting pertama. Verifikasi dengan sudo fail2ban-client status sshd dan periksa nilai Total failed yang bukan nol.
Mengapa Fail2ban tidak memblokir apa pun di server saya?
Periksa tiga penyebab umum berikut secara berurutan. Anda mungkin melakukan pengujian dari alamat di ignoreip, yang memang dikecualikan secara desain. Anda mungkin telah menimpa pengaturan default yang berfungsi dengan menempelkan backend = auto ke dalam jail.local dari panduan lama, yang merusak pembacaan journal pada image tanpa auth.log. Atau Anda mungkin berada di dalam container yang tidak memiliki systemd journal untuk dibaca. Periksa Total failed di fail2ban-client status sshd: jika nilainya tidak pernah naik sementara journalctl -u ssh menunjukkan kegagalan nyata, maka jail membaca lokasi yang salah.
Bagaimana cara membuka blokir alamat IP saya sendiri?
Jalankan sudo fail2ban-client set sshd unbanip YOUR.IP.HERE, yang akan mengembalikan 1 jika berhasil, atau sudo fail2ban-client unban --all untuk menghapus semua blokir. Jika Anda terkunci dari SSH, gunakan konsol web atau VNC dari penyedia layanan Anda untuk menjalankan perintah yang sama — pemblokiran menolak setiap paket dari alamat Anda ke port 22, sehingga sesi yang sudah terbuka pun akan berhenti berfungsi. Kemudian tambahkan alamat Anda ke ignoreip agar hal ini tidak terulang.
Apa perbedaan antara jail.conf dan jail.local?
jail.conf berisi pengaturan default upstream Fail2ban dan akan ditimpa pada setiap pembaruan paket, sehingga setiap perubahan di sana akan hilang. Paket Debian/Ubuntu menerapkan pengaturannya sendiri melalui jail.d/defaults-debian.conf. Perubahan Anda harus dilakukan di jail.local, yang dibaca terakhir dan mengungguli keduanya, serta tidak akan disentuh saat pembaruan. Biarkan jail.conf sebagai referensi baca saja.
Apakah Fail2ban menggantikan autentikasi SSH berbasis kunci?
Tidak. Fail2ban membatasi laju kegagalan berulang dari satu alamat; ia tidak berpengaruh terhadap serangan tebak kata sandi yang lambat dan terdistribusi di mana setiap alamat tetap berada di bawah ambang batas. Autentikasi kunci saja (PasswordAuthentication no) membuat tebak kata sandi mustahil dilakukan, sementara Fail2ban berfungsi mengurangi kebisingan log dan mengusir pemindai lebih awal. Gunakan keduanya, dan idealnya jangan biarkan SSH terbuka di internet publik sama sekali.