Reference

fail2ban versions and changelog

The current stable release is fail2ban 1.1.1, released on 2026-08-15. Here is how to check what you run, what changed, what your distribution ships and how to upgrade.

Updated 12 min readChecked against fail2ban 1.1.1

The latest fail2ban version is 1.1.1 ("triple-one-win"), released on 2026-08-15. Check the version you have with fail2ban-client --version. Most distributions ship older releases: Ubuntu 24.04 LTS and Debian 12 have 1.0.2, Debian 13 and EPEL 9/10 have 1.1.0, and Debian testing/sid has 1.1.1. fail2ban 1.1.x needs Python 3.5 or newer.

output
$ sudo fail2ban-client --version
Fail2Ban v1.1.1

Check the installed fail2ban version#

bash
fail2ban-client --version        # Fail2Ban v1.1.1
fail2ban-client -V               # short, machine-readable
sudo fail2ban-client version     # asks the running server

--version reports the installed client; version (no dashes) asks the running server, which differs after an upgrade until you restart the service.

Package managers show the installed and available versions:

bash
apt policy fail2ban

fail2ban version by distribution#

Distribution fail2ban version
Ubuntu 26.04 LTS (resolute) 1.1.0
Ubuntu 25.10 1.1.0
Ubuntu 24.04 LTS 1.0.2
Ubuntu 22.04 LTS 0.11.2
Ubuntu 20.04 LTS 0.11.1
Debian testing / sid 1.1.1
Debian 13 (trixie) 1.1.0
Debian 12 (bookworm) 1.0.2
Debian 11 (bullseye) 0.11.2
Fedora 1.1.0
EPEL 9 and 10 (RHEL, Rocky, AlmaLinux) 1.1.0
EPEL 8 1.0.2

Distributions backport security fixes into their own package versions, so 1.0.2-3ubuntu0.1 on Ubuntu 24.04 is not the same as upstream 1.0.2. Install guides: Ubuntu, Debian, RHEL family.

What's new in fail2ban 1.1.1#

The highlights for administrators:

  • Default ban action moved to paths-*.conf. The stock config now uses nftables on Debian, Fedora, Arch and openSUSE and pf on FreeBSD and macOS. Override it in jail.local as before.
  • Debian paths switch sshd and postfix to the systemd backend.
  • sshd filter matches the sshd-session process name used since OpenSSH 9.8.
  • Automatic journal fallback: with backend = auto, a jail whose logpath finds no file but whose filter has a journalmatch switches to systemd (systemd_if_nologs, on by default). New skip_if_nologs lets fail2ban start with a jail skipped instead of failing.
  • systemd backend rotated option (default off) to cut the number of open journal files.
  • ignoreip accepts file:/path lists, also for addignoreip.
  • systemd socket activation with an optional fail2ban.socket unit.
  • iptables action rewritten to support several chains (chain = INPUT,FORWARD); custom actions based on it may need updating.
  • nftables sets accept CIDR ranges (flags interval), so subnet bans work.
  • New filters and jails for Vaultwarden, OpenVPN and XRDP; Dovecot 2.4 and Proxmox web GUI support.
  • Security fix: catastrophic regex backtracking in the domino-smtp and dovecot filters (GHSA-33wh-ccjc-p397).
  • exim filter: risky rules moved from normal to a new more mode.

The full upstream changelog for 1.1.1:

Compatibility#

  • action.d/iptables.conf rewritten due to support of multiple chains (gh-3909), therefore user-level derivations (action including iptables-based action) may become incompatible, e. g. some tags if used need to be replaced, e. g. <chain> with $chain or <_ipt_for_proto-iter> with <_ipt-iter>;
  • filter.d/exim.conf - several rules of mode normal moved to new mode more, because of too risky handling (see gh-3940), to use it as before set mode = more for exim jail, but be aware of the consequences.

