Nftables et jolie boucle pour renseigner un Element

Hello,

Je dois pas être futé, mais je bloque depuis des jours sur une tentative de création de règles pour nftables.

Voici ce que je veux faire : faire un script qui tourne tous les jours pour aller choper 2 fichiers de botnets avérés, déclarés par spamhaus. Cette liste étant mise à jour tous les jours, je voudrais injecter cette liste de réseaux dans nftables, dans une table à part, avec une rule toute simple.

En gros et pour prendre un exemple existant, mes tables devraient ressembler à ceci :

table ip filter {
        set blacklist-v4 {
                type ipv4_addr
                flags interval
                auto-merge
                elements = { 37.44.224.0/22, 80.94.96.0/20,
                             82.113.0.0/19, 87.238.104.0/21,
                             87.254.224.0/19, 88.209.64.0/18,
                             91.199.109.0/24, 176.114.96.0/20,
                             185.47.116.0/22, 185.162.120.0/22,
                             185.250.4.0/22, 188.191.136.0/21,
                             194.9.12.0/23, 195.20.192.0/23,
                             195.78.0.0/19, 213.133.72.0/21,
                             213.137.128.0/19 }
        }

        chain input {
                type filter hook input priority 0; policy accept;
                iifname lo accept
                ct state { established, related } accept
                ip saddr @blacklist-v4 drop
                ip protocol icmp accept
                tcp dport {http, https, ssh} ct state new accept
                drop
        }
}

Et c’est Element que je souhaiterais rendre dynamique.

Mais chez moi, ça se complique :

root@test:~# nft add table ip ban-ipv4
root@test:~# nft add chain ip ban-ipv4 input { type filter hook input priority 0 \; }
root@test:~# nft list ruleset
table inet filter {
        chain input {
                type filter hook input priority 0; policy accept;
                ct state { established, related } accept
                tcp flags != syn ct state new log prefix "DROP : Premier paquet non SYN" drop
                tcp flags & (fin | syn) == fin | syn log prefix "DROP : Port scan possible (1)" drop
                tcp flags & (syn | rst) == syn | rst log prefix "DROP : Port scan possible (2)" drop
                tcp flags & (fin | syn | rst | psh | ack | urg) < fin log prefix "DROP : Port scan possible (3)" drop
                tcp flags & (fin | syn | rst | psh | ack | urg) == fin | psh | urg log prefix " DROP : Port scan possible (4)" drop
                ct state invalid log prefix "DROP : Etat conntrack invalide " flags all counter packets 46 bytes 2057 drop
                iifname "lo" accept
                ip protocol icmp accept
                ip6 nexthdr ipv6-icmp accept
                tcp dport { 2278, 3389, munin } ip saddr { *****,******,***** } accept
                counter packets 15792 bytes 849825 drop
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                drop
        }

        chain output {
                type filter hook output priority 0; policy accept;
                accept
        }
}
table inet fail2ban {
        chain INPUT {
                type filter hook input priority 100; policy accept;
        }
}
table ip ban-ipv4 {
        chain input {
                type filter hook input priority 0; policy accept;
        }
}

Après, je souhaite créer une liste d’IP via un set, mais impossible de le faire :

root@test:~# nft add element ban-ipv4 blackhole { 192.168.1.4, 192.168.1.5 }
Error: Could not process rule: No such file or directory

D’ailleurs, je suis obligé de tout faire en bash car en zsh certaines commandes renvoient des erreurs.

Quelqu’un peut-il me dire comment créer mon set ?

J’y connais rien, mais je remarque que dans ton premier exemple, il est question de:

Et aprés, tu ne parles plus avec un s à la fin.
Ca ne serait pas nft add elements ban-ipv4 blackhole { 192.168.1.4, 192.168.1.5 } plutôt ?

Au feeling.

D’après la doc, c’est elements avec un S, ceci dit :

root@test:~# nft add elements ban-ipv4 blackhole { 192.168.1.4, 192.168.1.5 }
Error: syntax error, unexpected elements, expecting string
add elements ban-ipv4 blackhole { 192.168.1.4, 192.168.1.5 }
    ^^^^^^^^
root@test:~# nft add element ban-ipv4 blackhole { 192.168.1.4, 192.168.1.5 }
Error: Could not process rule: No such file or directory
add element ban-ipv4 blackhole { 192.168.1.4, 192.168.1.5 }

le problème reste entier :-\

Salut
Je pense que tu fais une erreur d’interprétation, selon ce que je comprends de la doc il existe pour nft des:

  • tables
  • rules
  • chain

https://wiki.archlinux.org/index.php/nftables

https://www.cert.ssi.gouv.fr/actualite/CERTFR-2017-ACT-030/

element n’apparait qu’avec set

https://wiki.nftables.org/wiki-nftables/index.php/Sets

Ici on voit des exemples
création d’une table puis ajout d’éléments dans la table

It is also possible to use named set. To declare one set containing ipv4 address:

nft add set filter ipv4_ad { type ipv4_address\;}

To add elements to the set:

nft add element filter ipv4_ad { 192.168.3.4 }
nft add element filter ipv4_ad { 192.168.1.4, 192.168.1.5 }

https://home.regit.org/netfilter-en/nftables-quick-howto/

Juste une précision :
Dans nftables, il existe des tables, qui contiennent des chains, qui elles-même contiennent des rules.

Amicalement.

Jean-Marie