Pasang Fail2ban Ubuntu 24.04 untuk Hentikan Bot SSH
Di Ubuntu 24.04, arahan apt install biasa sudah menyekat brute force SSH. Semak fail2ban-client status sshd dan baiki jika Total failed kekal 0.
Perkara yang sebenarnya dilakukan oleh Fail2ban
Fail2ban ialah daemon yang membaca log. Ia memantau mesej pengesahan SSH anda. Selepas beberapa percubaan gagal daripada satu alamat dalam tempoh yang singkat, Fail2ban menjalankan arahan firewall yang menyekat alamat tersebut buat sementara. Itulah keseluruhan konsepnya. Konfigurasinya hanya sekitar tiga puluh baris dalam satu fail. Pada Ubuntu 24.04, pemasangannya hanya memerlukan satu arahan apt. Arahan itu memberikan perlindungan sebelum anda mengubah apa-apa.
Fahami perkara yang boleh dan tidak boleh dilakukan olehnya. Fail2ban tidak mengesahkan identiti sesiapa, tidak menyulitkan apa-apa dan tidak menghentikan satu percubaan log masuk yang bersungguh-sungguh. Ia hanya menyekat percubaan berulang daripada sumber yang sama. Fail2ban ialah penapis hingar dan pengehad kadar, bukan kunci. Tugasnya adalah untuk menghentikan imbasan latar belakang berterusan pada port 22 daripada membazirkan CPU, lebar jalur dan ruang log anda. Ia juga memperlahankan penyerang yang perlu menyerang dari satu alamat pada satu-satu masa.
Perkara yang tidak digantikan oleh Fail2ban
Fail2ban ialah lapisan ketiga, bukan lapisan pertama. Jika pelayan anda masih menerima kata laluan SSH, botnet yang tersebar merentasi ribuan alamat boleh terus mencuba, kerana setiap alamat kekal di bawah ambang sekatan anda dan tidak pernah mencetuskannya. Pertahanan sebenar terhadap keadaan ini ialah pengesahan menggunakan kunci sahaja, yang menjadikan cubaan meneka kata laluan mustahil tanpa mengira jumlah percubaan yang dibuat. Fail2ban yang digunakan bersama pengesahan menggunakan kunci sahaja memberikan dua manfaat: mengurangkan bunyi brute-force dalam log dan menyingkirkan pengimbas lebih awal supaya mereka berhenti membebankan port tersebut. Anggapnya sebagai pertahanan berlapis. Fail2ban berada di belakang pengesahan kunci dan firewall, bukan di hadapan kedua-duanya.
Prasyarat dan realiti Ubuntu 24.04
Anda memerlukan VPS yang menjalankan Ubuntu 24.04 dengan akses root atau sudo, serta SSH yang sudah berfungsi, sebaik-baiknya menggunakan pengesahan berasaskan kunci. Fail2ban menggunakan sumber yang rendah: hanya beberapa puluh megabait RAM dan tidak memerlukan pelarasan had.
Kini bahagian yang sering disalahterapkan oleh panduan lama. Selama bertahun-tahun, nasihat standard ialah "pasang Fail2ban, kemudian tambah backend = systemd, kerana Ubuntu berhenti menulis /var/log/auth.log." Nasihat itu menerangkan perubahan yang benar: imej pelayan dan awan moden diedarkan tanpa rsyslog, jadi log SSH hanya ditulis ke journal systemd dan fail teks itu sudah tiada. Namun, pada Ubuntu 24.04, pakej Fail2ban sudah mengendalikannya. Pakej tersebut memasang /etc/fail2ban/jail.d/defaults-debian.conf, dan fail itu, bukannya nilai lalai upstream, ialah konfigurasi yang sebenarnya digunakan oleh pelayan anda:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueBaca bahagian ini dengan teliti kerana ia menjawab dua persoalan sebelum anda mengubah 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 sebenarnya digunakan oleh Ubuntu 24.04, bukannya iptables legasi. Selain itu, [sshd] enabled = true bermaksud jail tersebut diaktifkan sejak boot pertama. Kesimpulannya: apt install fail2ban lalai pada Ubuntu 24.04 menyekat percubaan brute-force terhadap SSH tanpa konfigurasi tambahan. Kebanyakan kerja anda ialah mengesahkan keadaan itu, melaraskan dasar dan memastikan anda tidak terkunci daripada pelayan sendiri.
Perangkap auth.log lama masih berlaku dalam tiga situasi, dan anda perlu mengenal pastinya: anda memasang Fail2ban dengan pip dan bukannya apt, jadi defaults-debian.conf tidak wujud; anda berada dalam kontena tanpa keistimewaan yang tidak mempunyai journal systemd untuk dibaca; atau anda mengikuti tutorial lama lalu menampal backend = auto ke dalam jail.local sendiri, sekali gus mengatasi nilai lalai yang berfungsi. Bahagian mod kegagalan menunjukkan dengan tepat rupa setiap situasi tersebut.
Langkah 1: Pasang dan sahkan bahawa ia sudah menyekat
sudo apt update
sudo apt install -y fail2banUbuntu 24.04 menyediakan Fail2ban 1.0.2, dan pakej ini menarik masuk python3-systemd sebagai kebergantungan wajib. Oleh itu, backend journal sudah mempunyai semua yang diperlukan. Servis diaktifkan dan dimulakan secara automatik:
sudo systemctl status fail2banAnda mahu melihat active (running). Kemudian semak jail yang sudah menjalankan tugasnya:
sudo fail2ban-client status sshdPada VPS awam yang boleh dicapai walaupun hanya selama beberapa minit, anda selalunya sudah dapat melihat kegagalan yang dikira dan alamat yang disekat. Imbasan Internet terhadap port 22 berlaku secara berterusan. Itu membuktikan bahawa konfigurasi lalai berfungsi. Mulai sini, anda hanya memperkemas konfigurasi tersebut, bukannya membinanya dari awal.
Langkah 2: Edit jail.local, jangan edit jail.conf
Fail2ban menyimpan nilai lalai daripada upstream dalam /etc/fail2ban/jail.conf. Jangan edit fail itu. Setiap apt upgrade pakej boleh menggantikannya, dan perubahan anda akan hilang tanpa sebarang amaran. Fail2ban membaca fail mengikut susunan tetap: jail.conf dahulu, kemudian semua fail dalam jail.d/, dan akhirnya jail.local. Nilai terakhir akan digunakan. Fail .local ialah fail anda, dan naik taraf pakej tidak akan mengubahnya. Peraturan yang sama terpakai pada penapis. Fail *.local akan menggantikan filter.d/*.conf yang disertakan bersama pakej.
Oleh itu, anda hanya perlu menulis jail.local kecil yang menggantikan beberapa tetapan yang diperlukan. Biarkan jail.conf dan jail.d/defaults-debian.conf yang disertakan bersama pakej tanpa 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 alamat IP awam 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 mempunyai tujuan:
bantime,findtimedanmaxretryialah dasar. Nilai lalai yang disertakan,bantime, hanya sepuluh minit; satu jam ialah tempoh minimum yang lebih munasabah. Lima kegagalan daripada satu alamat dalam tempoh sepuluh minit akan menyebabkan alamat itu disekat. Pengguna sebenar mungkin tersalah taip kata laluan sekali atau dua kali; lima kegagalan dalam sepuluh minit biasanya menunjukkan skrip.ignoreipialah perlindungan anda. Masukkan alamat awam yang anda gunakan untuk menyambung dari sini supaya Fail2ban tidak dapat menyekat anda daripada pelayan sendiri. Sambungan rumah dengan IP yang berubah-ubah ialah sebab untuk memilih pendekatan VPN di bahagian akhir, bukannya sebab untuk mengabaikan baris ini.bantime.increment = truemenjadikan setiap sekatan berulang lebih lama daripada sekatan sebelumnya: satu jam, kemudian dua jam, kemudian empat jam, sehinggabantime.maxtime. Alamat yang terus kembali akan disekat secara berperingkat untuk tempoh yang lebih lama.
Cari alamat yang hendak dimasukkan dalam senarai dibenarkan daripada mesin yang anda gunakan untuk SSH dari, bukan daripada pelayan:
curl -s ifconfig.meAnda boleh menjana jail.local yang disesuaikan dengan port dan dasar sekatan anda di sini, kemudian menampalnya ke dalam fail:
Langkah 4: Mulakan semula dan sahkan bahawa journal sedang dibaca
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t menjalankan ujian konfigurasi terlebih dahulu. Oleh itu, kesilapan taip dalam jail.local akan menyebabkan kegagalan yang jelas di sini, bukannya membiarkan servis terhenti tanpa maklumat. 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 lebih besar daripada sifar atau meningkat apabila anda sengaja menggagalkan log masuk dari mesin lain, journal sedang dibaca dan anda telah selesai. Jika nilainya kekal pada 0 walaupun anda menggagalkan log masuk berkali-kali, dan anda pasti bahawa anda tidak menguji dari alamat dalam ignoreip, teruskan ke mod kegagalan di bawah.
Perhatikan bahawa baris Journal matches masih menamakan sshd.service. Pada Ubuntu, unit SSH sebenarnya ialah ssh.service, tetapi filter yang disertakan turut sepadan dengan _COMM=sshd. OpenSSH pada 24.04 pula merekodkan kegagalannya daripada proses bernama sshd, jadi padanan tersebut berfungsi. Perincian ini hanya penting jika anda menggunakan OpenSSH yang lebih baharu (9.8 atau lebih tinggi, apabila worker bagi setiap sambungan ialah sshd-session); mod kegagalan merangkumi kes tersebut.
Langkah 5: Pantau sekatan sebenar, atau paksa satu sekatan untuk ujian
Sekatan sebenar akan berlaku sendiri dalam masa beberapa minit pada mana-mana VPS awam. Untuk memantau sekatan, ikuti log:
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 menguji keseluruhan mekanisme tanpa menunggu, sekat alamat dokumentasi secara manual. Jangan sekali-kali gunakan alamat sendiri:
sudo fail2ban-client set sshd banip 10.0.0.66Perintah ini mencetak 1, dan alamat tersebut muncul di bawah Banned IP list dalam fail2ban-client status sshd. Sekarang sahkan bahawa sekatan itu benar-benar wujud dalam firewall. Pada Ubuntu 24.04, firewall yang digunakan ialah nftables, bukan iptables:
sudo nft list table inet f2b-tableAnda akan melihat set bernama addr-set-sshd yang mengandungi 10.0.0.66, serta rantaian f2b-chain yang menolak sebarang sumber dalam set tersebut. Jika fail2ban-client menyatakan bahawa sesuatu alamat telah disekat tetapi tiada apa-apa muncul dalam nft list, tindakan sekatan anda tidak sepadan dengan firewall. Rujuk nota nftables/iptables dalam bahagian mod kegagalan.
Langkah 6: Nyahlarang alamat anda sendiri dan pulihkan akses jika terkunci
Jika anda melarang alamat yang tidak sepatutnya, termasuk alamat anda sendiri, buang larangan itu:
sudo fail2ban-client set sshd unbanip 10.0.0.66Perintah ini mengembalikan 1 jika berjaya. Untuk mengosongkan semua larangan merentas semua jail:
sudo fail2ban-client unban --allJangan bergantung pada sesi SSH yang sudah terbuka untuk menyelamatkan anda: larangan nftables menolak setiap paket daripada alamat yang dilarang ke port 22, termasuk sambungan yang telah diwujudkan. Oleh itu, sesi sedia ada akan terhenti sebaik sahaja larangan dikenakan. Jika anda melarang alamat sendiri dan tiada entri ignoreip, anda akan terkunci sehingga larangan itu tamat. Pulihkan akses melalui konsol web penyedia anda (VNC atau serial), yang tidak melalui SSH, kemudian tunggu sehingga bantime tamat atau jalankan perintah nyahlarang di situ.
Langkah 7: Jadikan sekatan kekal dan tingkatkan tempohnya
Fail2ban menyimpan sekatan aktif dalam pangkalan data SQLite kecil di /var/lib/fail2ban/fail2ban.sqlite3, jadi sekatan tersebut kekal selepas servis dimulakan semula atau pelayan reboot; anda tidak kehilangannya. Baris bantime.increment yang anda tambahkan sebelum ini menjadikan setiap pelaku berulang menghadapi tempoh sekatan yang semakin panjang, kira-kira berganda daripada satu jam hingga hampir satu minggu.
Untuk melaksanakan dasar "tiga kesalahan" pada seluruh sistem, Fail2ban menyediakan jail recidive yang memantau /var/log/fail2ban.log sendiri dan mengenakan sekatan panjang kepada mana-mana alamat yang telah disekat berulang kali merentas semua jail. Memandangkan [DEFAULT] anda kini menggunakan backend systemd, tetapkan jail ini kembali kepada fail log yang direka bentuk untuk dibacanya:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5backend = auto dengan logpath yang dinyatakan secara jelas memastikan recidive membaca fail2ban.log biasa. Di situlah baris Ban yang dikiranya sebenarnya muncul. Tetapan lalai systemd yang anda tetapkan secara global akan menghala recidive ke journal, sedangkan baris tersebut tidak terdapat di situ.
Langkah 8: Padankan dengan SSH yang hanya menggunakan kunci, atau lebih baik, VPN
Fail2ban hanya benar-benar berguna bersama pengesahan menggunakan 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. Selepas kata laluan dimatikan, serangan brute force langsung tidak dapat berjaya. Fail2ban kemudiannya berfungsi untuk mengurangkan hingar log dan mengusir pengimbas lebih awal. Pilihan yang lebih kukuh ialah memastikan SSH tidak terdedah kepada internet awam langsung: letakkan SSH di belakang VPN WireGuard yang dihos sendiri dan tetapkan firewall supaya port 22 hanya menjawab melalui terowong tersebut. Tiada sesiapa boleh melakukan brute force terhadap port yang tidak dapat dicapai, dan Fail2ban menjadi lapisan perlindungan tambahan, bukan pertahanan utama.
Fail2ban bukan hanya untuk SSH. Mana-mana servis yang merekodkan percubaan log masuk yang gagal boleh diberikan jail, termasuk pelayan mel, tapak nginx atau pengurus kata laluan Vaultwarden yang dihos sendiri yang log masuk webnya tidak wajar dibiarkan terbuka kepada credential stuffing. Selepas aplikasi web ditempatkan di belakang tapak nginx dengan sijil Let's Encrypt, halakan penapis Fail2ban kepada access lognya dengan cara yang sama seperti jail SSH dihalakan kepada journal.
Mod kegagalan, dengan rentetan tepat yang akan anda lihat
"Have not found any log file for sshd jail", dan Fail2ban tidak akan bermula. Ini ialah masalah auth.log lama. Pada Ubuntu 24.04, masalah ini hanya berlaku jika sesuatu telah mengatasi lalai pakej, pemasangan pip tanpa defaults-debian.conf, bekas 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 lalu seluruh daemon dihentikan. fail2ban.log memaparkan:
ERROR Failed during configuration: Have not found any log file for sshd jailOleh sebab ralat itu membawa maut, servis tidak pernah bermula. fail2ban-client status kemudian melaporkan gejala susulan:
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?Baris "socket path" itu tidak bermaksud Fail2ban rosak. Maksudnya, Fail2ban tidak bermula kerana satu jail tidak dapat mencari lognya. Menetapkan backend = systemd dalam [DEFAULT], yang sudah dilakukan oleh pakej Ubuntu untuk anda, membetulkan kedua-dua mesej itu serentak.
Jail aktif tetapi Total failed tidak pernah berubah. Daemon sedang berjalan dan journal sedang dibaca, tetapi kegagalan sebenar bertambah dalam journalctl -u ssh sementara pembilang kekal pada 0. Mula-mula singkirkan punca yang jelas: anda menguji daripada alamat yang disenaraikan dalam ignoreip, jadi kegagalan anda sendiri dikecualikan mengikut reka bentuk. Jika bukan itu puncanya, anda menggunakan binaan OpenSSH yang pekerja bagi setiap sambungan ialah sshd-session (9.8 dan lebih baharu). Dalam binaan ini, journal _COMM ialah sshd-session, bukan sshd, jadi padanan yang dihantar tidak sepadan. 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 tiada dalam ignoreip, dan sahkan bahawa Total failed akhirnya meningkat.
Anda menyekat alamat sendiri: Connection refused. Anda tidak memasukkan alamat sendiri dalam ignoreip, menguji beberapa log masuk yang salah, dan kini:
ssh: connect to host 10.0.0.10 port 22: Connection refusedPenolakan itu, bukannya tamat masa secara senyap, ialah verdict lalai reject bagi tindakan nftables yang berfungsi seperti sepatutnya terhadap anda. Baikinya seperti dalam Langkah 6: nyahsekat daripada sesi pada alamat lain yang tidak disekat, atau daripada konsol penyedia. Sesi yang sudah dibuka daripada alamat yang disekat juga akan tergantung. Kemudian tambahkan alamat anda ke ignoreip supaya perkara ini tidak berlaku lagi.
Fail2ban menyatakan alamat telah disekat, tetapi alamat itu masih boleh bersambung. Pembilang dalam status sshd meningkat, tetapi alamat itu masih mencapai port 22. Ini ialah ketidakpadanan antara tindakan sekatan dengan firewall. Pada Ubuntu 24.04, hampir semua kes bermaksud anda telah mengatasi banaction = nftables yang berfungsi dengan banaction = iptables-multiport yang disalin daripada panduan lama, pada pelayan yang tiada lapisan iptables. fail2ban.log memaparkan:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'Padamkan penggantian itu dan biarkan tindakan nftables yang disediakan oleh pakej digunakan. Jika anda mengurus firewall sepenuhnya melalui ufw dan mahu sekatan dipaparkan di situ, tetapkan banaction = ufw dalam [DEFAULT]. Mulakan semula dan sahkan bahawa peraturan itu muncul dengan sudo nft list ruleset | grep f2b.
Fail2ban tidak akan bermula selepas jail.local diedit. Kesilapan taip, heading tersasar atau nilai masa yang tidak sah menyebabkan servis enggan bermula. Minta Fail2ban menyemak konfigurasi sebelum servis dijalankan:
sudo fail2ban-client -tFail dan jail yang bermasalah akan dinamakan, contohnya Errors in jail 'sshd'. Skipping.... Dengan itu, anda boleh membaiki sumber konfigurasi dan tidak perlu membuat andaian.
FAQ
Adakah pemasangan Fail2ban standard pada Ubuntu 24.04 benar-benar menyekat serangan SSH?
Ya. Pakej tersebut disertakan dengan /etc/fail2ban/jail.d/defaults-debian.conf, yang mengaktifkan jail sshd, menetapkan backend = systemd supaya membaca journal systemd dan bukannya /var/log/auth.log yang tiada, serta menetapkan banaction = nftables supaya sekatan dikuatkuasakan melalui firewall sebenar Ubuntu. apt install fail2ban biasa melindungi SSH sejak boot pertama. Sahkan dengan sudo fail2ban-client status sshd dan cari nilai bukan sifar pada Total failed.
Mengapakah Fail2ban tidak menyekat apa-apa pada pelayan saya?
Singkirkan tiga punca biasa mengikut urutan. Anda mungkin sedang menguji dari alamat dalam ignoreip, yang dikecualikan secara lalai. Anda mungkin telah menggantikan konfigurasi lalai yang berfungsi dengan menampal backend = auto ke dalam jail.local berdasarkan panduan lama. Tindakan ini memecahkan pembacaan journal pada image yang tidak mempunyai auth.log. Atau anda mungkin berada 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 membaca sumber yang salah.
Bagaimanakah saya membuang sekatan pada alamat IP sendiri?
Jalankan sudo fail2ban-client set sshd unbanip YOUR.IP.HERE, yang mengembalikan 1 jika berjaya, atau gunakan sudo fail2ban-client unban --all untuk membuang semua sekatan. Jika anda terkunci daripada SSH, gunakan konsol web atau konsol VNC daripada provider anda untuk menjalankan arahan yang sama. Sekatan itu menolak setiap paket daripada alamat anda ke port 22, jadi sesi yang sudah dibuka juga akan berhenti berfungsi. Kemudian tambahkan alamat anda ke ignoreip supaya perkara ini tidak berulang.
Apakah perbezaan antara jail.conf dengan jail.local?
jail.conf menyimpan lalai upstream Fail2ban dan ditulis semula pada setiap naik taraf pakej. Oleh itu, sebarang perubahan di situ akhirnya akan hilang. Pakej Debian/Ubuntu menindih tetapan tersebut dengan tetapan sendiri melalui jail.d/defaults-debian.conf. Letakkan perubahan anda dalam jail.local. Fail ini dibaca terakhir dan mengatasi kedua-dua tetapan tersebut, serta tidak disentuh semasa naik taraf. Biarkan jail.conf sebagai rujukan baca sahaja.
Adakah Fail2ban menggantikan pengesahan SSH berasaskan key?
Tidak. Fail2ban mengehadkan kadar kegagalan berulang daripada satu alamat. Ia tidak melindungi daripada percubaan perlahan dan teragih apabila setiap alamat kekal di bawah ambang. Pengesahan menggunakan key sahaja (PasswordAuthentication no) menjadikan percubaan meneka kata laluan mustahil secara langsung. Fail2ban kemudian mengurangkan gangguan dalam log dan menyingkirkan pengimbas lebih awal. Gunakan kedua-duanya dan, sebaik-baiknya, jangan dedahkan SSH kepada internet awam langsung.