Module 5 · 5.3
fail2ban tegen raadpogingen
Module 5: Het netwerk afschermen · Leestijd: 10 minuten
Leerdoel: Na deze les kun je fail2ban instellen voor SSH, zijn status en logboek lezen, een adres weer vrijgeven, en uitleggen wat fail2ban wel en niet beschermt.
Kernbegrippen: brute force, jail, filter, actie (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local en jail.d, fail2ban-client, recidive
De deurklinkers van internet
Kijk een dag na de installatie in het logboek van SSH en je ziet het: honderden pogingen om in te loggen, met namen als root, admin, test, ubuntu en oracle, vanaf adressen over de hele wereld.
anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560(Op Ubuntu heet de dienst ssh, op AlmaLinux en Rocky sshd. De procesnaam kan sshd of sshd-session zijn, afhankelijk van de OpenSSH-versie.) Dat is een brute-force-aanval: bots die gewoon alle gangbare namen en wachtwoorden proberen. Met inloggen via sleutels en wachtwoordlogin uit (les 2.2) komen ze nooit binnen, hoe vaak ze het ook proberen. Maar ze vullen je logboek, kosten wat rekenkracht, en op diensten waar wel een wachtwoord nodig is (een webmail, een beheerpaneel) kunnen ze echt gevaarlijk zijn.
fail2ban leest logboeken, herkent mislukte pogingen, en zet een adres dat te vaak faalt een tijdje in de firewall op slot.
Hoe fail2ban denkt: jails
fail2ban werkt met jails (cellen). Een jail combineert drie dingen:
- een filter: reguliere expressies die in een logboek mislukte pogingen herkennen (bijvoorbeeld de regel "Invalid user ... from <adres>");
- een actie: wat er gebeurt bij te veel pogingen, meestal een firewallregel die het adres blokkeert (
banaction, op Debian 13 standaard via nftables); - drempels: hoeveel mislukte pogingen (
maxretry) binnen welke tijd (findtime) leiden tot een blokkade van hoe lang (bantime).
De standaardwaarden uit jail.conf zijn: maxretry = 5, findtime = 10m, bantime = 10m. Dus: vijf mislukte pogingen binnen tien minuten geeft tien minuten blokkade.
Installeren en de valkuil van Debian 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banOp Debian en Ubuntu staat de jail voor SSH ([sshd]) na installatie al aan, via het bestand /etc/fail2ban/jail.d/defaults-debian.conf.
Er is één bekende valkuil. fail2ban moet weten waar het logboek staat. Vroeger was dat het tekstbestand /var/log/auth.log. Sinds Debian 12 wordt rsyslog niet meer standaard geïnstalleerd en staan de meldingen alleen in de journal van systemd (les 6.2). Het fail2ban-pakket van Debian 12 zocht nog naar /var/log/auth.log, vond het niet en startte niet. Debian 13 heeft dit opgelost door in defaults-debian.conf voor SSH backend = systemd te zetten. Op Debian 12 los je het zelf op (zie hieronder) door hetzelfde te doen. Ubuntu heeft rsyslog nog wel standaard, maar backend = systemd werkt daar ook.
Je eigen instellingen: jail.local
Pas jail.conf nooit aan: dat bestand wordt bij een update vervangen. Zet je eigen instellingen in /etc/fail2ban/jail.local of in een bestand in /etc/fail2ban/jail.d/ met de extensie .local:
# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
[sshd]
enabled = true
backend = systemdWat de regels doen:
bantime = 1h: een uur blokkade in plaats van tien minuten.bantime.increment = true: wie na een blokkade terugkomt, krijgt telkens een langere blokkade.ignoreip: adressen die nooit geblokkeerd worden. Zet hier het vaste IP-adres van je kantoor in, als je dat hebt. Zet hier geen grote reeksen in "voor de zekerheid".backend = systemd: lees de journal in plaats van een tekstbestand (nodig op Debian 12, aan te raden overal). Daarvoor moet het pakketpython3-systemdgeïnstalleerd zijn; meestal is het dat al als afhankelijkheid.
Herladen en controleren:
anna@web1:~$ sudo fail2ban-client -t # configuratie testen
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdStatus lezen, bannen en vrijgeven
anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1288
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 117
`- Banned IP list: 203.0.113.77 198.51.100.140"Currently failed" zijn adressen die al wel pogingen hebben gedaan maar nog niet boven de drempel zitten. "Currently banned" zijn de adressen die nu geblokkeerd zijn.
Heb je jezelf geblokkeerd (bijvoorbeeld door een paar keer met de verkeerde sleutel of gebruikersnaam te proberen), log dan via een ander netwerk of de console in en geef je adres vrij:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Het logboek van fail2ban zelf staat in /var/log/fail2ban.log en laat zien wanneer welk adres geblokkeerd en vrijgegeven werd:
2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE [sshd] Unban 203.0.113.77Herhalers: recidive
Sommige bots komen na elke blokkade gewoon terug. Daarvoor zijn er twee middelen. bantime.increment (hierboven) maakt de blokkade elke keer langer. Daarnaast is er de jail recidive: die leest het logboek van fail2ban zelf, en blokkeert een adres dat binnen een dag vaak geblokkeerd is voor een week op alle poorten. Aanzetten in je .local-bestand:
[recidive]
enabled = trueWat fail2ban wel en niet doet
fail2ban is nuttig, maar het is geen slot op de deur. Het slot is inloggen met een sleutel, met wachtwoorden uit (les 2.2). Weet daarom ook wat fail2ban niet kan:
- Een verspreide aanval vanaf duizenden adressen, met elk één of twee pogingen, komt nooit boven
maxretry. - Een zwak wachtwoord blijft zwak. fail2ban vertraagt het raden, meer niet.
- Alleen wat in een log staat: een dienst die geen mislukte pogingen logt, of een log dat fail2ban niet leest, ziet het niet.
- Docker: blokkades in de gewone firewallketen gelden niet voor gepubliceerde containerpoorten (les 9.3). Voor diensten in containers is een aparte instelling nodig (actie op de keten
DOCKER-USER).
Wat fail2ban wel goed doet: het logboek rustig houden, de last van bots verlagen, en diensten beschermen waar je (nog) wachtwoorden gebruikt, zoals een webmail of beheerpaneel. Voor zulke diensten zijn er filters voor nginx, Postfix, Dovecot en vele andere.
Op AlmaLinux en Rocky Linux
fail2ban komt daar uit EPEL: dnf install epel-release en dan dnf install fail2ban. Het pakket fail2ban installeert ook de koppeling met firewalld. De SSH-dienst heet sshd. Zet de jail zelf aan in een .local-bestand; anders dan op Debian staat hij niet automatisch aan.
Samenvatting
- Bots proberen de hele dag in te loggen; met sleutels en wachtwoordlogin uit komen ze niet binnen, fail2ban houdt ze daarnaast op afstand.
- Een jail is filter + actie + drempels (
maxretry,findtime,bantime); standaard 5 pogingen in 10 minuten, 10 minuten blokkade. - Eigen instellingen in
jail.localofjail.d/*.local, nooit injail.conf; gebruikbackend = systemd(nodig op Debian 12). fail2ban-client status sshdtoont gebande adressen,set sshd unbanipgeeft vrij; recidive enbantime.incrementpakken herhalers aan.- fail2ban houdt geen verspreide aanvallen of zwakke wachtwoorden tegen en ziet Docker-poorten niet vanzelf.
Quiz
Opdracht
Opdracht Z5.3: Een inbraaklog lezen. In het voorbeeldbestand ssh-journal-1.txt staat een stuk journal van een SSH-server met fail2ban, plus de uitvoer van fail2ban-client status sshd. Beantwoord: welk adres probeerde de meeste gebruikersnamen, welk adres wist met een sleutel in te loggen en als welke gebruiker, welk adres is gebaand en om hoe laat, en zou dat adres met de standaardinstellingen (maxretry = 5, findtime = 10m) ook gebaand zijn? Het programma vergelijkt met de vaste sleutel. Heb je een eigen server met fail2ban, bekijk daar dan ook fail2ban-client status sshd.
Verder lezen
- Je VPS beveiligen: de eerste vijf minuten
- Ben ik geblokkeerd? Je IP-adres en onze firewall
- fail2ban, standaardconfiguratie
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Handleiding
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html
