# Fail2ban et nftables

**URL:** <https://www.debian-fr.org/t/fail2ban-et-nftables/82431>\
**Category:** Support Debian\
**Tags:** pare-feu, fail2ban\
**Created:** [Juin 29, 2020, 2:09 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431 "2020-06-29T14:09:53Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![sk4hrr](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/7bcc69/32.png) [@sk4hrr](https://www.debian-fr.org/u/sk4hrr)\
**Post date:** [Juin 29, 2020, 2:09 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/1 "2020-06-29T14:09:53Z")

</div>

Bonjour,

Depuis que Buster est sorti, je suis passé sous `nftables` en me passant de `fail2ban` faute de documentation sur le fonctionnement de ce duo. Aujourd’hui, je me suis intéressé à la chose en tombant sur [ce site](https://wiki.meurisse.org/wiki/Fail2Ban#nftables). Avant de bricoler dans tout les sens, j’ai regardé si la configuration par défaut pourrait m’aller, et il semble que oui :

```bash
sk4hrr@zazu:~$ cat /etc/nftables.conf
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0;

    # accept any localhost traffic
    iif lo accept

    # accept traffic originated from us
    ct state established,related accept

    # accept neighbour discovery otherwise IPv6 connectivity breaks.
    ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept

    ## Custom
    # Allow SSH from ANY
    tcp dport 22 accept

    # count and drop any other traffic
    counter drop
  }
}

```

J’ai configurer `fail2ban` de la sorte :

```bash
sk4hrr@zazu:~$ cat /etc/fail2ban/jail.d/99-custom.conf 
[DEFAULT]
ignoreip = 127.0.0.1/8, 192.168.3.0/24
findtime = 3600
bantime = 86400
maxretry = 3

[sshd]
enabled = true

```

J’ai effectuer des tentatives de connexion répétées depuis une IP absente de la liste blanche et malheureusement, je ne suis jamais bloqué. Je n’ai pas d’erreur dans le fichier `/var/log/fail2ban.log`.

J’ai alors tenté ce qui est expliqué sur le site dont je parle au début, mais sans succès.

Est-ce quelqu’un aurait une idée sur ce qu’il se passe mal ?

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Juin 29, 2020, 6:00 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/2 "2020-06-29T18:00:17Z")

</div>

As tu fait ce qui est indiqué?  
Then add line

`include "/etc/nftables/fail2ban.conf"`

in `/etc/nftables.conf` .

---

<div class="post-metadata">

**Author:** ![sk4hrr](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/7bcc69/32.png) [@sk4hrr](https://www.debian-fr.org/u/sk4hrr)\
**Post date:** [Juin 30, 2020, 7:36 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/3 "2020-06-30T07:36:36Z")

</div>

Au lieu d’inclure un fichier dans un dossier qui n’est pas fourni de base, j’ai mis le contenu directement dans mon `nftables.conf`.

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Juin 30, 2020, 7:45 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/4 "2020-06-30T07:45:20Z")

</div>

D’après ce que je comprends il faut faire une référence à fail2ban dans la conf `/etc/nftables.conf`

c’est le sens de la phrase  
_Then add line_

_`include "/etc/nftables/fail2ban.conf"`_

_in `/etc/nftables.conf` ._

---

<div class="post-metadata">

**Author:** ![sk4hrr](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/7bcc69/32.png) [@sk4hrr](https://www.debian-fr.org/u/sk4hrr)\
**Post date:** [Juin 30, 2020, 7:55 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/5 "2020-06-30T07:55:43Z")

</div>

Oui bien entendu, mais que j’inclus le fichier où que je mettes les instructions directement dans mon fichier `/etc/nftables.conf`, c’est pareil, non ?

Pour avoir une vue globale de ce que j’ai fait : [https://paste.chapril.org/?31b51b484831ab48#2zWdTqnggCV9fAWSDjYDVoKkGZLsK2M5D3ACv2KYPqfP](https://paste.chapril.org/?31b51b484831ab48#2zWdTqnggCV9fAWSDjYDVoKkGZLsK2M5D3ACv2KYPqfP)

---

<div class="post-metadata">

**Author:** ![anon70622873](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@anon70622873](https://www.debian-fr.org/u/anon70622873)\
**Post date:** [Juin 30, 2020, 8:16 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/6 "2020-06-30T08:16:20Z")

</div>

Bonjour,

Pour que fail2ban utilise nftables à la place de iptables **il faut et il suffit d’ajouter ces directives dans ton fichier custom.conf** :

```nohighlight
banaction = nftables-multiport
banaction_allports = nftables-allports

```

---

<div class="post-metadata">

**Author:** ![sk4hrr](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/7bcc69/32.png) [@sk4hrr](https://www.debian-fr.org/u/sk4hrr)\
**Post date:** [Juin 30, 2020, 8:49 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/7 "2020-06-30T08:49:19Z")

</div>

J’ai également testé ça, mais sans succès.

---

<div class="post-metadata">

**Author:** ![anon70622873](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@anon70622873](https://www.debian-fr.org/u/anon70622873)\
**Post date:** [Juin 30, 2020, 9:12 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/8 "2020-06-30T09:12:22Z")

</div>

C’est à dire ? Quel est le problème ?  
Si tu fais ce que j’ai indiqué, sans modifier /etc/nftables.conf, cela doit fonctionner. Évidement il faut relancer le service fail2ban après modification.  
Avec un serveur SSH accessible publiquement sur le port 22 tu devrais rapidement voir les IP bannies dans les logs de fail2ban et observer les règles nftables crées par fail2ban :

```nohighlight
nft list ruleset

```

Donne aussi le retour de :

```nohighlight
systemctl status nftables

```

---

<div class="post-metadata">

**Author:** ![sk4hrr](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/7bcc69/32.png) [@sk4hrr](https://www.debian-fr.org/u/sk4hrr)\
**Post date:** [Juin 30, 2020, 9:33 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/9 "2020-06-30T09:33:50Z")

</div>

Je n’ai pas de serveur publique qui écoute sur le port par défaut de SSH. Actuellement je fais les tests sur des conteneurs qui sont hébergés chez moi avant de déployer ça sur mon dédié.

```bash
sk4hrr@bastion:~$ sudo nft list ruleset
table ip fail2ban {
	chain input {
		type filter hook input priority 100; policy accept;
	}
}
table inet filter {
	chain input {
		type filter hook input priority 0; policy accept;
		iif "lo" accept
		ct state established,related accept
		ip6 nexthdr 58 icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
		tcp dport ssh accept
		ip saddr 192.168.1.94 tcp dport zabbix-agent accept
		counter packets 788 bytes 122138 drop
	}
}
sk4hrr@bastion:~$ sudo systemctl status nftables
● nftables.service - nftables
   Loaded: loaded (/lib/systemd/system/nftables.service; enabled; vendor preset: enabled)
   Active: active (exited) since Tue 2020-06-30 09:47:24 CEST; 1h 36min ago
     Docs: man:nft(8)
           http://wiki.nftables.org
  Process: 3620 ExecStart=/usr/sbin/nft -f /etc/nftables.conf (code=exited, status=0/SUCCESS)
 Main PID: 3620 (code=exited, status=0/SUCCESS)

juin 30 09:47:24 bastion systemd[1]: Starting nftables...
juin 30 09:47:24 bastion systemd[1]: Started nftables.
sk4hrr@bastion:~$ cat /etc/fail2ban/jail.d/99-custom.conf 
[DEFAULT]
ignoreip = 127.0.0.1/8, 192.168.1.5/24
findtime = 3600
bantime = 86400
maxretry = 3
banaction = nftables-multiport
banaction_allports = nftables-allports

[sshd]
enabled = true

```

Mon protocol de test :

1. Remettre fail2ban et nftables dans un état classique (avant les modif’ du site)
2. Appliquer la configuration que tu m’as recommandé
3. Redémarrer nftables puis fail2ban
4. Afficher les règles de nftables
5. Depuis un conteneur n’étant pas en liste blanche, tenter de me connecter (message normal: `Permission denied (publickey).`)
6. Effectuer le 5 plusieurs fois de suite
7. Constater que je ne suis pas bloquer et peux recommencer autant de fois que je le veux

---

<div class="post-metadata">

**Author:** ![anon70622873](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@anon70622873](https://www.debian-fr.org/u/anon70622873)\
**Post date:** [Juin 30, 2020, 9:54 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/10 "2020-06-30T09:54:03Z")

</div>

Ok merci pour ces précisions très claires.  
Je ne vois rien d’anormal qui pourrait empêcher fail2ban de fonctionnera avec nftables.  
Je t’invite à réessayer en commentant la ligne _ignoreip_ surtout que tes masques ne me semblent pas corrects. Est-ce que tu veux mettre en liste blanche toutes les IP de la plage 192.168.1.0-192.168.1.255 ou uniquement 192.168.1.5 ? Dans le premier cas il faut utiliser 192.168.1.0/24 dans le second uniquement 192.168.1.5.

---

<div class="post-metadata">

**Author:** ![sk4hrr](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/7bcc69/32.png) [@sk4hrr](https://www.debian-fr.org/u/sk4hrr)\
**Post date:** [Juin 30, 2020, 9:58 UTC](https://www.debian-fr.org/t/fail2ban-et-nftables/82431/11 "2020-06-30T09:58:32Z")

</div>

C’est un malheureux oubli qui me coutera cher :

```bash
sk4hrr@bastion:~$ sudo nft list ruleset
table inet filter {
	set f2b-sshd {
		type ipv4_addr
		elements = { 192.168.1.83 }
	}

	chain input {
		type filter hook input priority 0; policy accept;
		tcp dport { ssh } ip saddr @f2b-sshd reject
		iif "lo" accept
		ct state established,related accept
		ip6 nexthdr 58 icmpv6 type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept
		tcp dport ssh accept
		ip saddr 192.168.1.94 tcp dport zabbix-agent accept
		counter packets 225 bytes 37228 drop
	}
}

```

Mon but originel était effectivement d’exclure mon réseau local, mais je me suis ravisé ensuite, sauf que j’ai oublié d’enlever le `/24`… Du coup maintenant c’est tout bon !

Merci beaucoup!
