Hvad er Fail2ban?
Fail2ban er en daemon der kører som en systemd-service og overvåger logfiler i realtid. Ser den det samme fejlmønster for mange gange inden for et konfigureret tidsvindue, tilføjer den en firewall-regel der blokerer den pågældende IP i en defineret periode. Bagefter fjerner den reglen automatisk.
Standardopsætningen bruger iptables eller ufw til at sætte bans. Fail2ban kalder disse konfigurationsblokke "jails". Hver jail overvåger én service og har sine egne indstillinger for antal tilladte fejl og ban-varighed.
Fail2ban fanger ikke distribuerede angreb fra tusindvis af IPs med ét forsøg per IP. Nøglebaseret SSH-login er dit primære forsvar mod det. Fail2ban filtrerer det daglige støj.
Forudsætninger
- Raspberry Pi eller en server der kører Debian, Ubuntu eller Pi OS
- SSH-adgang med sudo-rettigheder
- UFW installeret og aktivt (anbefalet; iptables virker også)
- SSH hardening på plads — se SSH hardening-guiden hvis du ikke har gjort det endnu
Installation
Opdater pakkelisten og installer Fail2ban:
sudo apt update && sudo apt install fail2ban -y
Fail2ban starter automatisk som en systemd-service efter installation. Tjek at den kører:
sudo systemctl status fail2ban
Du bør se active (running) i outputtet.
Redigér aldrig jail.conf
Filen /etc/fail2ban/jail.conf overskrives ved pakke-opdateringer. Ændringer du laver der forsvinder næste gang Fail2ban opdateres. Al konfiguration sker i /etc/fail2ban/jail.local, som altid vinder over jail.conf.
Eksisterer jail.local ikke på dit system, opretter du den selv. Det er den eneste fil du behøver at redigere.
SSH jail
Opret eller rediger /etc/fail2ban/jail.local:
sudo nano /etc/fail2ban/jail.local
Indsæt følgende:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = ufw
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
port = 2222 i stedet for port = ssh. Fail2ban slår servicenavnet op i systemets services-fil og finder port 22. Den overvåger den forkerte port hvis du har skiftet den uden at opdatere jail-konfigurationen.
Gem filen og genstart Fail2ban:
sudo systemctl restart fail2ban && sudo systemctl enable fail2ban
Tjek status
Se alle aktive jails:
sudo fail2ban-client status
Se status for SSH-jaillen specifikt, inklusiv bannede IPs:
sudo fail2ban-client status sshd
Outputtet viser antal failures, aktuelle bans og listen af bannede IP-adresser.
Traefik og Nginx jail
Kører du Traefik eller Nginx, kan du beskytte dem med samme fremgangsmåde. For Traefik tilføjer du til /etc/fail2ban/jail.local:
[traefik-auth]
enabled = true
port = http,https
filter = traefik-auth
logpath = /var/log/traefik/access.log
maxretry = 5
Fail2ban ved endnu ikke hvad den skal lede efter i Traefik-loggen. Du skal oprette et filter. Opret filen:
sudo nano /etc/fail2ban/filter.d/traefik-auth.conf
Indsæt:
[Definition]
failregex = ^<HOST> \S+ \S+ \[.*\] "\S+ \S+ \S+" 401 .*$
ignoreregex =
Dette regex matcher 401-svar fra Traefik, som signalerer fejlede autentificeringsforsøg. Test filteret mod din log inden du genstarter:
sudo fail2ban-regex /var/log/traefik/access.log /etc/fail2ban/filter.d/traefik-auth.conf
Genstart Fail2ban for at indlæse den nye jail:
sudo systemctl restart fail2ban
Unban en IP og hvid-list dit eget netværk
Fjern et ban manuelt:
sudo fail2ban-client set sshd unbanip 1.2.3.4
Tilføj ignoreip til [DEFAULT]-sektionen så Fail2ban aldrig blokerer dine egne maskiner:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = ufw
ignoreip = 127.0.0.1/8 192.168.1.0/24
192.168.0.x, brug 192.168.0.0/24. Er det 10.0.0.x, brug 10.0.0.0/24.
Test opsætningen
Simulér en brute-force fra en anden maskine på dit netværk ved at forsøge SSH med forkert adgangskode tre gange:
ssh fejlbruger@din-pi-ip
# Tast forkert adgangskode tre gange
Tjek derefter om IP'en er registreret som bannet:
sudo fail2ban-client status sshd
IP'en bør optræde under "Banned IP list". Fjern den bagefter:
sudo fail2ban-client set sshd unbanip DIN_TEST_IP
Fejlfinding
Fail2bans egen logfil:
sudo tail -f /var/log/fail2ban.log
Systemd-journalen for serviceproblemer:
sudo journalctl -u fail2ban -f
De hyppigste problemer:
- Jaillen starter ikke: Tjek at logfilen i
logpathfaktisk eksisterer. Fail2ban fejler lydløst hvis stien ikke findes. - Ingen bans opstår: Kør
fail2ban-regexmod din logfil med dit filter og se om regex'et matcher noget som helst. - UFW-fejl: Bekræft at UFW er aktivt med
sudo ufw status. Indstillingenbanaction = ufwfejler hvis UFW ikke kører.
Ofte stillede spørgsmål
Beskytter Fail2ban mod alle brute-force angreb?
Nej. Fail2ban begrænser angreb der sker fra én IP ad gangen. Distribuerede angreb fra mange IPs (botnets) med lavt antal forsøg per IP opdager Fail2ban ikke. Nøglebaseret SSH-login fjerner problemet helt. En angriber uden din private nøgle kan forsøge i årevis uden at komme ind.
Hvad sker der med en banlægt IP når Pi'en genstarter?
Fail2ban gemmer som standard ikke bans på tværs af genstarter. Bans forsvinder ved reboot. Vil du have persistente bans, kan du aktivere dbfile i jail.local, men i praksis er det sjældent nødvendigt da bots typisk forsøger igen og hurtigt fanges igen.
Kan Fail2ban blokere mig selv?
Ja, hvis du taster din adgangskode eller SSH-nøgle forkert for mange gange. Brug ignoreip i [DEFAULT] til at hvide-liste din hjemme-IP eller hele LAN-subnetten: ignoreip = 127.0.0.1/8 192.168.1.0/24.