---
title: "Fail2ban vs CrowdSec: hvad hver gør, og hvornår det tæller"
description: "Fail2ban spærrer IP'er fra én servers logs. CrowdSec tilføjer bouncers og en delt blokliste. Sådan virker de, hvad CrowdSec deler, og hvornår ingen gør nytte."
source: "https://wardio.net/da/guides/fail2ban-vs-crowdsec/"
---

**Hærdning**

# Fail2ban vs CrowdSec: hvad hver af dem egentlig gør

Begge læser dine logs og blokerer adresser, der opfører sig forkert. Forskellen ligger i, hvor beslutningen om at spærre kommer fra, hvor mange dele du skal køre, og hvad der forlader maskinen. For SSH er det mere nyttige spørgsmål, om porten overhovedet skal kunne nås.

Af David Kabel · Opdateret 2026-09-24 · 13 min læsning

**Det korte svar**

Fail2ban læser logfiler på én server, genkender mislykkede logins med regulære udtryk og spærrer kildeadressen i den servers firewall i et fastsat tidsrum. CrowdSec opdager den samme adfærd med parsere og scenarier, overlader blokeringen til separate komponenter kaldet bouncers og bytter, medmindre du fravælger det, angriberadresser med sit netværk til gengæld for en delt blokliste. Fail2ban passer til en lille, selvstændig opsætning; CrowdSec passer til offentlige webtjenester og større serverparker. Kan SSH kun nås over et privat netværk, tilføjer ingen af dem meget for SSH.

## Fail2ban læser logs og spærrer i firewallen

Ifølge projektets egen beskrivelse gennemsøger fail2ban logfiler og spærrer IP-adresser, der viser for mange mislykkede loginforsøg, ved at opdatere firewallregler i et tidsrum, du selv kan indstille. Konfigurationen består af jails, filtre og handlinger.

1.  **Jails**: En jail binder én tjeneste til et filter, en handling og tre tal. Standardværdierne fra upstream er bantime 10 minutter, maxretry 5 og findtime 10 minutter, så en adresse bliver spærret i 10 minutter efter 5 fejlede forsøg inden for 10 minutter. Upstream leverer alle jails slået fra. Du slår de jails til, du har brug for, i jail.local eller i en fil i jail.d, aldrig i jail.conf, som en pakkeopdatering kan overskrive.
2.  **Filtre**: Filer i filter.d med regulære udtryk i Python (failregex), som genkender en linje om et fejlet forsøg og fanger klientens adresse. Standardsættet dækker sshd, Apache, nginx, Postfix, Dovecot og snesevis af andre tjenester.
3.  **Handlinger (actions)**: Filer i action.d, som kører kommandoerne til at spærre og ophæve spærringen: nftables, iptables, firewalld, ufw og andre, plus handlinger, der spærrer hos Cloudflare, sender mail eller rapporterer adressen til AbuseIPDB.

En minimal `jail.local`, efter eksemplet i starten af den medfølgende `jail.conf`:

```
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h

[sshd]
enabled = true
```

Den aktuelle version er 1.1.1, udgivet 15. august 2026. Dens changelog gør nftables til standardhandlingen for spærring med Debians standardstier og skifter sshd-jailen til at læse systemd-journalen. Debian 13 leverer allerede fail2ban 1.1.0 med de indstillinger og går et skridt videre. Pakken slår sshd-jailen til fra start, så når du installerer fail2ban på Debian 13, begynder den straks at spærre ved fejlede SSH-forsøg, helt uden `jail.local` og uden nogen `/var/log/auth.log` på systemet.

Alt, hvad fail2ban ved, kommer fra logs på den ene maskine, og hver server har sin egen spærreliste. Den kan rapportere synderne videre, men intet i de medfølgende handlinger henter en delt liste ind igen. Den er licenseret under GPL v2 eller senere. Ifølge README-filen kan fail2ban sænke antallet af forkerte godkendelsesforsøg, men *den kan ikke fjerne den risiko, som svag godkendelse udgør*.

## CrowdSecs motor og bouncers

CrowdSec deler det samme arbejde op i separate komponenter. Security Engine, altså selve motoren, er Log Processor plus Local API, og blokeringen ligger et andet sted.

