Cara pasang Fail2ban di Ubuntu 24.04
Ketahui cara pasang Fail2ban pada Ubuntu 24.04 untuk sekat bot SSH. Pelajari cara guna fail fail2ban-client status sshd jika jumlah kegagalan kekal 0.
Apa yang sebenarnya dilakukan oleh 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 buat sementara waktu. Itulah konsep utamanya. 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 perlu mengedit apa-apa.
Fahami apa yang ia lakukan dan apa yang ia tidak lakukan. Fail2ban tidak mengesahkan sesiapa, tidak menyulitkan apa-apa, dan tidak menghentikan satu percubaan log masuk yang tekad — ia hanya menghentikan percubaan berulang daripada sumber yang sama. Ia adalah penapis gangguan dan pengehad kadar, bukan kunci. Tugasnya adalah untuk menghentikan imbasan latar belakang yang berterusan pada port 22 daripada membazirkan CPU, jalur lebar, dan ruang log anda, serta melambatkan mana-mana penyerang yang perlu menggunakan satu alamat pada satu masa.
Apa yang Fail2ban tidak gantikan
Fail2ban adalah lapisan ketiga, bukan yang pertama. Jika pelayan anda masih menerima kata laluan SSH, rangkaian bot yang tersebar di ribuan alamat boleh terus membuat tekaan. Ini berlaku kerana setiap alamat kekal di bawah had ban anda dan tidak pernah mencetuskan amaran. Pertahanan sebenar terhadap perkara ini adalah pengesahan kunci sahaja (key-only authentication). Kaedah ini menjadikan tekaan kata laluan mustahil tidak kira berapa banyak percubaan yang dilakukan. Fail2ban yang digunakan bersama pengesahan kunci sahaja mempunyai dua fungsi berguna: ia mengurangkan gangguan brute-force dalam log anda, dan ia menghalau pengimbas (scanners) lebih awal supaya mereka berhenti menyerang port tersebut. Anggap ia sebagai pertahanan berlapis (defence in depth). Ia berfungsi di belakang pengesahan kunci dan di belakang firewall, bukan di hadapan mereka.
Prasyarat, dan realiti Ubuntu 24.04
Anda memerlukan VPS yang menjalankan Ubuntu 24.04 dengan akses root atau sudo, dan SSH yang sudah berfungsi — sebaik-baiknya menggunakan pengesahan kunci. Fail2ban sangat menjimatkan: hanya memerlukan beberapa puluh megabait RAM, dan tidak memerlukan pelarasan had.
Sekarang bahagian yang sering salah dalam panduan lama. Selama bertahun-tahun, nasihat standard adalah "pasang Fail2ban, kemudian tambah backend = systemd, kerana Ubuntu telah berhenti menulis /var/log/auth.log." Nasihat itu menerangkan perubahan sebenar — imej pelayan dan awan moden dihantar tanpa rsyslog, jadi log SSH hanya ditulis ke dalam systemd journal dan fail teks tersebut sudah tiada — tetapi pada Ubuntu 24.04, pakej Fail2ban sudah mengambil kira perkara ini. Pakej tersebut menyertakan /etc/fail2ban/jail.d/defaults-debian.conf, dan fail tersebut, bukannya tetapan asal, adalah apa yang pelayan anda jalankan:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueBaca dengan teliti, kerana ini menjawab dua persoalan sebelum anda melakukan apa-apa. backend = systemd bermaksud jail SSH membaca journal, jadi ketiadaan auth.log tidak menjadi masalah. banaction = nftables bermaksud sekatan dikuatkuasakan melalui nftables, iaitu firewall yang digunakan oleh Ubuntu 24.04, bukannya iptables lama. Dan [sshd] enabled = true bermaksud jail sudah aktif sejak but pertama. Kesimpulannya: apt install fail2ban asal pada Ubuntu 24.04 menyekat serangan brute-force SSH secara automatik. Kebanyakan kerja anda adalah untuk mengesahkan perkara tersebut, melaras polisi, dan memastikan anda tidak terkunci daripada sistem sendiri.
Perangkap auth.log lama masih berlaku dalam tiga situasi, dan anda perlu mengenal pasti situasi ini: anda memasang Fail2ban dengan pip dan bukannya apt, jadi tiada defaults-debian.conf; anda berada di dalam kontena tanpa keistimewaan yang tiada systemd journal untuk dibaca; atau anda mengikuti tutorial lama dan menampal backend = auto ke dalam jail.local anda sendiri, yang membatalkan tetapan asal yang berfungsi. Bahagian mod kegagalan menunjukkan rupa setiap situasi tersebut secara tepat.
Langkah 1: Pasang dan sahkan ia sudah menghalang
sudo apt update
sudo apt install -y fail2banUbuntu 24.04 menyertakan Fail2ban 1.0.2, dan pakej ini memerlukan python3-systemd sebagai kebergantungan wajib, jadi backend journal mempunyai semua keperluan yang diperlukan. Perkhidmatan ini akan diaktifkan dan dimulakan secara automatik:
sudo systemctl status fail2banAnda memerlukan active (running). Kemudian lihat jail yang sedang berfungsi:
sudo fail2ban-client status sshdPada VPS awam yang telah boleh diakses walaupun hanya beberapa minit, anda sering akan melihat kegagalan dikira dan alamat dihalang — imbasan internet sentiasa mengimbas port 22. Itu adalah bukti bahawa konfigurasi asal berfungsi. Dari sini anda hanya perlu menambah baik, bukan membina dari awal.
Langkah 2: Edit jail.local, jangan edit jail.conf
Fail2ban menyimpan tetapan asal dalam /etc/fail2ban/jail.conf. Jangan edit fail tersebut. Setiap apt upgrade pakej boleh menggantikannya, dan perubahan anda akan hilang tanpa amaran. Fail2ban membaca fail mengikut urutan tetap — jail.conf dahulu, kemudian semua fail dalam jail.d/, kemudian jail.local — dan nilai terakhir akan digunakan. Fail .local adalah milik anda, dan naik taraf pakej tidak akan mengubahnya. Peraturan yang sama terpakai untuk penapis, di mana fail *.local mengatasi fail filter.d/*.conf yang disertakan.
Oleh itu, anda perlu menulis jail.local kecil yang hanya mengatasi beberapa tetapan yang anda perlukan, dan biarkan jail.conf serta jail.d/defaults-debian.conf asal tidak diubah sebagai rujukan.
Langkah 3: Tulis /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.localMasukkan kandungan ini, dan tukar alamat pada baris ignoreip kepada 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 fungsi khusus:
bantime,findtime,maxretryadalah polisi. Nilai lalaibantimeyang disertakan hanyalah sepuluh minit; satu jam adalah had minimum yang lebih munasabah. 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 tanda skrip.ignoreipadalah pelindung keselamatan anda. Masukkan alamat awam yang anda gunakan untuk menyambung dari sini supaya Fail2ban tidak mengunci akses anda sendiri ke pelayan. Sambungan rumah dengan IP yang berubah adalah sebab untuk memilih pendekatan VPN di bahagian akhir, bukan sebab untuk mengabaikan 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 berperingkat.
Cari alamat untuk senarai putih (whitelist) daripada mesin yang anda gunakan untuk SSH dari, bukan dari pelayan:
curl -s ifconfig.meAnda boleh menjana jail.local yang dilaraskan mengikut port dan polisi sekatan anda di sini, kemudian tampal ke dalam fail tersebut:
Step 4: Mulakan semula dan sahkan ia membaca journal
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t menjalankan ujian konfigurasi terlebih dahulu. Kesalahan taip dalam jail.local akan menyebabkan kegagalan dikesan di sini dan bukannya membiarkan perkhidmatan terhenti. Status jail yang sihat adalah seperti berikut:
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 journal sedang dibaca dan proses selesai. Jika ia kekal pada 0 tidak kira berapa kali anda gagal — dan anda pasti tidak sedang melakukan ujian dari alamat dalam ignoreip — rujuk mod kegagalan di bawah.
Perhatikan baris Journal matches masih menamakan sshd.service. Pada Ubuntu, unit SSH sebenarnya ialah ssh.service, tetapi penapis yang disertakan juga memadankan _COMM=sshd, dan OpenSSH pada 24.04 merekodkan kegagalan daripada proses bernama sshd, jadi padanan tersebut berfungsi. Perincian itu hanya penting jika anda menggunakan OpenSSH versi baharu (9.8 atau ke atas, di mana worker bagi setiap sambungan ialah sshd-session); mod kegagalan merangkumi kes tersebut.
Step 5: Perhatikan ban sebenar berlaku, atau paksa satu ban untuk ujian
Ban sebenar akan berlaku secara automatik dalam masa beberapa minit pada mana-mana VPS awam. Untuk memerhatikannya, gunakan tail pada log:
sudo tail -f /var/log/fail2ban.logSatu ban 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 menguji keseluruhan sistem tanpa menunggu, ban satu alamat dokumentasi secara manual — jangan sesekali ban 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 satu set bernama addr-set-sshd yang mengandungi 10.0.0.66, dan satu chain f2b-chain yang menolak mana-mana sumber dalam set tersebut. Jika fail2ban-client menyatakan sesuatu alamat telah di-ban tetapi tiada apa-apa muncul dalam nft list, tindakan ban anda tidak sepadan dengan firewall anda — rujuk nota nftables/iptables dalam mod kegagalan.
Step 6: Unban diri anda, dan pulihkan akses jika anda terkunci
Jika anda telah menyekat alamat yang tidak sepatutnya — iaitu alamat anda sendiri — buang sekatan tersebut:
sudo fail2ban-client set sshd unbanip 10.0.0.66Ia akan memulangkan 1 jika berjaya. Untuk membuang semua sekatan dalam setiap jail:
sudo fail2ban-client unban --allJangan bergantung pada sesi SSH yang sedang dibuka untuk menyelamatkan anda: sekatan nftables menolak setiap paket daripada alamat yang disekat ke port 22 — termasuk sambungan yang telah sedia ada — jadi sesi sedia ada akan membeku sebaik sahaja sekatan dikenakan. Jika anda menyekat diri sendiri dan tiada entri ignoreip, anda akan terkunci sehingga sekatan tamat — pulihkan akses melalui konsol web penyedia anda (VNC atau serial), yang tidak menggunakan SSH, dan sama ada tunggu sehingga bantime tamat atau jalankan arahan unban di sana.
Langkah 7: Jadikan ban kekal dan meningkat
Fail2ban menyimpan ban aktif dalam pangkalan data SQLite kecil di /var/lib/fail2ban/fail2ban.sqlite3, supaya ban tersebut tidak hilang selepas perkhidmatan dimulakan semula atau selepas reboot. Baris bantime.increment yang telah anda tambah akan menukarkan setiap pesalah berulang menjadi masalah yang semakin meningkat bagi mereka — meningkat kira-kira dua kali ganda daripada satu jam sehingga satu minggu.
Untuk polisi "tiga kali kesalahan" pada peringkat sistem, Fail2ban menyediakan jail recidive yang memantau /var/log/fail2ban.log miliknya sendiri dan memberikan ban yang lama kepada mana-mana alamat yang telah di-ban berulang kali merentasi semua jail. Oleh sebab [DEFAULT] anda kini menggunakan backend systemd, tetapkan jail ini kembali ke fail log yang sepatutnya dibaca:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5backend = auto dengan logpath yang eksplisit memastikan recidive terus membaca fail2ban.log biasa, iaitu tempat di mana baris Ban yang dikira itu muncul — tetapan lalai systemd yang anda tetapkan secara global akan menghalakan ia ke journal, di mana baris tersebut tidak wujud.
Step 8: Pasangkan dengan SSH berasaskan kunci sahaja, atau lebih baik lagi, VPN
Fail2ban hanya berfungsi secara optimum apabila menggunakan pengesahan kunci. Di dalam fail konfigurasi 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. Apabila kata laluan ditutup, serangan brute force tidak akan berjaya; Fail2ban kemudian berfungsi untuk mengurangkan gangguan log dan menghalau pengimbas lebih awal. Lebih selamat lagi adalah dengan memastikan SSH tidak terdedah kepada internet awam sepenuhnya: letakkan SSH di belakang 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 akan menjadi pelindung tambahan dan bukannya barisan hadapan.
Fail2ban bukan hanya untuk SSH. Sebarang perkhidmatan yang merekodkan kegagalan log masuk boleh menggunakan jail — seperti pelayan e-mel, tapak nginx, atau pengurus kata laluan Vaultwarden yang dihoskan sendiri yang log masuk webnya tidak mahu anda biarkan terdedah kepada serangan credential stuffing. Sebaik sahaja aplikasi web berada di belakang tapak nginx dengan sijil Let's Encrypt, halakan penapis Fail2ban ke log aksesnya sama seperti jail SSH menghala ke journal.
Mod kegagalan, dengan rentetan teks tepat yang akan anda lihat
"Have not found any log file for sshd jail", dan Fail2ban tidak akan bermula. Ini adalah masalah auth.log yang lama, dan pada Ubuntu 24.04 anda hanya akan mengalaminya 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, sshd jail tidak dapat mencari lognya dan keseluruhan daemon akan terhenti. fail2ban.log menunjukkan:
ERROR Failed during configuration: Have not found any log file for sshd jailKerana ralat itu adalah fatal, perkhidmatan tidak akan bermula, 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 melakukannya untuk anda, membaiki kedua-dua mesej tersebut sekaligus.
Jail adalah aktif tetapi Total failed tidak pernah bergerak. Daemon sedang berjalan dan journal sedang dibaca, namun kegagalan sebenar bertimbun dalam journalctl -u ssh manakala penghitung kekal pada 0. Pertama, ketepikan perkara yang jelas: anda sedang menguji dari alamat yang disenaraikan dalam ignoreip, jadi kegagalan anda sendiri dikecualikan secara reka bentuk. Jika bukan itu puncanya, anda menggunakan binaan OpenSSH di mana worker bagi setiap sambungan adalah sshd-session (9.8 dan kemudiannya), yang mana journal _COMM adalah sshd-session, bukan sshd, jadi padanan yang dibekalkan terlepas daripadanya. Luaskan padanan dalam blok [sshd]:
[sshd]
enabled = true
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-sessionMulakan semula, gagalkan log masuk dengan sengaja dari alamat yang tidak ada dalam ignoreip, dan sahkan Total failed akhirnya meningkat.
Anda telah menyekat diri sendiri: Connection refused. Anda meninggalkan 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, berbanding masa tamat senyap, adalah keputusan reject lalai tindakan nftables yang sedang berfungsi — terhadap anda. Baiki seperti dalam Langkah 6: nyahsekat dari sesi pada alamat lain yang tidak disekat, atau dari konsol pembekal — sesi yang sudah dibuka dari alamat yang disekat juga akan membeku. Kemudian tambahkan alamat anda ke dalam ignoreip supaya ia tidak berlaku lagi.
Fail2ban menyatakan sesuatu alamat telah disekat, tetapi ia masih boleh menyambung. Penghitung dalam status sshd meningkat, namun alamat tersebut masih boleh mencapai port 22. Ini adalah ketidakpadanan antara tindakan sekatan-berbanding-firewall, dan pada Ubuntu 24.04 ia hampir selalu bermaksud anda telah mengatasi 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'Padam override tersebut dan biarkan tindakan nftables pakej asal digunakan, atau, jika anda mengurus firewall sepenuhnya melalui ufw dan mahu sekatan muncul 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 mengedit jail.local. Kesalahan taip — tajuk yang tersasar atau nilai masa yang salah — menyebabkan perkhidmatan enggan bermula. Minta Fail2ban untuk menyemak konfigurasi sebelum ia berjalan:
sudo fail2ban-client -tIa menamakan fail dan jail yang bermasalah, contohnya Errors in jail 'sshd'. Skipping..., supaya anda boleh membaiki punca masalah dan bukannya meneka.
FAQ
Adakah pemasangan Fail2ban asal pada Ubuntu 24.04 benar-benar menyekat serangan SSH?
Ya. Pakej ini menyertakan /etc/fail2ban/jail.d/defaults-debian.conf, yang mengaktifkan jail sshd, menetapkan backend = systemd supaya ia membaca systemd journal dan bukannya /var/log/auth.log yang tiada, serta menetapkan banaction = nftables supaya sekatan dikuatkuasakan melalui firewall sebenar Ubuntu. Konfigurasi apt install fail2ban yang ringkas melindungi SSH bermula dari but pertama. Sahkan dengan sudo fail2ban-client status sshd dan cari nilai Total failed yang bukan sifar.
Mengapa Fail2ban tidak menyekat apa-apa pada pelayan saya?
Selesaikan tiga punca biasa mengikut urutan. Anda mungkin sedang menguji dari alamat dalam ignoreip, yang dikecualikan secara reka bentuk. Anda mungkin telah menukar tetapan asal 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 kontena yang tidak mempunyai systemd journal untuk dibaca. Semak Total failed dalam fail2ban-client status sshd: jika nilainya tidak meningkat manakala journalctl -u ssh menunjukkan kegagalan sebenar, jail tersebut membaca lokasi yang salah.
Bagaimanakah cara untuk menyahsekat (unban) alamat IP saya sendiri?
Jalankan sudo fail2ban-client set sshd unbanip YOUR.IP.HERE, yang akan memulangkan 1 jika berjaya, atau sudo fail2ban-client unban --all untuk memadam semua sekatan. Jika anda terkunci daripada SSH, gunakan konsol web atau VNC pembekal anda untuk menjalankan arahan yang sama — sekatan tersebut menolak setiap paket dari alamat anda ke port 22, jadi sesi yang sudah dibuka pun akan terhenti. Kemudian, tambahkan alamat anda ke dalam ignoreip supaya ia tidak berulang.
Apakah perbezaan antara jail.conf dan jail.local?
jail.conf mengandungi tetapan asal Fail2ban dan akan ditindih pada setiap kemas kini pakej, jadi sebarang suntingan di situ akan hilang. Pakej Debian/Ubuntu menambah tetapan sendiri melalui jail.d/defaults-debian.conf. Perubahan anda harus diletakkan dalam jail.local, yang dibaca paling akhir dan mengatasi kedua-duanya, serta tidak akan disentuh semasa kemas kini. Biarkan jail.conf sebagai rujukan sahaja.
Adakah Fail2ban menggantikan pengesahan SSH berasaskan kunci?
Tidak. Fail2ban mengehadkan kadar kegagalan berulang dari satu alamat; ia tidak berkesan terhadap serangan tekaan teragih yang perlahan di mana setiap alamat kekal di bawah had. Pengesahan kunci sahaja (PasswordAuthentication no) menjadikan tekaan kata laluan mustahil sepenuhnya, manakala Fail2ban pula mengurangkan gangguan log dan menghalau pengimbas lebih awal. Gunakan kedua-duanya, dan sebaik-baiknya jangan dedahkan SSH kepada internet awam sepenuhnya.