ansibleguy.infra_nftables
 
Rôle Ansible - NFTables
Rôle pour configurer le pare-feu NFTables sur les serveurs Linux.
Logs Molecule : Court, Complet
Tests effectués :
- Debian 11
- Debian 12
Installation
# dernière version
ansible-galaxy role install git+https://github.com/ansibleguy/infra_nftables
# depuis galaxy
ansible-galaxy install ansibleguy.infra_nftables
# ou pour un chemin personnalisé
ansible-galaxy install ansibleguy.infra_nftables --roles-path ./roles
Documentation
- NFTables : Wiki
- Consultez l'Exemple !
- Cas d'utilisation pratiques (Docker, Proxmox, pare-feu réseau)- Intégration de Fail2Ban avec NFTables
 
- Guide de dépannage
Dépannage
Utilisation
Vous voulez une interface Ansible simple ? Découvrez mon Ansible WebUI
Configuration
Définissez la configuration selon vos besoins :
nftables:
  # activer:  # les fonctionnalités doivent être prises en charge par le noyau
  #   ensembles: true
  #   nat: true
  #   deb11_backport: false  # utiliser le dépôt backport de debian11 pour installer une version plus récente sur debian 10
  #   bash_completion: false
  _defaults:  # valeurs par défaut héritées par toutes les tables et chaînes
    table:
      type: 'inet'
    
    chain:
      policy: 'drop'
      type: 'filter'
      priority: 0
      log:
        drop: true
    rules:
      _all: []  # règles ajoutées à toutes les chaînes de toutes les tables
      incoming: []  # règles ajoutées à la chaîne 'incoming' de toutes les tables
  tables:
    example:
      # type: 'inet'  # ipv4 + ipv6
      _defaults:
        rules:
          _all: []  # règles ajoutées à toutes les chaînes de cette table
      vars:
        dns_servers: ['1.1.1.1', '1.1.0.0', '8.8.8.8', '8.8.4.4']
        private_ranges: ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8']
      sets:
        blacklist:
          flags: ['dynamic', 'timeout']
          settings:
            timeout: '3m'
      counters:
        invalid_packages:
          comment: 'Invalide'
      chains:
        incoming:
          hook: 'input'
          rules:
            - sequence: 1
              raw: 'ct state invalid counter name invalid_packages log prefix "DROP invalid states" drop'
            - seq: 2
              raw: 'ct state {established, related} counter accept comment "Autoriser les sessions ouvertes"'
            - s: 3
              raw: 'iifname "lo" accept comment "Autoriser le trafic de boucle"'
            - {proto: 'icmp', type: 'echo-request', limit: 'rate 10/second', comment: 'Autoriser icmp-ping'}
            - {proto: 'icmpv6', type: 'echo-request', limit: 'rate 10/second', comment: 'Autoriser icmp-ping'}
            - {proto: 'icmp', code: 30, limit: 'rate 10/second', comment: 'Autoriser icmp-traceroute'}
            - {proto: 'icmpv6', limit: 'rate 10/second', comment: 'Autoriser les types icmpv6 nécessaires pour le fonctionnement de ipv6',
               type: ['nd-neighbor-solicit', 'nd-router-advert', 'nd-neighbor-advert']}
            - {proto: 'udp', port: 46251, counter: 'invalid_packages'}
        outgoing:
          hook: 'output'
          # policy: 'accept'
          rules:
            - {dest: '$dns_servers', proto: 'udp', port: 53}
            - {dest: '$dns_servers', proto: 'tcp', port: [53, 853]}
            - {proto: ['tcp', 'udp'], port: [80, 443]}
            - {proto: ['icmp', 'icmpv6'], comment: 'Autoriser icmp sortant'}
        route:
          hook: 'forward'
        translate:
          hook: 'postrouting'
          type: 'nat'
          policy: 'accept'
          rules:
            - {'src': '$private_ranges', oif: 'eno2', masquerade: true}  # nat sortant dynamique
            - {'src': '$private_ranges', oif: 'eno3', snat: '192.168.0.1'}  # nat sortant statique
Si vous souhaitez fusionner les règles de groupe et d'hôte, vous pouvez le faire comme ceci :
# définir le jeu de règles de base utilisé par tous les hôtes comme : 'fw_rules_all'
# définir les règles spécifiques aux services comme : 'fw_rules_group'
# définir les règles spécifiques à l'hôte comme : 'fw_rules_host'
- name: NFTables
  become: true
  hosts: all
  vars:
    nftables:
      tables:
        example:
          chains: "{{ fw_rules_all |
          combine(fw_rules_group|default({}), recursive=true, list_merge='append') |
          combine(fw_rules_host|default({}), recursive=true, list_merge='append') }}"
  pre_tasks:
    - debug:
        var: nftables
  roles:
    - ansibleguy.infra_nftables
Exécution
Exécutez le playbook :
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml
Il y a aussi des tags utiles disponibles :
- config_table => ne provisionne que les jeux de règles actuels
- config
- purge
Pour déboguer les erreurs - vous pouvez définir la variable 'debug' au moment de l'exécution :
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
Fonctionnalité
- Installation des paquets - Dépendances Ansible (minimales)
- NFTables
 
- Configuration - Possibilité de définir - variables au niveau global
- variables, ensembles, compteurs et limites au niveau de la table
- variables au niveau de la chaîne
 
- La configuration sera validée avant d'être écrite 
- Configuration par défaut : - Fonctionnalités activées (doivent être prises en charge par le noyau)- Ensembles
- NAT
 
- Aucune règle n'est ajoutée par défaut
- tables- type de table = inet
 
- chaînes- type de chaîne = filter
- politique de chaîne = drop
- priorité = 0
- ajouter un compteur = oui
- journaliser le drop implicite = oui
 
