Cara Pasang Fail2ban di Ubuntu 24.04 untuk Sekat Bot SSH
Ketahui cara memasang Fail2ban di Ubuntu 24.04 untuk menyekat serangan brute force SSH. Kami tunjukkan cara semak status fail2ban-client dan cara baiki jika Total failed kekal 0.
Fungsi sebenar Fail2ban
Fail2ban ialah daemon pembaca log. Ia memantau mesej pengesahan SSH anda dan, selepas beberapa kegagalan daripada satu alamat dalam tempoh masa yang singkat, ia menjalankan arahan firewall yang menyekat alamat tersebut untuk sementara waktu. Itulah konsep keseluruhannya. Ia hanya memerlukan kira-kira tiga puluh baris konfigurasi dalam satu fail, dan pada Ubuntu 24.04, pemasangannya hanyalah satu arahan apt yang memberikan perlindungan sebelum anda mengubah apa-apa pun.
Fahami dengan jelas tentang apa itu Fail2ban dan apa yang bukan. Fail2ban tidak mengesahkan sesiapa, tidak menyulitkan apa-apa, dan tidak menghalang percubaan log masuk yang bertekad, ia hanya menghalang percubaan berulang daripada sumber yang sama. Ia adalah penapis gangguan dan pengehad kadar, bukannya kunci. Tugasnya adalah untuk memastikan pengimbasan latar belakang yang berterusan pada port 22 berhenti membazirkan CPU, lebar jalur dan ruang log anda, serta melambatkan mana-mana penyerang yang terpaksa datang daripada satu alamat pada satu-satu masa.
Perkara yang tidak digantikan oleh Fail2ban
Fail2ban ialah lapisan ketiga, bukan yang pertama. Jika pelayan anda masih menerima kata laluan SSH, botnet yang tersebar merentasi ribuan alamat boleh terus meneka, kerana setiap alamat kekal di bawah ambang sekatan anda dan tidak pernah mencetuskannya. Pertahanan sebenar terhadap perkara ini ialah pengesahan berasaskan kunci sahaja, yang menjadikan tekaan kata laluan mustahil tidak kira berapa banyak percubaan yang dilakukan oleh sesiapa pun. Fail2ban di atas pengesahan kunci sahaja melakukan dua perkara berguna: ia mengurangkan gangguan brute-force daripada log anda, dan ia menyingkirkan pengimbas lebih awal supaya mereka berhenti menghentam port tersebut. Anggap ia sebagai pertahanan mendalam (defence in depth). Ia berada di belakang pengesahan kunci dan di belakang firewall, bukan di hadapannya.
Prerequisites, and the Ubuntu 24.04 reality
You need a VPS running Ubuntu 24.04 with root or sudo, and SSH already working, ideally on key authentication. Fail2ban is frugal: a few tens of megabytes of RAM, no tuning of limits required.
Now the part every older guide gets wrong. For years the standard advice was "install Fail2ban, then add backend = systemd, because Ubuntu stopped writing /var/log/auth.log." That advice describes a real change, modern server and cloud images ship without rsyslog, so SSH logs only to the systemd journal and that text file is gone, but on Ubuntu 24.04 the Fail2ban package already accounts for it. The package drops in /etc/fail2ban/jail.d/defaults-debian.conf, and that file, not the upstream defaults, is what your server actually runs:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueRead that carefully, because it settles two questions before you touch anything. backend = systemd means the SSH jail reads the journal, so the missing auth.log does not matter. banaction = nftables means bans are enforced through nftables, which is the firewall Ubuntu 24.04 actually uses, rather than legacy iptables. And [sshd] enabled = true means the jail is on from first boot. The upshot: a stock apt install fail2ban on Ubuntu 24.04 bans SSH brute-force out of the box. Most of your work is confirming that, tuning the policy, and making sure you cannot lock yourself out.
The old auth.log trap still bites in three situations, and it is worth recognising them: you installed Fail2ban with pip instead of apt, so there is no defaults-debian.conf; you are inside an unprivileged container with no systemd journal to read; or you followed an old tutorial and pasted backend = auto into your own jail.local, overriding the working default. The failure-modes section shows exactly what each looks like.
Langkah 1: Pasang dan sahkan ia sedang melakukan sekatan
sudo apt update
sudo apt install -y fail2banUbuntu 24.04 membekalkan Fail2ban 1.0.2, dan pakej tersebut menarik python3-systemd sebagai dependency wajib, jadi backend journal mempunyai semua yang diperlukan. Servis ini diaktifkan dan bermula secara automatik:
sudo systemctl status fail2banAnda perlukan active (running). Kemudian, lihat jail yang sudah pun menjalankan tugasnya:
sudo fail2ban-client status sshdPada VPS awam yang boleh dicapai walaupun hanya untuk beberapa minit, anda selalunya akan melihat kegagalan dikira dan alamat disekat; internet mengimbas port 22 secara berterusan. Itu adalah bukti bahawa konfigurasi asal berfungsi. Dari sini, anda hanya perlu memperhalusinya, bukan membinanya dari sifar.
Langkah 2: Sunting jail.local, jangan sesekali sunting jail.conf
Fail2ban menyimpan tetapan lalai daripada pembangun dalam /etc/fail2ban/jail.conf. Jangan sunting fail tersebut. Setiap apt upgrade pakej boleh menggantikannya, dan perubahan anda akan hilang tanpa sebarang amaran. Fail2ban membaca fail mengikut urutan yang tetap, bermula dengan jail.conf, kemudian semua fail dalam jail.d/, diikuti oleh jail.local, dan nilai terakhir yang akan diguna pakai. Fail .local adalah milik anda, dan naik taraf pakej tidak akan mengubahnya. Peraturan yang sama terpakai pada penapis (filters), di mana fail *.local akan mengatasi fail filter.d/*.conf yang dibekalkan.
Oleh itu, anda perlu menulis fail jail.local yang kecil untuk mengatasi hanya beberapa tetapan yang anda perlukan, dan biarkan kedua-dua jail.conf serta fail jail.d/defaults-debian.conf yang dibekalkan oleh pakej tidak disentuh sebagai rujukan.
Langkah 3: Tulis /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localMasukkan kandungan ini, dan tukar alamat pada baris ignoreip kepada alamat IP awam 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 mempunyai fungsinya:
bantime,findtime,maxretryialah polisi. Nilai lalaibantimeyang dibekalkan hanyalah sepuluh minit; satu jam adalah tempoh minimum yang lebih wajar. Lima kegagalan daripada satu alamat dalam tempoh sepuluh minit akan menyebabkan sekatan. Pengguna sebenar mungkin tersalah taip kata laluan sekali atau dua kali; lima kegagalan dalam sepuluh minit adalah perbuatan skrip.ignoreipialah langkah keselamatan anda. Letakkan alamat awam yang anda gunakan untuk menyambung dari sini supaya Fail2ban tidak akan menyekat akses anda ke pelayan sendiri. Sambungan rumah dengan IP yang berubah-ubah adalah sebab untuk memilih pendekatan VPN di bahagian akhir, bukan alasan untuk melangkau baris ini.bantime.increment = truemenjadikan setiap sekatan berulang lebih lama daripada sebelumnya, satu jam, kemudian dua, kemudian empat, sehinggabantime.maxtime. Alamat yang terus mencuba akan disekat secara progresif.
Cari alamat untuk disenarai putih daripada mesin yang anda gunakan untuk SSH, bukan daripada pelayan:
curl -s ifconfig.meAnda boleh menjana jail.local yang ditala mengikut port dan polisi sekatan anda di sini, kemudian tampalkannya ke dalam fail tersebut:
Langkah 4: Mulakan semula dan sahkan ia membaca jurnal
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t akan menjalankan ujian konfigurasi terlebih dahulu, jadi sebarang kesilapan taip dalam jail.local akan menyebabkan kegagalan yang jelas di sini dan bukannya membiarkan servis tersebut mati. Status jail yang sihat kelihatan 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.66Nombor yang membuktikan Fail2ban benar-benar membaca log masuk anda ialah Total failed. Jika nilainya melebihi sifar, atau meningkat apabila anda sengaja gagal log masuk dari mesin lain, bermakna jurnal sedang dibaca dan tugasan anda selesai. Jika nilainya kekal pada 0 tidak kira berapa kali anda gagal, dan anda pasti anda tidak menguji dari alamat dalam ignoreip, beralih ke mod kegagalan di bawah.
Perhatikan bahawa baris Journal matches masih menamakan sshd.service. Pada Ubuntu, unit SSH sebenarnya ialah ssh.service, tetapi penapis yang disertakan juga sepadan dengan _COMM=sshd, dan OpenSSH pada 24.04 mencatatkan kegagalannya daripada proses bernama sshd, jadi padanan tersebut berfungsi. Perincian itu hanya penting jika anda menggunakan OpenSSH yang lebih baharu (9.8 atau lebih lewat, di mana pekerja setiap sambungan ialah sshd-session); mod kegagalan merangkumi kes tersebut.
Langkah 5: Pantau sekatan sebenar, atau paksa satu untuk ujian
Sekatan sebenar akan berlaku dengan sendirinya dalam masa beberapa minit pada mana-mana VPS awam. Untuk memantau sekatan, pantau log menggunakan tail:
sudo tail -f /var/log/fail2ban.logSekatan kelihatan 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 membuktikan mekanisme berfungsi dari hujung ke hujung tanpa menunggu, sekat alamat dokumentasi secara manual, jangan sekali-kali menyekat alamat anda sendiri:
sudo fail2ban-client set sshd banip 10.0.0.66Ia akan mencetak 1, dan alamat tersebut akan muncul di bawah Banned IP list dalam fail2ban-client status sshd. Sekarang, sahkan bahawa sekatan tersebut benar-benar wujud dalam firewall. Pada Ubuntu 24.04, ia menggunakan nftables, bukan iptables:
sudo nft list table inet f2b-tableAnda akan melihat set bernama addr-set-sshd yang mengandungi 10.0.0.66, dan chain f2b-chain yang menolak sebarang sumber dalam set tersebut. Jika fail2ban-client menyatakan sesuatu alamat telah disekat tetapi tiada apa-apa yang muncul dalam nft list, tindakan sekatan anda tidak sepadan dengan firewall anda; sila rujuk nota nftables/iptables dalam bahagian mod kegagalan.
Langkah 6: Nyahsekat diri anda, dan pulihkan akses jika anda terkunci
Jika anda telah menyekat alamat yang sepatutnya tidak disekat, termasuk alamat anda sendiri, buang sekatan tersebut:
sudo fail2ban-client set sshd unbanip 10.0.0.66Perintah ini mengembalikan 1 jika berjaya. Untuk membuang setiap sekatan merentasi semua jail:
sudo fail2ban-client unban --allJangan bergantung pada sesi SSH yang sudah terbuka untuk menyelamatkan anda: sekatan nftables menolak setiap paket daripada alamat yang disekat ke port 22, termasuk sambungan yang sedia ada, jadi sesi yang sedang berjalan akan terhenti sebaik sahaja sekatan dikenakan. Jika anda menyekat diri sendiri dan tidak mempunyai entri ignoreip, anda akan terkunci sehingga sekatan tamat tempoh. Pulihkan akses melalui konsol web pembekal anda (VNC atau serial), yang tidak melalui SSH, dan sama ada tunggu sehingga bantime tamat atau jalankan perintah nyahsekat di sana.
Langkah 7: Kekalkan ban dan tingkatkan tempoh
Fail2ban menyimpan ban aktif dalam pangkalan data SQLite kecil di /var/lib/fail2ban/fail2ban.sqlite3, supaya ia kekal selepas servis dimulakan semula atau sistem di-reboot; anda tidak akan kehilangan ban tersebut. Baris bantime.increment yang telah anda tambah menjadikan setiap pesalah berulang menghadapi masalah yang semakin meningkat, dengan tempoh ban meningkat secara kasar daripada satu jam kepada satu minggu.
Untuk polisi "tiga kesalahan" di seluruh sistem sebagai tambahan, Fail2ban menyertakan jail recidive yang memantau /var/log/fail2ban.log miliknya sendiri dan memberikan ban jangka panjang kepada mana-mana alamat yang telah di-ban berulang kali merentasi semua jail. Memandangkan [DEFAULT] anda kini menggunakan backend systemd, tetapkan jail ini semula kepada fail log yang direka untuk dibacanya:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5backend = auto dengan logpath yang eksplisit memastikan recidive membaca fail2ban.log biasa, iaitu tempat di mana baris Ban yang dikiranya benar-benar muncul; tetapan lalai systemd yang anda tetapkan secara global akan menghalakannya ke journal, di mana baris tersebut tidak wujud.
Langkah 8: Gandingkan dengan SSH kunci sahaja, dan lebih baik lagi dengan VPN
Fail2ban hanya berbaloi digunakan bersama pengesahan kunci. Dalam fail drop-in di bawah /etc/ssh/sshd_config.d/, contohnya /etc/ssh/sshd_config.d/00-hardening.conf, tetapkan:
PasswordAuthentication no
KbdInteractiveAuthentication noKemudian sudo systemctl restart ssh. Dengan kata laluan dimatikan, serangan brute force tidak akan berjaya sama sekali; Fail2ban kemudiannya berfungsi untuk mengurangkan gangguan log dan menyingkirkan pengimbas lebih awal. Lebih kukuh lagi adalah dengan memastikan SSH tidak terdedah langsung kepada internet awam: letakkan SSH di sebalik VPN WireGuard yang dihoskan sendiri dan tetapkan firewall pada port 22 supaya ia hanya menjawab melalui terowong tersebut. Tiada sesiapa boleh melakukan brute-force pada port yang tidak dapat dicapai, dan Fail2ban menjadi benteng pertahanan terakhir dan bukannya barisan hadapan.
Fail2ban bukan sahaja untuk SSH. Mana-mana servis yang merekodkan log kegagalan log masuk boleh diberikan jail, seperti pelayan e-mel, tapak nginx, atau pengurus kata laluan Vaultwarden yang dihoskan sendiri yang log masuk webnya tidak mahu anda biarkan terbuka kepada serangan credential stuffing. Apabila aplikasi web berada di sebalik tapak nginx dengan sijil Let's Encrypt, halakan penapis Fail2ban ke log aksesnya dengan cara yang sama seperti jail SSH menghala ke journal.
Mod kegagalan, berserta rentetan tepat yang akan anda lihat
"Have not found any log file for sshd jail", dan Fail2ban tidak akan bermula. Ini adalah masalah auth.log lama, dan pada Ubuntu 24.04 anda hanya akan menemuinya jika sesuatu telah mengatasi tetapan lalai pakej, pemasangan pip tanpa defaults-debian.conf, kontena tanpa journal, atau backend = auto tersasar yang anda tampal ke dalam jail.local. Pada backend fail tanpa /var/log/auth.log, jail sshd tidak dapat mencari lognya dan keseluruhan daemon akan terbatal. fail2ban.log menunjukkan:
ERROR Failed during configuration: Have not found any log file for sshd jailOleh kerana ralat itu bersifat fatal, servis tidak akan berjalan, dan fail2ban-client status kemudian melaporkan simptom hiliran:
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?Baris "socket path" itu tidak bermaksud Fail2ban rosak, ia bermaksud ia tidak pernah bermula kerana satu jail tidak dapat mencari lognya. Menetapkan backend = systemd dalam [DEFAULT], yang mana pakej Ubuntu sudah lakukan untuk anda, akan membetulkan kedua-dua mesej tersebut serentak.
Jail aktif tetapi Total failed tidak pernah bergerak. Daemon sedang berjalan dan journal sedang dibaca, namun kegagalan sebenar terkumpul dalam journalctl -u ssh sementara pembilang kekal pada 0. Peraturan pertama, tolak kemungkinan yang jelas: anda sedang menguji daripada alamat yang disenaraikan dalam ignoreip, jadi kegagalan anda sendiri dikecualikan mengikut reka bentuk. Jika bukan itu puncanya, anda berada pada binaan OpenSSH di mana pekerja per-connection adalah sshd-session (9.8 dan ke atas), yang mana journal _COMM adalah sshd-session, bukan sshd, jadi padanan yang dibekalkan terlepas mengenainya. Luaskan padanan dalam blok [sshd]:
[sshd]
enabled = true
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-sessionMulakan semula, sengajakan kegagalan log masuk daripada alamat yang tidak berada dalam ignoreip, dan sahkan Total failed akhirnya meningkat.
Anda mengharamkan diri sendiri: Connection refused. Anda tertinggal alamat anda sendiri daripada ignoreip, menguji beberapa log masuk yang salah, dan sekarang:
ssh: connect to host 10.0.0.10 port 22: Connection refusedPenolakan tersebut, bukannya tamat masa senyap, adalah tindakan lalai reject bagi tindakan nftables yang menjalankan tugasnya terhadap anda. Betulkan seperti dalam Langkah 6: nyahharam daripada sesi pada alamat lain yang tidak diharamkan, atau daripada konsol pembekal, sesi yang sudah dibuka daripada alamat yang diharamkan juga akan terbeku. Kemudian tambah alamat anda ke ignoreip supaya ia tidak berulang lagi.
Fail2ban menyatakan alamat diharamkan, tetapi ia masih boleh bersambung. Pembilang dalam status sshd meningkat, namun alamat tersebut masih mencapai port 22. Ini adalah ketidakpadanan antara tindakan haram dan firewall, dan pada Ubuntu 24.04 ia hampir selalu bermaksud anda mengatasi banaction = nftables yang berfungsi dengan banaction = iptables-multiport yang disalin daripada panduan lama, pada mesin tanpa lapisan iptables. fail2ban.log menunjukkan:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'Padamkan penggantian tersebut dan biarkan tindakan nftables yang dibekalkan berfungsi, atau, jika anda menguruskan firewall sepenuhnya melalui ufw dan mahu pengharaman dipaparkan di sana, tetapkan banaction = ufw dalam [DEFAULT]. Mulakan semula dan sahkan peraturan muncul dengan sudo nft list ruleset | grep f2b.
Fail2ban tidak akan bermula selepas menyunting jail.local. Ralat taip, tajuk yang tersasar atau nilai masa yang salah menyebabkan servis enggan berjalan. Minta Fail2ban menyemak konfigurasi sebelum ia dijalankan:
sudo fail2ban-client -tIa menamakan fail dan jail yang bermasalah, contohnya Errors in jail 'sshd'. Skipping..., supaya anda membetulkan puncanya dan bukannya meneka.
FAQ
Adakah pemasangan Fail2ban standard pada Ubuntu 24.04 benar-benar menyekat serangan SSH?
Ya. Pakej ini membekalkan /etc/fail2ban/jail.d/defaults-debian.conf, yang mengaktifkan jail sshd, menetapkan backend = systemd supaya ia membaca journal systemd dan bukannya /var/log/auth.log yang tiada, serta menetapkan banaction = nftables supaya sekatan dikuatkuasakan melalui firewall sebenar Ubuntu. Pemasangan apt install fail2ban yang biasa melindungi SSH sejak but pertama. Sahkan perkara ini dengan sudo fail2ban-client status sshd dan cari nilai Total failed yang bukan sifar.
Mengapa Fail2ban tidak menyekat apa-apa pada pelayan saya?
Tolak tiga punca biasa mengikut urutan. Anda mungkin sedang menguji dari alamat dalam ignoreip, yang dikecualikan secara reka bentuk. Anda mungkin telah mengatasi tetapan lalai yang berfungsi dengan menampal backend = auto ke dalam jail.local daripada panduan lama, yang merosakkan pembacaan journal pada imej tanpa auth.log. Atau anda mungkin berada di dalam container yang langsung tidak mempunyai journal systemd untuk dibaca. Semak Total failed dalam fail2ban-client status sshd: jika nilainya tidak pernah meningkat sedangkan journalctl -u ssh menunjukkan kegagalan sebenar, jail tersebut sedang membaca lokasi yang salah.
Bagaimanakah cara untuk menyahsekat alamat IP saya sendiri?
Jalankan sudo fail2ban-client set sshd unbanip YOUR.IP.HERE, yang akan memaparkan 1 jika berjaya, atau sudo fail2ban-client unban --all untuk memadamkan setiap sekatan. Jika anda terkunci daripada SSH, gunakan konsol web atau VNC pembekal anda untuk menjalankan perintah yang sama; sekatan tersebut menolak setiap paket daripada alamat anda ke port 22, jadi sesi yang sudah dibuka pun akan berhenti berfungsi. Kemudian, tambahkan alamat anda ke dalam ignoreip supaya ia tidak berulang.
Apakah perbezaan antara jail.conf dan jail.local?
jail.conf menyimpan tetapan lalai huluan Fail2ban dan akan ditimpa pada setiap naik taraf pakej, jadi sebarang suntingan di situ akhirnya akan hilang. Pakej Debian/Ubuntu melapiskan tetapan sendiri di atasnya melalui jail.d/defaults-debian.conf. Perubahan anda perlu diletakkan dalam jail.local, yang dibaca terakhir dan mengatasi kedua-duanya, serta tidak akan disentuh oleh proses naik taraf. Biarkan jail.conf sebagai rujukan baca sahaja.
Adakah Fail2ban menggantikan pengesahan SSH berasaskan kunci?
Tidak. Fail2ban mengehadkan kadar kegagalan berulang daripada satu alamat; ia tidak berkesan terhadap tekaan perlahan dan teragih di mana setiap alamat kekal di bawah ambang had. Pengesahan kunci sahaja (PasswordAuthentication no) menjadikan tekaan kata laluan mustahil dilakukan, dan Fail2ban kemudiannya mengurangkan gangguan log serta menyingkirkan pengimbas lebih awal. Jalankan kedua-duanya, dan sebaik-baiknya jauhkan SSH daripada internet awam sepenuhnya.