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