1.  **Log Processor**: Læser logs gennem en acquisition-konfiguration, parser og beriger hver hændelse med kildeadresse, tjeneste, GeoIP og ASN og matcher derefter hændelserne mod scenarier, som sammenholder adfærd over tid, fx mange mislykkede logins fra én adresse. Den kan også inspicere HTTP-forespørgsler direkte mod AppSec-regler (WAF).
2.  **Local API**: Gemmer alarmer og omsætter dem til beslutninger (decisions) ved hjælp af profiler. Standardprofilen spærrer adressen i 4 timer.
3.  **Remediation components (bouncers)**: Separate programmer, som henter beslutninger fra Local API og håndhæver dem: en firewall-bouncer til iptables, nftables, ipset eller pf, eller bouncers til nginx, Traefik, HAProxy og andre, som griber ind på HTTP-laget. Nogle kan vise en CAPTCHA i stedet for at blokere.
4.  **Central API**: CrowdSecs egen tjeneste, som din motor sender signaler til, og som den modtager fællesskabets blokliste fra.

Det er ved den opdeling, nye installationer går galt. CrowdSecs side om grundbegreberne siger, at motoren opdager, og bouncerne blokerer, så en motor uden en registreret bouncer laver alarmer og blokerer intet. Motoren er skrevet i Go, og CrowdSecs FAQ oplyser, at den og remediation components er MIT-licenserede.

## CrowdSecs datadeling og priser

Når et scenarie udløses, sender Local API det, CrowdSec kalder signalmetadata, til Central API, medmindre du har fravalgt det: scenariets navn, dets hash og version, tidspunktet for beslutningen, dit `machine_id` og den IP-adresse, der udløste det, med geolokation, hvor den findes. Ved login sender motoren også sin liste over aktiverede scenarier, og den rapporterer navne og versioner på dine motorer og bouncers. Dokumentationen nævner ikke loglinjer blandt det, der sendes, og der var ingen i de signaler, vi opfangede.

Dokumentationen til Central API siger også, at egne scenarier, ændrede (tainted) scenarier fra hubben og manuelle beslutninger ikke bliver sendt, medmindre du tilmelder dig konsollen. Sådan opførte CrowdSec 1.8.1 sig ikke i vores test. Dens standard-`console.yaml` sætter `share_custom` og `share_tainted` til true, og en motor, der var registreret, men aldrig tilmeldt, sendte signaler fra et eget scenarie og fra et redigeret hub-scenarie til en lokal efterligning af Central API. Motoren sendte ikke manuelle beslutninger. Funktionen `shouldShareAlert` i motorens `apic.go` tjekker disse konsolflag og aldrig, om motoren er tilmeldt. Vil du kun dele uændrede hub-scenarier, så kør `sudo cscli console disable custom tainted`. Derefter kom kun signalet fra det uændrede scenarie frem.

Vil du fravælge det helt, så udkommentér `online_client`\-sektionen i `/etc/crowdsec/config.yaml`. Så mister du fællesskabets blokliste, som er hovedgrunden til at vælge CrowdSec. Der findes også et delvist fravalg: `sharing: false` under `online_client`. I vores test stoppede det signalerne helt, mens motoren blev ved med at hente bloklisten, og CrowdSecs konfigurationsreference advarer om, at når deling slås fra, påvirker det, hvor mange adresser bloklisten giver dig. Fører du fortegnelser efter GDPR over, hvilke data der forlader dine systemer, hører de delte angriberadresser med i dem.

Hvilken blokliste du får, afhænger af, hvad du giver. Gratis brugere, der jævnligt bidrager med signaler, får Community Blocklist med 15.000 adresser tilpasset de scenarier, de kører. Gratis brugere, der ikke bidrager, får Lite-versionen med et loft på 3.000. Betalende brugere får Premium-versionen uden størrelsesgrænse, uanset om de bidrager eller ej.

Motoren og bouncerne koster ingenting. De betalte produkter ligger rundt om dem: Console Premium, prissat pr. tilmeldt Security Engine; Platinum Blocklists med listepris fra 1.900 USD om måneden for små og mellemstore virksomheder; og adgang til IP reputation-API'et fra 49 USD om måneden for 5.000 forespørgsler. Det er tallene på CrowdSecs prisside i september 2026.