Fixes#

  • fixes catastrophic backtracking explosion for REs in domino-smtp and dovecot filters (GHSA-33wh-ccjc-p397, gh-4221)
  • fixes systemd bug with missing journal descriptor after rotation by reopening of journal if it is recognized as not alive (gh-3929)
  • improve threaded clean-up of all filters, new thread functions afterStop (to force clean-up after stop) and done, invoking afterStop once
  • ensure journal-reader is always closed (additional prevention against leaks and "too many open files"), thereby avoid sporadic segfault in systemd module (see https://github.com/systemd/python-systemd/issues/143)
  • fixes systemd causing "too many open files" error for a lot of journal files and large amount of systemd jails (see new parameter rotated below, gh-3391);
  • passing of arguments from jails to action or filter will affect conditional section too (gh-4069), e. g. setting blocktype="DROP" via jail for action would now apply for IPv4 and IPv6 chains, to submit different blocktype for IPv4 and IPv6 from jail, one can pass them like in this example: banaction = iptables-ipset[blocktype="...", blocktype?family=inet6="..."]
  • jail.conf:
  • default banactions need to be specified in paths-*.conf (maintainer level) now
  • since stock fail2ban includes paths-debian.conf by default, banactions are nftables (can be overwritten in jail.local by user)
  • paths-common.conf:
  • changed default mysql_log path (default logpath of mysqld-auth jail without maintainer overrides, gh-3932)
  • paths-debian.conf:
  • default banactions are nftables
  • sshd backend switched to systemd (gh-3292)
  • postfix backend switched to systemd (gh-3527)
  • action.d/firewallcmd-ipset.conf:
  • rename ipsettype to ipsetbackend (gh-2620), parameter ipsettype will be used now to the real set type (gh-3760)
  • action.d/nftables.conf:
  • action fixed for SELinux without execmem permission, rewrite capturing with grep -P using grep -E or sed (PCRE-JIT by grep -P may cause SELinux denial for execmem, see gh-4137)
  • action.d/xarf-login-attack.conf - ignore errors or warnings in output of dig provided as comment (gh-4068)
  • filter.d/apache-badbots.conf, filter.d/apache-fakegooglebot.conf:
  • regexs rewritten more strict (removed catch-alls, etc);
  • regexs fixed to match lines with vhost in accesslog (gh-1594)
  • filter.d/apache-noscript.conf - consider new log-format with "AH02811: stderr from /..." (gh-3900)
  • filter.d/apache-overflows.conf - consider AH10244: invalid URI path (gh-3778, gh-3900)
  • filter.d/asterisk.conf - fixed RE for "no matching endpoint" with retry info (like after X tries in Y ms) at end, loosening of end anchor (ignore any simple text tokens at end if no single quote found), gh-4037
  • filter.d/exim.conf:
  • several rules of mode normal moved to new mode more, because of too risky handling (gh-3940), thereby mode aggressive is not affected, because it fully includes mode more now;
  • mode aggressive extended to catch dropped by ACL failures, e.g. "ACL: Country is banned"
  • filter.d/freeswitch.conf - bypass some new info in prefix before [WARNING] (changed default _pref_line), FreeSWITCH log line prefix has changed in newer versions (gh-3143)
  • filter.d/lighttpd-auth.conf - fixed regex (if failures generated by systemd-journal), bypass several prefixes now (gh-3955)
  • filter.d/postfix.conf:
  • extended prefregex to capture username in postfix SASL failures (gh-4165)
  • consider CONNECT and other rejected commands as a valid _pref (gh-3800)
  • default _daemon in prefix-line is loosened - can match everything starting with word postfix, like postfix-example.com/smtpd (gh-3297)
  • add optional NOQUEUE: prefix to ddos regex (gh-4072)
  • internal parameter _pref is renamed to _cmd, _pref matches now optional prefix like NOQUEUE: etc
  • modes ddos and aggressive extended to match rate limit exceeded for connection or message delivery request rates (gh-3265, gh-4073)
  • modes aggressive extended to match hostname does not resolve to address (gh-4218, gh-4078)
  • filter.d/dropbear.conf:
  • recognizes extra pid/timestamp if logged into stdout/journal, added journalmatch (gh-3597)
  • failregex extended to match different format of "Exit before auth" message (gh-3791)
  • filter.d/recidive.conf - restore possibility to set jail name in the filter, _jailname is positive now (gh-3769)
  • filter.d/roundcube-auth.conf - improved RE better matching log format of roundcube version 1.4+ (gh-3816)
  • filter.d/sendmail-reject.conf: (gh-4020)
  • support <F-MLFID> for BSD-style logfiles
  • add match for User unknown to default
  • the relay field may not always have a hostname before the ip address
  • mode aggressive enables match for lost input channel and Cannot resolve PTR record
  • filter.d/sshd.conf:
  • adapted to conform possible new daemon name sshd-session, since OpenSSH 9.8 several log messages will be tagged with as originating from a process named "sshd-session" rather than "sshd" (gh-3782)
  • ddos and aggressive modes: regex extended for timeout before authentication (optional connection from part, gh-3907)
  • filter.d/vsftpd.conf - fixed regex (if failures generated by systemd-journal, gh-3954)
  • filter.d/froxlor-auth.conf - updated the regex to the new logging situation for froxlor and changed logpath in jail.conf (gh-4075).

New Features and Enhancements#

  • fail2ban-server supports systemd socket activation (sd_listen_fds(3)); optional fail2ban.socket unit provided
  • backend systemd extended with new parameter rotated (default false, as prevention against "too many open files"), that allows to monitor only actual journals and ignore now a lot of rotated files by default; so can drastically reduce amount of used file descriptors, normally to 1 or 2 descriptors per jail (gh-3391)
  • new jail option skip_if_nologs to ignore jail if no logpath matches found, fail2ban continue to start with warnings/errors, thus other jails become running (gh-2756)
  • implements automatic switch backend = auto to backend systemd, when the following is true (RFE gh-3768):
  • no files matching logpath found for this jail;
  • no systemd_if_nologs = false is specified for the jail (true by default);
  • option journalmatch is set for the jail or its filter (otherwise it'd be too heavy to allow all auto-jails, even if they have never been foreseen for journal monitoring); (option skip_if_nologs will be ignored if we could switch backend to systemd)
  • configuration ignoreip and fail2ban-client commands addignoreip/delignoreip extended with file:... syntax to ignore IPs from file-ip-set (containing IP, subnet, dns/fqdn or raw strings); the file would be read lazy on demand, by first ban (and automatically reloaded by update after small latency to avoid expensive stats check on every compare); the entries inside the file can be separated by comma, space or new line with optional comments (text following chars # or ; after space or newline would be ignored up to next newline)
  • action.d/apprise.conf - updated to support tagging and other command line args (gh-4141)
  • action.d/*-ipset.conf:
  • parameter ipsettype to set type of ipset, e. g. hash:ip, hash:net, etc (gh-3760)
  • action.d/iptables.conf - action and few derivatives of it extended to handle multiple chains, e. g. would also accept chain = INPUT,FORWARD (gh-3909)
  • action.d/nftables.conf (gh-3291):
  • new parameter addr_options for addr-set (default flags interval\;, allows to store CIDR or address ranges); can be set to empty value to create simple addresses set (restore previous behavior).
  • action.d/firewallcmd-rich-*.conf - fixed incorrect quoting, disabling port variable expansion by substitution of rich rule (gh-3815)
  • filter.d/dovecot.conf:
  • add support for latest Dovecot 2.4 release (gh-4016)
  • mode aggressive covered new variant for no auth attempts in X secs with Login aborted and (no_auth_attempts)
  • mode aggressive extended to match disconnected during TLS handshake with no application protocol and no shared cipher
  • filter.d/nginx-http-auth.conf:
  • extended with prefregex to capture content of error only (bypass common prefix and suffix, like server, request, host, referrer);
  • extended to match PAM authentication failures (gh-4071)
  • modes fallback and aggressive extended to match more SSL failures by SSL_do_handshake or SSL_read (gh-4142, gh-2881)
  • filter.d/nginx-limit-req.conf - extended to ban hosts failed by limit connection in ngx_http_limit_conn_module (gh-3674, gh-4047)
  • filter.d/proxmox.conf - add support to Proxmox Web GUI (gh-2966)
  • filter.d/openvpn.conf - new filter and jail for openvpn recognizing failed TLS handshakes (gh-2702)
  • filter.d/sendmail-reject.conf - also recognize "Domain of sender address ... does not resolve" (gh-4035)
  • filter.d/vaultwarden.conf - new filter and jail for Vaultwarden (gh-3979)
  • filter.d/xrdp.conf - new filter for XRDP, an open source RDP server (gh-3254)
  • fail2ban-regex extended with new option -i or --invert to output not-matched lines by -o or --out (gh-4001)

What changed in 1.1.0#

1.1.0 (2024-04-25) set the minimum to Python 3.5, added support for Python 3.12 and 3.13, and added fail2ban-client status --all and fail2ban-client stats. fail2ban-regex started preferring a jail when given a bare name, so fail2ban-regex … sshd loads the jail's settings; use sshd.conf or filter.d/sshd to load only the filter. IPv6 detection became automatic (allowipv6 = auto).

fail2ban release history#

VersionReleasedRelease name
1.1.12026-08-15triple-one-win
1.1.02024-04-25object-found--norad-59479-cospar-2024-069a--altitude-36267km
1.0.22022-11-09finally-war-game-test-tape-not-a-nuclear-alarm
1.0.12022-09-27energy-equals-mass-times-the-speed-of-light-squared
0.11.22020-11-23heal-the-world-with-security-tools
0.11.12020-01-11this-is-the-way
0.10.52020-01-10deserve-more-respect-a-jedis-weapon-must
0.10.42018-10-04ten-four-on-due-date-ten-four
0.10.32018-04-04the-time-is-always-right-to-do-what-is-right
0.10.22018-01-18nothing-burns-like-the-cold
0.10.12017-10-12succeeded-before-friday-the-13th
0.10.02017-08-09long-awaited 0.10th version
0.10.0-alpha-12016-07-14ipv6-support-etc
0.9.82016-XX-XXXwanna-be-released
0.9.72017-05-11awaiting-victory
0.9.62016-12-10stretch-is-coming
0.9.52016-07-15old-not-obsolete
0.9.42016-03-08for-you-ladies

The 0.11 branch introduced incremental ban times (bantime.increment); 0.10 added IPv6 support. Both are out of upstream maintenance — distributions still on them (Ubuntu 22.04, Debian 11) patch only security issues.

Python version requirements#

fail2ban Python
1.1.0, 1.1.1 3.5 or newer (3.12 and 3.13 supported)
1.0.1, 1.0.2 2.7 or 3.x
0.11.x and older 2.6+/2.7 or 3.x

fail2ban has no required third-party Python modules. Optional ones: pyinotify (inotify backend), python3-systemd (journal backend), dnspython (cymru status flavor). On Python 3.12+, fail2ban bundles the removed asyncore/asynchat modules.

Upgrade fail2ban#

Before any upgrade, back up your local files and note the current version:

bash
sudo tar czf ~/fail2ban-etc-$(date +%F).tgz /etc/fail2ban
fail2ban-client --version

From your distribution#

bash
sudo apt update && sudo apt install --only-upgrade fail2ban   # Debian/Ubuntu
sudo dnf upgrade fail2ban                                     # Fedora/EPEL

This is the recommended path: you get security patches and your .local files are kept.

Newer than your distribution: upstream .deb#

The 1.1.1 GitHub release includes a Debian package, fail2ban_1.1.1-1.upstream2_all.deb. On Debian or Ubuntu:

bash
wget https://github.com/fail2ban/fail2ban/releases/download/1.1.1/fail2ban_1.1.1-1.upstream2_all.deb
sudo apt install ./fail2ban_1.1.1-1.upstream2_all.deb

The distribution's package then no longer receives updates through apt upgrade; watch the GitHub releases yourself.

From source (git)#

bash
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
git checkout 1.1.1
sudo python3 setup.py install

The scripts go to /usr/bin (or /usr/local/bin) and the configuration to /etc/fail2ban. The service unit isn't installed automatically: the build writes build/fail2ban.service, which you copy to /etc/systemd/system/. Remove the distro package first so two copies don't fight over the same files. fail2ban isn't published on PyPI, so pip install fail2ban won't give you the official release.

After upgrading#

bash
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client version

Watch /var/log/fail2ban.log for warnings about renamed or removed options.

Upgrading from 0.x to 1.x: compatibility notes#

  • Keep your changes in .local files. If you edited jail.conf or stock filters, move the changes to jail.local and filter.d/*.local before upgrading — the upgrade replaces the .conf files.
  • 1.0.1: option parsing for backend, filter and action became strict, so partially wrong values now raise an error instead of being ignored. The mail-whois fix for CVE-2021-32749 may need extra configuration with some mailers.
  • 0.11 → 1.x: actions that used <ip> to get a failure ID may need <fid> or <F-ID>; custom actions must fail cleanly in actionban/actionunban when their environment is broken.
  • 1.1.0: Python 2 is no longer supported.
  • 1.1.1: custom actions that include iptables.conf may need tag changes (<chain> → $chain); the exim filter's normal mode is narrower; default banaction comes from paths-*.conf, so a banaction set in jail.local still wins.

Test with sudo fail2ban-client -t after every upgrade, and read security advisories to see which fixes your version has.

FAQ#

What is the latest version of fail2ban?#

fail2ban 1.1.1, released on 2026-08-15 with the name "triple-one-win". The previous release was 1.1.0 from 2024-04-25. Development continues on the master branch as 1.1.2-dev. Releases are published on GitHub at github.com/fail2ban/fail2ban/releases.

How do I check my fail2ban version?#

Run fail2ban-client --version, which prints something like Fail2Ban v1.1.1. sudo fail2ban-client version asks the running server instead. Your package manager also shows it: apt policy fail2ban on Debian and Ubuntu, dnf info fail2ban on Fedora and RHEL-based systems.

Which fail2ban version does Ubuntu 24.04 have?#

Ubuntu 24.04 LTS ships fail2ban 1.0.2 (package 1.0.2-3ubuntu0.1), configured with nftables and the systemd backend by default. It lacks 1.1.x features like status --all, stats and ignoreip file lists. Ubuntu 25.10 and 26.04 LTS ship 1.1.0.

What Python version does fail2ban need?#

fail2ban 1.1.0 and 1.1.1 need Python 3.5 or newer and support Python up to 3.13. fail2ban 1.0.x was the last line that also ran on Python 2.7. Optional modules are pyinotify, python3-systemd and dnspython.

How do I upgrade fail2ban to the latest version?#

Use your package manager first: sudo apt install --only-upgrade fail2ban or sudo dnf upgrade fail2ban. For a newer release than your distribution offers, install the .deb from the GitHub release or build from source with git checkout 1.1.1 and sudo python3 setup.py install. Back up /etc/fail2ban and run fail2ban-client -t afterwards.

Spotted something wrong or out of date? Tell us — every page is checked against the current fail2ban release.