# Nftables et jolie boucle pour renseigner un Element

**URL:** <https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253>\
**Category:** Support Debian\
**Created:** [Septembre 24, 2019, 8:41 UTC](https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253 "2019-09-24T20:41:32Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![jhfra](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jhfra](https://www.debian-fr.org/u/jhfra)\
**Post date:** [Septembre 24, 2019, 8:41 UTC](https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253/1 "2019-09-24T20:41:32Z")

</div>

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 :

```auto
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 ?

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Septembre 24, 2019, 8:53 UTC](https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253/2 "2019-09-24T20:53:54Z")

</div>

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

> [@jhfra](#):
>
> (…)  
> auto-merge  
> **elements** = {  
> (…)

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.

---

<div class="post-metadata">

**Author:** ![jhfra](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jhfra](https://www.debian-fr.org/u/jhfra)\
**Post date:** [Septembre 24, 2019, 9:31 UTC](https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253/3 "2019-09-24T21:31:03Z")

</div>

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 :-\

---

<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:** [Septembre 25, 2019, 4:59 UTC](https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253/4 "2019-09-25T04:59:28Z")

</div>

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://wiki.archlinux.org/index.php/nftables)

[https://www.cert.ssi.gouv.fr/actualite/CERTFR-2017-ACT-030/](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](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

```auto
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/](https://home.regit.org/netfilter-en/nftables-quick-howto/)

---

<div class="post-metadata">

**Author:** ![diesel](https://www.debian-fr.org/user_avatar/www.debian-fr.org/diesel/32/8093_2.png) [@diesel](https://www.debian-fr.org/u/diesel)\
**Post date:** [Septembre 25, 2019, 8:24 UTC](https://www.debian-fr.org/t/nftables-et-jolie-boucle-pour-renseigner-un-element/80253/5 "2019-09-25T08:24:42Z")

</div>

> [@grandtoubab](#):
>
> 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

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

Amicalement.

Jean-Marie