## Side om side

|  | Fail2ban | CrowdSec |
| --- | --- | --- |
| Detektion | Regulære udtryk i Python over loglinjer | Parsere og scenarier over loglinjer, plus valgfri HTTP-inspektion (AppSec) |
| Håndhævelse | Indbygget, via handlingen (nftables, iptables, firewalld, ufw og andre) | En separat bouncer: firewall, webserver eller reverse proxy |
| Standardspærring | 10 minutter efter 5 fejlede forsøg på 10 minutter | 4 timer pr. beslutning |
| Hvad en spærring blokerer (testede standardindstillinger) | Kun jailens porte, afvist med reject | Al trafik fra adressen, kasseret med drop (nftables-bouncer) |
| Delt trusselsinformation | Intet indbygget; kan rapportere udad | Fællesskabets blokliste til gengæld for signaler; kan fravælges |
| Dele, du skal køre | Én tjeneste | Motor (Log Processor og Local API) plus en eller flere bouncers |
| Licens | GPL v2 eller senere | MIT for motor og bouncers; ekstra funktioner i konsollen og premium-lister koster penge |

Tabellen udelader ressourceforbrug med vilje. CrowdSecs FAQ siger, at motoren bør bruge under 100 MB hukommelse i en lille til mellemstor opsætning. Fail2ban oplyser ikke noget tilsvarende tal, så der er intet sammenligneligt at sætte i en tabel. Vores egne tal kommer kun fra én testmaskine. Et par minutter efter start, med 54 scenarier og én journalkilde, brugte CrowdSec 1.8.1-motoren omkring 145 MB resident hukommelse og dens nftables-bouncer omkring 21 MB, mens fail2ban 1.1.0 med to jails brugte omkring 26 MB.

## Tjek først, om nogen kan nå porten

De fleste af disse sammenligninger handler om at spærre for brute force-forsøg mod SSH. Er SSH ikke på det offentlige internet, er det argument uden betydning. På de maskiner, Wardio driver, går administrativ adgang over Tailscale, et privat mesh-netværk, og SSH kan slet ikke nås fra internettet, så der er ingen fejlede forsøg fra internettet, som en sshd-jail kan tælle. CrowdSecs dokumentation ser det fra den anden side. Den nævner adgang kun via VPN og IP-tilladelseslister med afvisning som standard som opsætninger, der kan give en motor Lite-bloklisten, og beskriver dem som noget, der i forvejen gør dig mindre afhængig af bloklisten.

Selv hvis SSH stadig er offentlig, fjerner godkendelse kun med nøgler det, som en brute force-spærring beskytter imod. En spærring mindsker så mest støjen i loggen. Det har en vis værdi, men det er ikke en kontrol på niveau med at slå adgangskoder fra, og derfor sætter [vores guide til at sikre en VPS](/da/guides/sikker-vps/) SSH kun med nøgler og et privat administrationsnetværk før alt andet.

OpenSSH straffer nu selv gengangere. På Debian 13 har OpenSSH 10.0 `PerSourcePenalties` slået til som standard, og i vores test begyndte sshd at droppe forbindelser fra en adresse efter gentagne mislykkede logins. Fail2bans medfølgende sshd-filter matcher i sin normale tilstand ikke den linje, sshd logger, når den dropper en straffet forbindelse.

Spærringer gør stadig gavn på tjenester, der skal være offentlige og tage imod loginoplysninger: en webshops kundelogin, en adminside i WordPress, mailgodkendelse i Postfix eller Dovecot, et webbaseret kontrolpanel. Om værktøjerne hjælper dér, afhænger af loggen.

**Applikationen skal logge fejlen.** Begge værktøjer reagerer kun på det, der står i en log. Skriver en loginformular ikke en linje med klientens adresse, når en adgangskode er forkert, ser ingen af værktøjerne nogensinde forsøget.

