ansibleguy.infra_nftables

Logo NFTables

Rôle Ansible - NFTables

Rôle pour configurer le pare-feu NFTables sur les serveurs Linux.

Offrez-moi un café

État des tests Molecule État des tests YamlLint État des tests PyLint État des tests Ansible-Lint Ansible Galaxy

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

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

    Voir : Guide de dépannage - 'Opération non prise en charge'

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

    Voir : Cas d'utilisation Docker Host

À propos du projet

Ansible Role to provision NFTables firewall on linux servers

Installer
ansible-galaxy install ansibleguy.infra_nftables
Licence
other
Téléchargements
4.4k
Propriétaire
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg