Fail2ban et nftables

Tags: #<Tag:0x00007fe25e9eb090> #<Tag:0x00007fe25e9eaaa0>

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. Avant de bricoler dans tout les sens, j’ai regardé si la configuration par défaut pourrait m’aller, et il semble que oui :

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 :

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 ?

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

include "/etc/nftables/fail2ban.conf"

in /etc/nftables.conf .

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.

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 .

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

Bonjour,

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

banaction = nftables-multiport
banaction_allports = nftables-allports

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

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 :

nft list ruleset

Donne aussi le retour de :

systemctl status nftables

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é.

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

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.

C’est un malheureux oubli qui me coutera cher :

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!