**Adressen i loggen skal være angriberens.** Bag et CDN eller en reverse proxy logger serveren måske proxyens adresse, og spærrer du den, blokerer du dine rigtige besøgende. Logger den i stedet den rigtige klientadresse fra en videresendt header, gør en firewallspærring på origin-serveren ingenting, fordi forbindelsen stadig kommer fra proxyen. Spær der, hvor den rigtige adresse er synlig, altså i CDN'et eller i webserveren eller proxyen. Fail2ban leveres med en Cloudflare-handling, og CrowdSec har bouncers til nginx, Traefik og HAProxy.

## Valget mellem dem

Det følgende er en vurdering og gælder opsætninger med en til nogle få servere.

**Fail2ban**, hvis du har en eller to servere, en håndfuld offentlige tjenester og helst vil have, at intet forlader maskinen. Den ligger i distributionens pakkearkiver, den er én tjeneste, og du kan aflæse dens opførsel i nogle få konfigurationsfiler.

**CrowdSec**, hvis du kører offentlige webapplikationer, der tiltrækker konstant scanning, har flere servere, der skal dele beslutninger, eller vil have blokering på HTTP-laget frem for i firewallen. Du accepterer flere komponenter og deler angriberadresser med en tredjepart til gengæld for bloklisten.

**Ingen af dem, til SSH,** hvis du i stedet kan tage SSH af internettet. Brug tiden på patching. En upatchet tjeneste med en offentlig exploit giver ikke mislykkede logins, så ingen loginspærring opdager den. Er automatiske opdateringer slået til, men gør de ikke ret meget, så finder [denne tjekliste](/da/guides/unattended-upgrades-virker-ikke/) ud af hvorfor.

## Tjek, at værktøjet matcher og håndhæver

Uanset hvilken du kører, så bekræft, at den matcher og håndhæver og ikke bare er installeret:

```
# fail2ban: failures and banned addresses for the sshd jail
sudo fail2ban-client status sshd

# CrowdSec: what is parsed, what is decided, and who enforces it
sudo cscli metrics
sudo cscli decisions list
sudo cscli bouncers list
```

Kommer `cscli bouncers list` tilbage tom, opdager CrowdSec, men intet blokerer. En bouncer på listen er ikke bevis i sig selv, fordi en genindlæsning af firewallen kan fjerne dens regler, som faldgruberne nedenfor viser. Viser fail2ban-jailen nul fejlede forsøg på en tjeneste, du ved bliver angrebet, matcher filteret ikke dit logformat, eller jailen læser den forkerte log. En jail, der peger på en logfil, som ikke findes, viser ikke nul. I stedet nægter fail2ban helt at starte.

## Faldgruber

