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.
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.
$ sudo fail2ban-client --version
Fail2Ban v1.1.1Check the installed fail2ban version#
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:
apt policy fail2bandnf info fail2banpacman -Qi fail2banfail2ban 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 andpfon FreeBSD and macOS. Override it injail.localas before. - Debian paths switch sshd and postfix to the systemd backend.
- sshd filter matches the
sshd-sessionprocess name used since OpenSSH 9.8. - Automatic journal fallback: with
backend = auto, a jail whoselogpathfinds no file but whose filter has ajournalmatchswitches tosystemd(systemd_if_nologs, on by default). Newskip_if_nologslets fail2ban start with a jail skipped instead of failing. - systemd backend
rotatedoption (default off) to cut the number of open journal files. ignoreipacceptsfile:/pathlists, also foraddignoreip.- systemd socket activation with an optional
fail2ban.socketunit. - 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-smtpanddovecotfilters (GHSA-33wh-ccjc-p397). eximfilter: risky rules moved fromnormalto a newmoremode.
The full upstream changelog for 1.1.1:
Compatibility#
action.d/iptables.confrewritten 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$chainor<_ipt_for_proto-iter>with<_ipt-iter>;filter.d/exim.conf- several rules of modenormalmoved to new modemore, because of too risky handling (see gh-3940), to use it as before setmode = morefor 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
systemdbug 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) anddone, invokingafterStoponce - 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
systemdcausing "too many open files" error for a lot of journal files and large amount of systemd jails (see new parameterrotatedbelow, 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 differentblocktypefor 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.confby default, banactions arenftables(can be overwritten injail.localby user) paths-common.conf:- changed default
mysql_logpath (defaultlogpathofmysqld-authjail 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
ipsettypetoipsetbackend(gh-2620), parameteripsettypewill 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 -Pusinggrep -Eorsed(PCRE-JIT bygrep -Pmay cause SELinux denial for execmem, see gh-4137) action.d/xarf-login-attack.conf- ignore errors or warnings in output ofdigprovided 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 (likeafter X tries in Y ms) at end, loosening of end anchor (ignore any simple text tokens at end if no single quote found), gh-4037filter.d/exim.conf:- several rules of mode
normalmoved to new modemore, because of too risky handling (gh-3940), thereby modeaggressiveis not affected, because it fully includes modemorenow; - mode
aggressiveextended 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
prefregexto capture username in postfix SASL failures (gh-4165) - consider CONNECT and other rejected commands as a valid
_pref(gh-3800) - default
_daemonin prefix-line is loosened - can match everything starting with word postfix, likepostfix-example.com/smtpd(gh-3297) - add optional
NOQUEUE:prefix to ddos regex (gh-4072) - internal parameter
_prefis renamed to_cmd,_prefmatches now optional prefix likeNOQUEUE:etc - modes
ddosandaggressiveextended to matchrate limit exceededfor connection or message delivery request rates (gh-3265, gh-4073) - modes
aggressiveextended to matchhostname 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 unknownto default - the relay field may not always have a hostname before the ip address
- mode
aggressiveenables match forlost input channelandCannot 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)
ddosandaggressivemodes: 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-serversupportssystemdsocket activation (sd_listen_fds(3)); optionalfail2ban.socketunit provided- backend
systemdextended with new parameterrotated(defaultfalse, 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_nologsto ignore jail if nologpathmatches found, fail2ban continue to start with warnings/errors, thus other jails become running (gh-2756) - implements automatic switch
backend = autoto backendsystemd, when the following is true (RFE gh-3768): - no files matching
logpathfound for this jail; - no
systemd_if_nologs = falseis specified for the jail (trueby default); - option
journalmatchis 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); (optionskip_if_nologswill be ignored if we could switch backend tosystemd) - configuration
ignoreipand fail2ban-client commandsaddignoreip/delignoreipextended withfile:...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
ipsettypeto 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 acceptchain = INPUT,FORWARD(gh-3909)action.d/nftables.conf(gh-3291):- new parameter
addr_optionsfor addr-set (defaultflags 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
aggressivecovered new variant forno auth attempts in X secswithLogin abortedand(no_auth_attempts) - mode
aggressiveextended to matchdisconnected during TLS handshakewithno application protocolandno shared cipher filter.d/nginx-http-auth.conf:- extended with
prefregexto capture content of error only (bypass common prefix and suffix, like server, request, host, referrer); - extended to match PAM authentication failures (gh-4071)
- modes
fallbackandaggressiveextended 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-regexextended with new option-ior--invertto output not-matched lines by-oor--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#
| Version | Released | Release name |
|---|---|---|
| 1.1.1 | 2026-08-15 | triple-one-win |
| 1.1.0 | 2024-04-25 | object-found--norad-59479-cospar-2024-069a--altitude-36267km |
| 1.0.2 | 2022-11-09 | finally-war-game-test-tape-not-a-nuclear-alarm |
| 1.0.1 | 2022-09-27 | energy-equals-mass-times-the-speed-of-light-squared |
| 0.11.2 | 2020-11-23 | heal-the-world-with-security-tools |
| 0.11.1 | 2020-01-11 | this-is-the-way |
| 0.10.5 | 2020-01-10 | deserve-more-respect-a-jedis-weapon-must |
| 0.10.4 | 2018-10-04 | ten-four-on-due-date-ten-four |
| 0.10.3 | 2018-04-04 | the-time-is-always-right-to-do-what-is-right |
| 0.10.2 | 2018-01-18 | nothing-burns-like-the-cold |
| 0.10.1 | 2017-10-12 | succeeded-before-friday-the-13th |
| 0.10.0 | 2017-08-09 | long-awaited 0.10th version |
| 0.10.0-alpha-1 | 2016-07-14 | ipv6-support-etc |
| 0.9.8 | 2016-XX-XXX | wanna-be-released |
| 0.9.7 | 2017-05-11 | awaiting-victory |
| 0.9.6 | 2016-12-10 | stretch-is-coming |
| 0.9.5 | 2016-07-15 | old-not-obsolete |
| 0.9.4 | 2016-03-08 | for-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:
sudo tar czf ~/fail2ban-etc-$(date +%F).tgz /etc/fail2ban
fail2ban-client --versionFrom your distribution#
sudo apt update && sudo apt install --only-upgrade fail2ban # Debian/Ubuntu
sudo dnf upgrade fail2ban # Fedora/EPELThis 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:
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.debThe distribution's package then no longer receives updates through apt upgrade; watch the GitHub releases yourself.
From source (git)#
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
git checkout 1.1.1
sudo python3 setup.py installThe 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#
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client versionWatch /var/log/fail2ban.log for warnings about renamed or removed options.
Upgrading from 0.x to 1.x: compatibility notes#
- Keep your changes in
.localfiles. If you editedjail.confor stock filters, move the changes tojail.localandfilter.d/*.localbefore upgrading — the upgrade replaces the.conffiles. - 1.0.1: option parsing for
backend,filterandactionbecame strict, so partially wrong values now raise an error instead of being ignored. Themail-whoisfix 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 inactionban/actionunbanwhen their environment is broken. - 1.1.0: Python 2 is no longer supported.
- 1.1.1: custom actions that include
iptables.confmay need tag changes (<chain>→$chain); theeximfilter'snormalmode is narrower; defaultbanactioncomes frompaths-*.conf, so abanactionset injail.localstill 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.