Instal Fail2ban di Ubuntu 24.04 untuk Blokir Bot SSH
Di Ubuntu 24.04, perintah apt install biasa sudah memblokir brute force SSH. Verifikasi dengan fail2ban-client status sshd dan atasi Total failed tetap 0.
Apa yang sebenarnya dilakukan Fail2ban
Fail2ban adalah daemon yang membaca log. Fail2ban memantau pesan autentikasi SSH Anda. Setelah mendeteksi beberapa kegagalan dari satu alamat dalam jangka waktu singkat, Fail2ban menjalankan perintah firewall yang memblokir alamat tersebut selama beberapa waktu. Itulah seluruh konsepnya. Konfigurasinya hanya sekitar tiga puluh baris dalam satu file. Di Ubuntu 24.04, instalasinya hanya memerlukan satu perintah apt dan sistem Anda sudah terlindungi sebelum Anda mengubah konfigurasi apa pun.
Pahami fungsi dan batasannya. Fail2ban tidak mengautentikasi siapa pun, tidak mengenkripsi apa pun, dan tidak menghentikan satu upaya login yang dilakukan secara terarah. Fail2ban hanya menghentikan upaya berulang dari sumber yang sama. Fail2ban adalah penyaring gangguan dan pembatas laju, bukan pengunci. Tugasnya adalah menghentikan pemindaian latar belakang yang terus-menerus pada port 22 agar tidak terus membebani CPU, bandwidth, dan ruang log Anda, serta memperlambat penyerang yang harus datang dari satu alamat setiap kali.
Hal 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 mencoba, karena setiap alamat tetap berada di bawah ambang batas pemblokiran dan tidak pernah memicunya. Pertahanan yang tepat terhadap hal itu adalah autentikasi yang hanya menggunakan kunci, sehingga upaya menebak kata sandi menjadi mustahil, berapa pun jumlah percobaan yang dilakukan. Fail2ban yang diterapkan di atas autentikasi berbasis kunci memiliki dua manfaat: mengurangi derau brute force dari log Anda dan mengeluarkan pemindai sejak awal agar berhenti membombardir port. Perlakukan ini sebagai pertahanan berlapis. Fail2ban berada di belakang autentikasi berbasis kunci dan firewall, bukan di depan keduanya.
Prasyarat dan kondisi Ubuntu 24.04
Anda memerlukan VPS yang menjalankan Ubuntu 24.04 dengan akses root atau sudo, serta SSH yang sudah berfungsi, idealnya menggunakan autentikasi berbasis key. Fail2ban hemat sumber daya: hanya memerlukan beberapa puluh megabyte RAM dan tidak memerlukan penyesuaian batas.
Sekarang, bagian yang sering keliru dalam panduan lama. Selama bertahun-tahun, saran standarnya adalah "instal Fail2ban, lalu tambahkan backend = systemd, karena Ubuntu berhenti menulis /var/log/auth.log." Saran tersebut menjelaskan perubahan yang memang terjadi. Image server dan cloud modern disediakan tanpa rsyslog, sehingga log SSH hanya ditulis ke journal systemd dan file teks tersebut tidak ada. Namun, pada Ubuntu 24.04, paket Fail2ban sudah menangani kondisi ini. Paket tersebut memasang /etc/fail2ban/jail.d/defaults-debian.conf, dan file itu, bukan konfigurasi default upstream, yang benar-benar dijalankan server Anda:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueBaca bagian ini dengan saksama karena bagian ini menjawab dua pertanyaan sebelum Anda mengubah apa pun. backend = systemd berarti jail SSH membaca journal, sehingga tidak adanya auth.log tidak menjadi masalah. banaction = nftables berarti pemblokiran diterapkan melalui nftables, yaitu firewall yang benar-benar digunakan Ubuntu 24.04, bukan iptables lama. Selain itu, [sshd] enabled = true berarti jail aktif sejak boot pertama. Kesimpulannya: apt install fail2ban bawaan pada Ubuntu 24.04 memblokir brute-force SSH secara langsung. Sebagian besar pekerjaan Anda adalah memastikan hal tersebut, menyesuaikan kebijakan, dan memastikan Anda tidak mengunci akses Anda sendiri.
Masalah lama auth.log masih muncul dalam tiga situasi, dan Anda perlu mengenalinya: Anda menginstal Fail2ban dengan pip, bukan apt, sehingga tidak ada defaults-debian.conf; Anda berada di dalam container tanpa hak istimewa yang tidak memiliki journal systemd untuk dibaca; atau Anda mengikuti tutorial lama dan menempelkan backend = auto ke dalam jail.local milik Anda sendiri, sehingga konfigurasi default yang berfungsi tertimpa. Bagian tentang mode kegagalan menjelaskan tampilan masing-masing kondisi tersebut.
Langkah 1: Instal dan pastikan pemblokiran sudah berjalan
sudo apt update
sudo apt install -y fail2banUbuntu 24.04 menyediakan Fail2ban 1.0.2, dan paket tersebut menarik python3-systemd sebagai dependensi wajib. Karena itu, backend journal memiliki semua yang diperlukan. Layanan mengaktifkan dan memulai dirinya sendiri:
sudo systemctl status fail2banAnda ingin melihat active (running). Selanjutnya, lihat jail yang sudah menjalankan tugasnya:
sudo fail2ban-client status sshdPada VPS publik yang telah dapat diakses selama beberapa menit, Anda sering sudah dapat melihat kegagalan yang dihitung dan alamat yang diblokir. Internet terus-menerus memindai port 22. Ini membuktikan bahwa konfigurasi bawaan berfungsi. Mulai dari sini, Anda hanya menyempurnakannya, bukan membangunnya dari awal.
Langkah 2: Edit jail.local, jangan jail.conf
Fail2ban menyimpan default upstream di /etc/fail2ban/jail.conf. Jangan edit 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 dibaca akan berlaku. File .local adalah milik Anda, dan upgrade paket tidak pernah mengubahnya. Aturan yang sama berlaku untuk filter. File *.local akan menggantikan filter.d/*.conf yang disertakan dalam paket.
Karena itu, buat jail.local kecil yang hanya mengganti beberapa pengaturan yang diperlukan, lalu biarkan jail.conf dan jail.d/defaults-debian.conf yang disertakan dalam paket tetap utuh sebagai referensi.
Langkah 3: Tulis /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localMasukkan konfigurasi berikut. Ubah alamat pada baris ignoreip menjadi alamat IP publik Anda sendiri:
[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:
bantime,findtime, danmaxretryadalah kebijakan pemblokiran. Nilai bawaan yang disertakan,bantime, hanya sepuluh menit; satu jam merupakan batas minimum yang lebih wajar. Lima kegagalan dari satu alamat dalam sepuluh menit akan menyebabkan pemblokiran. Pengguna biasanya salah mengetik kata sandi satu atau dua kali; lima kegagalan dalam sepuluh menit menunjukkan adanya skrip.ignoreipadalah pengaman Anda. Masukkan alamat publik yang Anda gunakan untuk terhubung from di sini agar Fail2ban tidak pernah mengunci akses Anda ke server sendiri. Koneksi rumah dengan IP yang berubah-ubah merupakan alasan untuk memilih pendekatan VPN di bagian akhir, bukan alasan untuk melewati baris ini.bantime.increment = truemembuat setiap pemblokiran berulang berlangsung lebih lama daripada sebelumnya: satu jam, lalu dua jam, kemudian empat jam, hinggabantime.maxtime. Alamat yang terus mencoba kembali akan dikunci secara bertahap.
Cari alamat yang akan diizinkan dari mesin yang Anda gunakan untuk SSH from, bukan dari server:
curl -s ifconfig.meAnda dapat membuat jail.local yang disesuaikan dengan port dan kebijakan pemblokiran Anda di sini, lalu menempelkannya ke file:
Langkah 4: Mulai ulang dan verifikasi bahwa log journal sedang dibaca
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t menjalankan pengujian konfigurasi terlebih dahulu. Karena itu, kesalahan pengetikan di jail.local akan langsung dilaporkan di sini, bukan menyebabkan layanan berhenti tanpa informasi. 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 bahwa Fail2ban benar-benar membaca login Anda adalah Total failed. Jika nilainya lebih dari nol, atau bertambah saat Anda sengaja gagal login dari komputer lain, berarti journal sedang dibaca dan prosesnya selesai. Jika nilainya tetap 0, berapa pun jumlah percobaan yang gagal, dan Anda yakin tidak menguji dari alamat di ignoreip, lanjutkan ke bagian mode kegagalan di bawah.
Perhatikan bahwa baris Journal matches masih mencantumkan sshd.service. Di Ubuntu, unit SSH sebenarnya adalah ssh.service. Namun, filter yang disertakan juga mencocokkan _COMM=sshd, dan OpenSSH pada 24.04 mencatat kegagalannya dari proses bernama sshd, sehingga pencocokan tersebut berfungsi. Detail ini hanya penting jika Anda menggunakan OpenSSH yang lebih baru (9.8 atau lebih baru, dengan worker per koneksi bernama sshd-session); mode kegagalan mencakup kasus tersebut.
Langkah 5: Pantau pemblokiran nyata, atau paksa pemblokiran untuk pengujian
Pemblokiran nyata terjadi sendiri dalam beberapa menit pada VPS publik mana pun. Untuk memantaunya, tampilkan log secara langsung:
sudo tail -f /var/log/fail2ban.logPemblokiran terlihat seperti ini:
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 mekanisme tanpa menunggu, blokir alamat dokumentasi secara manual, bukan alamat Anda sendiri:
sudo fail2ban-client set sshd banip 10.0.0.66Perintah tersebut menampilkan 1, dan alamat itu muncul di bawah Banned IP list dalam fail2ban-client status sshd. Sekarang pastikan pemblokiran tersebut benar-benar ada di firewall. Pada Ubuntu 24.04, firewall 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, serta chain f2b-chain yang menolak sumber mana pun di dalam set tersebut. Jika fail2ban-client menyatakan bahwa sebuah alamat diblokir, tetapi tidak ada apa pun yang muncul di nft list, tindakan pemblokiran Anda tidak cocok dengan firewall. Lihat catatan nftables/iptables pada bagian mode kegagalan.
Langkah 6: Membatalkan pemblokiran alamat sendiri dan memulihkan akses jika terkunci
Jika Anda memblokir alamat yang seharusnya tidak diblokir, termasuk alamat Anda sendiri, hapus pemblokiran tersebut:
sudo fail2ban-client set sshd unbanip 10.0.0.66Perintah tersebut mengembalikan 1 jika berhasil. Untuk menghapus semua pemblokiran di semua jail:
sudo fail2ban-client unban --allJangan mengandalkan sesi SSH yang sudah terbuka untuk menyelamatkan Anda. Pemblokiran nftables menolak setiap paket dari alamat yang diblokir ke port 22, termasuk koneksi yang sudah terbentuk. Akibatnya, sesi yang ada akan berhenti saat pemblokiran diterapkan. Jika Anda memblokir alamat sendiri dan tidak memiliki entri ignoreip, Anda akan terkunci hingga pemblokiran berakhir. Pulihkan akses melalui konsol web penyedia Anda (VNC atau serial), yang tidak menggunakan SSH. Kemudian, tunggu hingga bantime berakhir atau jalankan perintah pembatalan pemblokiran dari konsol tersebut.
Langkah 7: Buat pemblokiran tetap berlaku dan meningkat
Fail2ban menyimpan pemblokiran aktif dalam database SQLite kecil di /var/lib/fail2ban/fail2ban.sqlite3, sehingga pemblokiran tersebut tetap berlaku setelah layanan dimulai ulang atau sistem di-reboot; pemblokiran tidak hilang. Baris bantime.increment yang telah Anda tambahkan membuat setiap pelanggar berulang menghadapi durasi pemblokiran yang makin lama, kira-kira meningkat dua kali lipat dari satu jam hingga sekitar satu minggu.
Untuk menerapkan kebijakan "tiga pelanggaran" di seluruh sistem, Fail2ban menyediakan jail recidive yang memantau /var/log/fail2ban.log miliknya sendiri dan memberikan pemblokiran jangka panjang kepada alamat apa pun yang telah diblokir berulang kali di semua jail. Karena [DEFAULT] kini menggunakan backend systemd, arahkan jail ini kembali ke file log yang memang dirancang untuk dibaca:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5backend = auto dengan logpath eksplisit membuat recidive membaca fail2ban.log biasa. Di situlah baris Ban yang dihitung benar-benar muncul. Jika menggunakan default systemd yang Anda tetapkan secara global, recidive akan diarahkan ke journal, yang tidak berisi baris tersebut.
Langkah 8: Padukan dengan SSH yang hanya menggunakan kunci, dan lebih baik lagi dengan VPN
Fail2ban hanya benar-benar efektif jika digunakan bersama autentikasi berbasis kunci. Dalam file drop-in di bawah /etc/ssh/sshd_config.d/, misalnya /etc/ssh/sshd_config.d/00-hardening.conf, tetapkan:
PasswordAuthentication no
KbdInteractiveAuthentication noKemudian sudo systemctl restart ssh. Jika autentikasi kata sandi dinonaktifkan, brute force sama sekali tidak dapat berhasil. Fail2ban kemudian berfungsi untuk mengurangi kebisingan pada log dan mengeluarkan pemindai sejak awal. Perlindungan yang lebih kuat adalah menonaktifkan akses SSH dari internet publik sepenuhnya: tempatkan SSH di balik VPN WireGuard yang di-host sendiri dan firewall port 22 agar hanya merespons melalui tunnel. Tidak ada pihak yang dapat melakukan brute force terhadap port yang tidak dapat dijangkaunya. Fail2ban pun menjadi lapisan cadangan, bukan pertahanan utama.
Fail2ban tidak hanya digunakan untuk SSH. Layanan apa pun yang mencatat upaya login yang gagal dapat diberi jail, termasuk server email, situs nginx, atau pengelola kata sandi Vaultwarden yang di-host sendiri yang login web-nya sebaiknya tidak dibiarkan terbuka terhadap credential stuffing. Setelah aplikasi web ditempatkan di belakang situs nginx dengan sertifikat Let's Encrypt, arahkan filter Fail2ban ke access log-nya dengan cara yang sama seperti jail SSH diarahkan ke journal.
Mode kegagalan, dengan string persis yang akan Anda lihat
"Have not found any log file for sshd jail", dan Fail2ban tidak akan dimulai. Ini adalah masalah auth.log lama. Di Ubuntu 24.04, masalah ini hanya terjadi jika sesuatu mengganti default paket, instalasi pip tanpa defaults-debian.conf, container tanpa journal, atau backend = auto yang tidak sengaja Anda tempelkan ke jail.local. Pada backend file tanpa /var/log/auth.log, jail sshd tidak dapat menemukan log-nya dan seluruh daemon berhenti. fail2ban.log menampilkan:
ERROR Failed during configuration: Have not found any log file for sshd jailKarena kesalahan ini bersifat fatal, service tidak pernah aktif. Selanjutnya, fail2ban-client status melaporkan gejala akibatnya:
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?Baris "socket path" tersebut tidak berarti Fail2ban rusak. Artinya, Fail2ban tidak pernah dimulai karena salah satu jail tidak dapat menemukan log-nya. Menetapkan backend = systemd di [DEFAULT], yang sudah dilakukan oleh paket Ubuntu, memperbaiki kedua pesan tersebut sekaligus.
Jail aktif, tetapi Total failed tidak pernah bertambah. Daemon berjalan dan journal sedang dibaca, tetapi kegagalan nyata terus bertambah di journalctl -u ssh, sementara penghitung tetap pada 0. Singkirkan kemungkinan yang paling jelas terlebih dahulu: Anda melakukan pengujian dari alamat yang tercantum di ignoreip, sehingga kegagalan Anda sendiri memang dikecualikan. Jika bukan itu penyebabnya, Anda menggunakan build OpenSSH yang worker per koneksinya adalah sshd-session (9.8 dan yang lebih baru). _COMM pada journal untuk worker tersebut adalah sshd-session, bukan sshd, sehingga pencocokan bawaan tidak menemukannya. Perluas pencocokan di blok [sshd]:
[sshd]
enabled = true
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-sessionMulai ulang service, sengaja gagalkan login dari alamat yang tidak tercantum di ignoreip, lalu pastikan Total failed akhirnya bertambah.
Anda memblokir alamat sendiri: Connection refused. Anda tidak memasukkan alamat sendiri ke ignoreip, melakukan beberapa percobaan login yang gagal, dan sekarang:
ssh: connect to host 10.0.0.10 port 22: Connection refusedPenolakan tersebut, bukan timeout tanpa respons, adalah hasil kerja verdict default reject dari action nftables terhadap Anda. Perbaiki seperti pada Langkah 6: batalkan pemblokiran dari sesi pada alamat lain yang tidak diblokir, atau dari console provider. Sesi yang sudah terbuka dari alamat yang diblokir juga akan terhenti. Kemudian tambahkan alamat Anda ke ignoreip agar masalah ini tidak terjadi lagi.
Fail2ban menyatakan alamat diblokir, tetapi alamat tersebut masih dapat terhubung. Penghitung di status sshd bertambah, tetapi alamat tersebut masih dapat mencapai port 22. Ini adalah ketidaksesuaian antara action pemblokiran dan firewall. Di Ubuntu 24.04, penyebabnya hampir selalu karena Anda mengganti banaction = nftables yang berfungsi dengan banaction = iptables-multiport dari panduan lama, pada server yang tidak memiliki lapisan iptables. fail2ban.log menampilkan:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'Hapus penggantian tersebut dan gunakan action nftables yang disediakan paket. Atau, jika Anda mengelola firewall sepenuhnya melalui ufw dan ingin pemblokiran muncul di sana, tetapkan banaction = ufw di [DEFAULT]. Mulai ulang service dan pastikan aturan tersebut muncul dengan sudo nft list ruleset | grep f2b.
Fail2ban tidak akan dimulai setelah Anda mengedit jail.local. Kesalahan ketik, heading yang tidak sengaja ditambahkan, atau nilai waktu yang tidak valid dapat membuat service menolak untuk aktif. Minta Fail2ban memeriksa konfigurasi sebelum dijalankan:
sudo fail2ban-client -tFail2ban akan menyebutkan file dan jail yang bermasalah, misalnya Errors in jail 'sshd'. Skipping.... Dengan demikian, Anda dapat memperbaiki sumber masalah tanpa menebak.
FAQ
Apakah instalasi Fail2ban bawaan pada Ubuntu 24.04 benar-benar memblokir serangan SSH?
Ya. Paket tersebut menyertakan /etc/fail2ban/jail.d/defaults-debian.conf, yang mengaktifkan jail sshd, menetapkan backend = systemd agar membaca journal systemd, bukan /var/log/auth.log yang tidak tersedia, dan menetapkan banaction = nftables agar pemblokiran diterapkan melalui firewall Ubuntu yang sebenarnya. apt install fail2ban biasa melindungi SSH sejak boot pertama. Konfirmasikan dengan sudo fail2ban-client status sshd dan cari nilai Total failed yang bukan nol.
Mengapa Fail2ban tidak memblokir apa pun pada server saya?
Singkirkan tiga penyebab umum berikut secara berurutan. Anda mungkin sedang menguji dari alamat dalam ignoreip, yang memang dikecualikan. Anda mungkin telah mengganti konfigurasi bawaan yang berfungsi dengan menempelkan backend = auto ke jail.local dari panduan lama. Hal ini menyebabkan pembacaan journal gagal pada image yang tidak memiliki auth.log. Atau, Anda mungkin berada di dalam container yang sama sekali tidak memiliki journal systemd untuk dibaca. Periksa Total failed di fail2ban-client status sshd. Jika nilainya tidak pernah meningkat sementara journalctl -u ssh menampilkan kegagalan yang sebenarnya, jail membaca sumber yang salah.
Bagaimana cara membuka blokir alamat IP saya sendiri?
Jalankan sudo fail2ban-client set sshd unbanip YOUR.IP.HERE, yang mengembalikan 1 jika berhasil, atau jalankan sudo fail2ban-client unban --all untuk menghapus semua pemblokiran. Jika akses SSH Anda terblokir, gunakan konsol web atau VNC dari penyedia Anda untuk menjalankan perintah yang sama. Pemblokiran menolak setiap paket dari alamat Anda ke port 22, sehingga sesi yang sudah terbuka pun berhenti berfungsi. Kemudian tambahkan alamat Anda ke ignoreip agar masalah ini tidak terulang.
Apa perbedaan antara jail.conf dan jail.local?
jail.conf berisi default upstream Fail2ban dan ditimpa setiap kali paket diperbarui, sehingga perubahan apa pun di dalamnya pada akhirnya akan hilang. Paket Debian/Ubuntu menerapkan pengaturannya sendiri melalui jail.d/defaults-debian.conf. Simpan perubahan Anda di jail.local. File ini dibaca terakhir dan mengesampingkan kedua file tersebut, serta tidak diubah saat pembaruan. Biarkan jail.conf sebagai referensi baca-saja.
Apakah Fail2ban menggantikan autentikasi SSH berbasis key?
Tidak. Fail2ban membatasi laju kegagalan berulang dari satu alamat. Fail2ban tidak menangani tebakan lambat dan terdistribusi ketika setiap alamat tetap berada di bawah ambang batas. Autentikasi hanya dengan key (PasswordAuthentication no) membuat penebakan kata sandi mustahil, sedangkan Fail2ban mengurangi kebisingan pada log dan mengeluarkan pemindai lebih awal. Gunakan keduanya, dan idealnya jangan paparkan SSH ke internet publik sama sekali.