-   **En gammel guides jail.local forhindrer fail2ban i at starte.** Debian 13 uden rsyslog har ingen `/var/log/auth.log`. Med en `jail.local`, der sætter `logpath = /var/log/auth.log` og `backend = auto` for sshd-jailen, fejlede `fail2ban-client -t` med "Have not found any log file for sshd jail", og tjenesten afsluttede med status 255 og tog alle andre jails med sig i faldet. Slet begge linjer, fordi Debians `jail.d/defaults-debian.conf` allerede sætter `backend = systemd`, og kør `sudo fail2ban-client -t` før enhver genstart.
-   **fail2ban-regex læser en manglende fil som en loglinje.** På Debian 13 rapporterede `fail2ban-regex /var/log/auth.log sshd` 1 linje, 0 matchede og 1 missede, og den missede linje var selve stien. Det ligner et filter, der ikke matcher, snarere end en fil, der ikke findes. Test i stedet mod journalen: `sudo fail2ban-regex -m "_SYSTEMD_UNIT=ssh.service" systemd-journal sshd`.
-   **En genindlæsning af firewallen fjerner spærringerne ubemærket.** Debians `/etc/nftables.conf` starter med `flush ruleset`, så `systemctl restart nftables` slettede både fail2bans og CrowdSecs tabeller. Fail2ban viste stadig adressen som spærret, `cscli decisions list` viste stadig beslutningen, bounceren forblev aktiv og havde ikke genskabt sin tabel 15 sekunder senere, og den spærrede adresse nåede sshd igen i begge tilfælde. En genstart af fail2ban eller bounceren satte spærringerne på plads igen. Efter enhver genindlæsning af firewallen skal du genstarte dem og tjekke med `sudo nft list tables`.
-   **CrowdSec alene blokerer intet.** Uden en bouncer installeret gav otte mislykkede SSH-logins en alarm og en beslutning om spærring i 4 timer, men angriberen nåede stadig sshd 45 sekunder senere. Pakkens installationsbesked siger det med "CrowdSec alone will not block any IP address", men beskeden ruller forbi. Installer en bouncer, fx `crowdsec-firewall-bouncer-nftables` fra CrowdSecs pakkearkiv, som registrerede sig selv hos Local API under installationen, og bekræft med `sudo cscli bouncers list`.
-   **CrowdSec ignorerer private adresser, så en test på det lokale netværk viser intet.** Standardparseren `crowdsecurity/whitelists` kasserer hændelser fra private IPv4- og IPv6-intervaller. Mislykkede SSH-logins fra en privat adresse gav ingen alarm, før vi fjernede den parser, og `cscli explain` rapporterede linjen som ignoreret af whitelisten. Fail2ban har ingen sådan standard og spærrede den samme adresse. Test fra en offentlig adresse, eller giv `cscli explain` en eksempellinje med en offentlig adresse, i stedet for at fjerne whitelisten på en rigtig server.
-   **Installationen kobler CrowdSec på Central API, før du har besluttet dig.** En ikke-interaktiv installation af Debian-pakken registrerede motoren hos Central API, og motoren loggede straks ind, sendte målinger og hentede fællesskabets blokliste. Docker-imagets startscript gør det samme ved første start, medmindre `DISABLE_ONLINE_API=true` er sat. Det så vi i scriptet, og uden netværk afsluttede containeren ved det trin. Registrering er ikke tilmelding til konsollen, men egne og ændrede scenarier bliver alligevel delt som standard, som beskrevet ovenfor. Beslut dig før installationen: sæt `DISABLE_ONLINE_API=true` for containeren, eller sæt efter en pakkeinstallation `sharing: false` eller udkommentér `online_client`, og kør `sudo cscli console disable custom tainted`, hvis du bliver ved med at dele.

**Sådan blev det testet.** Den 23. september 2026 kørte vi begge værktøjer i Docker-containere med systemd på Debian 13 (debian:trixie) og angreb dem fra en anden container: fail2ban 1.1.0 (Debian-pakke 1.1.0-8) med OpenSSH 10.0p2 og nftables 1.1.3, og CrowdSec 1.8.1 med crowdsec-firewall-bouncer-nftables 0.0.36 fra CrowdSecs pakkearkiv, plus det officielle CrowdSec Docker-image i version 1.8.1. Proxy-tilfældene brugte nginx foran en nginx-origin. Fail2ban 1.1.1 tjekkede vi ud fra de udgivne filer uden at installere den. Det, CrowdSec deler, opfangede vi med en lokal efterligning af Central API, mens testmaskinens øvrige udgående trafik var blokeret, og hukommelsestallene kommer fra den ene maskine. Ikke testet: pf-, Traefik-, HAProxy- og CAPTCHA-bouncerne, AppSec-regler, tilmelding til konsollen, Debian 12, Tailscale og bloklisternes størrelser og priser, som kræver en bidragende konto over tid, og som vi har hentet fra CrowdSecs dokumentation og prisside.

## Kilder