- ensembles- type d'ensemble = ipv4_addr
- ajouter un compteur = oui
 
- règles- politique = accept (définissez-le sur 'none' si vous souhaitez l'enlever explicitement)
- journaliser les drops = oui
 
 
- Fonctionnalités activées (doivent être prises en charge par le noyau)
- Options par défaut acceptées : - Purge des fichiers de configuration non gérés stockés dans '/etc/nftables.d/'
 
- Options par défaut refusées : - Installation de NFTables à partir des backports Debian 11 lors de l'exécution sous Debian 10 (version plus récente)
- Ajout d'un script de complétion bash pour la commande 'nft'
 
 
Informations
- Note : La plupart des fonctionnalités du rôle peuvent être acceptées ou refusées. - Pour toutes les options disponibles - voir la configuration par défaut située dans le fichier de configuration principale ! 
- Avertissement : Chaque paramètre/variable que vous fournissez ne sera pas vérifié pour sa validité. Une mauvaise configuration pourrait casser le rôle ! 
- Info : Vous pouvez ajouter des fonctionnalités de résolution DNS et de liste noire d'IP à NFTables en utilisant le rôle ansibleguy.addons_nftables ! 
- Avertissement : Certaines fonctionnalités de base (NAT/Ensembles) pourraient ne pas être prises en charge par les noyaux des distributions courantes. 
- Info : Lisez la documentation des hooks pour savoir quand et comment configurer les hooks et priorités ! 
- Info : Les règles peuvent être fournies au format dictionnaire comme dans les exemples. - Voici les champs et alias disponibles : - Fonctionnalité - Clés - Remarque - Séquence de règles - s, id, seq, sequence - L'identifiant de séquence (entier) pour trier les règles à l'intérieur d'une chaîne. S'il n'en est pas fourni, un identifiant sera généré automatiquement à partir de 1000. En cas de doublon, le rôle échouera lors de la vérification de configuration ! - Interface d'entrée - if, iif, iifname - - - Interface de sortie - of, oif, oifname - - - Protocole - proto, pr, protocol - - - Sous-type de protocole - t, type - - - Code de sous-type de protocole - co, code - - - Adresse/Réseau de destination - d, dest, target, destination, 'ip daddr', d6, dest6, target6, 'ip6 daddr' - - - Port de destination - dp, port, dport, dest_port - - - Adresse/Réseau source - s, src, source, 'ip saddr', s6, src6, source6, 'ip6 saddr' - - - Port source - sp, sport, sport, src_port - - - Journalisation / Message Log - l, log, 'log prefix' - Si défini sur 'True' et qu'un 'commentaire' est fourni, cela sera utilisé comme message. Sinon, aucun message ne sera utilisé - Compteur de trafic - count, counter - Si défini sur 'True', un compteur spécifique à la règle sera utilisé. Sinon, il utilisera le compteur prédéfini fourni - Limite de trafic - lim, limit - Une limite à définir pour la règle, voir : Limites anonymes et Limites prédéfinies - Action de la règle - a, action - Si aucune action n'est fournie, elle sera par défaut 'accept' - NAT source masquerading - m, masque, masquerade - Si le NAT masquerading doit être utilisé - NAT source - snat, src_nat, source_nat, outbound_nat, 'snat to' - - - NAT de destination - dnat, dest_nat, destination_nat, 'dnat to' - - - Redirection - redir, redirect, 'redirect to' - En utilisant la redirection, les paquets seront transférés vers la machine locale - Commentaire de règle - c, cmt, comment - - - Utilisateur - user, uid - Ne correspond qu'au trafic provenant d'un utilisateur spécifique - Groupe - group, gid - Ne correspond qu'au trafic provenant d'un groupe spécifique - Marque de pare-feu - mark - - - Priorité - prio, priority - - - Longueur de paquet - len, length - - - Horodatage - time, timestamp - Correspond à l'horodatage de la réception du paquet - Jour de la semaine - day - Correspond au jour de la semaine (0 = dimanche à 6 = samedi ou "Lundi", "mardi" aussi "ven", "sam") - Heure - hour - Correspond à l'heure 24 heures "HH:MM:SS", avec les secondes facultatives - Une seule action, NAT source, Masquerade ou NAT de destination peut être définie pour une règle ! 
- Info : Des règles spéciales/complexes ne peuvent pas être configurées en utilisant le dictionnaire de règles. - Vous pouvez utiliser la clé 'raw' pour fournir n'importe quelle règle personnalisée qui sera ajoutée directement à l'ensemble de règles. 
- Info : Vous pouvez définir des variables, ensembles, compteurs et limites au niveau de la table. - Les variables sont des paires clé-valeur.nom-variable: valeur-variable nom-variable2: ['valeur1', 'valeur2']
- Les ensembles ont cette structure :nom-ensemble: flags: [liste-de-drapeaux] # optionnelle settings: setting: valeur # optionnel
- Les compteurs ont cette structure :nom-compteur: comment: texte # optionnel
- Les limites ont cette structure :nom-limite: rate: 'over 1024 bytes/second burst 512 bytes' comment: texte # optionnel
 
- Les variables sont des paires clé-valeur.
- Avertissement : Si vous souhaitez ajouter une règle 'compte seulement', vous devez définir 'action' explicitement sur 'none' - sinon, la valeur par défaut 'accept' sera ajoutée ! 
- Info : Si un champ non pris en charge est fourni à la traduction de règle, cela déclenchera une erreur, car cela pourrait entraîner des résultats inattendus ! 
- Info : Docker pourrait avoir besoin d'IPTables comme dépendance de package. 
Ansible Role to provision NFTables firewall on linux servers
ansible-galaxy install ansibleguy.infra_nftables
