+++ date = '2024-10-23T20:43:44-03:00' title = 'Securing Your Linux Server with Fail2Ban for SSH Protection' description = "Learn how to configure Fail2ban SSH jails on GNU/Linux with custom ban times, multipliers, and trusted IPs to protect your server from brute-force attacks." tags = [ "webserver", "GNU/Linux", "Basics Series", ] +++ [Fail2ban](https://github.com/fail2ban/fail2ban) is a software which scans log files like `/var/log/auth.log` and bans IP addresses which have done too many failed login attempts. This is just one layer of security and should be used together with other tools and techniques such as iptables and SSH hardening. I always configure a simple SSH jail using fail2ban on my GNU/Linux servers. Today, I am going to show you how to configure a simple SSH jail. ## Installing fail2ban First you (obviously) need to install the fail2ban package. ```bash apt install fail2ban # For Ubuntu/Debian yum install fail2ban # For CentOS/RHEL ``` ## Configuring Fail2Ban The fail2ban configuration is very simple, the configuration files are located at: `/etc/fail2ban` The `fail2ban.conf` contains the default configuration profile, it is a good practice to not edit this file, but instead create a separate file named `fail2ban.local`, which overrides `fail2ban.conf`: ```bash cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local ``` The defaults should make a working setup for now, so let's skip this for now. Next, we have the `jail.conf` file, which is where we configure our "jails" as the name suggests. Here we are going to make some changes, so first let's create a `jail.local` file with the following content: ```text [DEFAULT] bantime.multipliers = 5 15 30 60 300 720 1440 2880 bantime = 86400 findtime = 86400 maxretry = 2 ignoreip = 192.2.0.0/24, 2001:0DB8::/32 [sshd] backend=systemd enabled=true mode=aggressive action = iptables[name=SSH, port=22, protocol=tcp] ``` Those settings are self explanatory, in the `[DEFAULT]` section we are setting some parameters, like for how long we should ban the attackers, and trusted IPs, remember to change those values as your needs, specially `ignoreip`. Take your time to fine tune those parameters. ## Enabling and testing Fail2ban Enable and start the fail2ban service ```bash systemctl enable --now fail2ban ``` For SSH jails the test is very simple, you can test by simply failing to log on a couple times. You can check the status with the command: ```bash fail2ban-client status fail2ban-client status sshd ``` ![Example of a SSH jail on a production server](/images/fail2ban-bans.png) As you can see, the SSH service on a cloud VPS is constantly being attacked, my server has almost 400 currently banned IPs. ## More jails Today I showed how to protect your GNU/Linux SSH service, but is is not over, you can use fail2ban to protect any service that you run! You can even integrate fail2ban protection with [Cloudflare](https://github.com/nesrual/fail2ban-cloudflare) if you use their services! I suggest you to check the `/etc/fail2ban/filter.d` folder, which contains the default filters for popular services, like Apache, Asterisk, Mail server services, etc... Be sure to take a look at the [official documentation](https://github.com/fail2ban/fail2ban/wiki).