1.  [Fail2Ban README](https://github.com/fail2ban/fail2ban), fail2ban-projektet, GitHub
2.  [Fail2Ban ChangeLog, version 1.1.1](https://github.com/fail2ban/fail2ban/blob/1.1.1/ChangeLog), fail2ban-projektet, 15. august 2026
3.  [jail.conf, version 1.1.1](https://github.com/fail2ban/fail2ban/blob/1.1.1/config/jail.conf), fail2ban-projektet
4.  [jail.conf(5) manual page](https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html), Debian 13
5.  [defaults-debian.conf in fail2ban 1.1.0-8](https://sources.debian.org/src/fail2ban/1.1.0-8/debian/debian-files/jail.d_defaults-debian.conf/), Debian
6.  [Concepts](https://docs.crowdsec.net/docs/concepts), CrowdSec-dokumentationen, Security Engine v1.8
7.  [Profiles](https://docs.crowdsec.net/docs/local_api/profiles/intro), CrowdSec-dokumentationen
8.  [Firewall remediation component](https://docs.crowdsec.net/u/bouncers/firewall), CrowdSec-dokumentationen
9.  [Central API: data exchanged](https://docs.crowdsec.net/docs/central_api/intro), CrowdSec-dokumentationen
10.  [Community Blocklist](https://docs.crowdsec.net/docs/central_api/community_blocklist), CrowdSec-dokumentationen
11.  [Configuration file reference (online\_client sharing)](https://docs.crowdsec.net/docs/configuration/crowdsec_configuration), CrowdSec-dokumentationen
12.  [apic.go (shouldShareAlert), Security Engine v1.8.1 source](https://github.com/crowdsecurity/crowdsec/blob/v1.8.1/pkg/apiserver/apic.go), CrowdSec, GitHub
13.  [Security Engine troubleshooting and FAQ](https://docs.crowdsec.net/u/troubleshooting/security_engine/), CrowdSec-dokumentationen
14.  [Pricing](https://www.crowdsec.net/pricing), CrowdSec, besøgt september 2026

## Spørgsmål

### Hvad er fail2ban?

Fail2ban er en open source-tjeneste under licensen GPL v2 eller senere. Den gennemsøger logfiler som SSH-godkendelsesloggen, tæller fejlede forsøg pr. IP-adresse ved hjælp af regulære udtryk og spærrer adresser, der overskrider en grænse, ved at tilføje firewallregler i et fastsat tidsrum. Standarden fra upstream er en spærring på 10 minutter efter 5 fejlede forsøg inden for 10 minutter. Hver server kører sin egen kopi med sin egen spærreliste. Den aktuelle version er 1.1.1 fra august 2026.

### Er fail2ban det værd?

Ja, på en offentlig tjeneste, der tager imod adgangskoder og logger mislykkede forsøg. Den er billig at køre og bremser brute force-gætning. For SSH betyder den mindre, end folk regner med. Med godkendelse kun med nøgler kan gætning af adgangskoder alligevel ikke lykkes, og kan SSH kun nås over et VPN eller et privat mesh-netværk, er der intet at spærre. Dens egen README siger, at den sænker antallet af forkerte logins, men ikke kan fjerne risikoen ved svag godkendelse.

### Sender CrowdSec mine logs til CrowdSec?

CrowdSecs dokumentation nævner ikke loglinjer blandt de data, der sendes, og der var ingen i de signaler, vi opfangede under testen. Når et scenarie udløses, sender Local API signalmetadata: scenariets navn, dets hash og version, tidspunktet for beslutningen, dit maskine-ID og den IP-adresse, der udløste det, med geolokation, hvor den findes. Den rapporterer også dine aktiverede scenarier og versionerne af motor og bouncers. I vores test af version 1.8.1 sendte motoren som standard signaler fra egne og ændrede scenarier uden tilmelding til konsollen, selv om dokumentationen siger, at den ikke gør det. Kommandoen sudo cscli console disable custom tainted stopper det. Sætter du sharing: false under online\_client, stopper signalerne, men motoren henter stadig bloklisten. Udkommenterer du hele online\_client-sektionen, fravælger du det helt og mister fællesskabets blokliste.

### Er CrowdSec gratis?

Security Engine og dens remediation components er MIT-licenserede og gratis at køre. Gratis brugere, der jævnligt deler signaler, får en fællesskabsblokliste på omkring 15.000 adresser, tilpasset deres scenarier; gratis brugere, der ikke gør, får en Lite-liste med et loft på 3.000. CrowdSec tager betaling for Console Premium pr. tilmeldt motor, for Platinum-bloklister med listepris fra 1.900 USD om måneden for små og mellemstore virksomheder og for adgang til IP reputation-API'et.

**Er du i tvivl om, hvad på din server der kan nås fra internettet?**

Den gratis servergennemgang ser på, hvad der er eksponeret, og det afgør, om spærringer overhovedet betyder noget. [Priser](/da/priser/).

[Gratis servergennemgang](/da/kontakt/)
