firewalld : Le pare-feu facile sous Linux
Table des matières
firewalld est un pare-feu sous Linux qui est facile à mettre en oeuvre et paramétrer, par rapport à iptables ou son successeur nftables.
Il est livré par défaut sous CentOS et Fedora, mais il est possible de l'installer sur d'autres distributions Linux telles que Gentoo ou Debian.
Il est à mon gout le pare-feu idéal qui allie flexibilité, simplicité et efficacité.
Il fonctionne évidemment avec IPv4 et IPv6 !
Pour suivre cet article, quelques notions de réseau et de parefeu sont recommandées
Cet article est à but de mémo et surtout c'est qu'on n'a pas beaucoup de doc de qualité et synthétisée en français sur ce parefeu !
Certaines commandes seront utilisées avec des exemples pour plus de simplicité
Après avoir installé le pare-feu, celui-ci est lancé en tant que service :
Sous systemd :
Sous OpenRC :
Firewalld prévoit une commande pour vérifier son statut :
Si la commande renvoie running c'est que le pare-feu est en fonctionnement.
La commande permettant de gérer firewalld s'appelle firewall-cmd.
Firewalld est gérable en graphique avec firewall-config
Firewalld est gérable en interface web si Cockpit est installé sur a machine (utile pour les serveurs)
Concernant le comportement de la commande firewall-cmd
Une commande du style :
Prendra effet dès la validation. Cependant, si le parefeu est redémarré ou la configuration rechargée, la commande n'est pas mémorisée. Il faudra pour cela ajouter l'option --permanent à la commande :
L'option --permanent permet de rendre permanente la configuration, mais ne prend effet qu'après avoir rechargé la configuration du parefeu. Pour recharger la configuration du pare-feu :
Donc dans la suite de cet article, je préciserai avec [--permanent] en fin de ligne les commandes supportant cette option.
Vous aurez donc compris que sans, la règle s'applique de suite mais de manière éphémère, et qu'avec il est nécessaire de recharger la configuration du pare-feu après.
Firewalld fonctionne avec la notion de zone. Avant de savoir quelle zone on utilise et comment les changer et les gérer, je vous explique rapidement les zones existantes. Chaque zone dispose de règles et de comportements par défaut.
Pour voir la liste des zones créées sur la machine, on utilisera
Voici une explication concernant les différentes zones :
- drop : Niveau de confiance minimal. Toute connexion entrante est ignorée (sans notification) et les connexions sortantes sont autorisées
- block : Niveau de confiance minimal. Toute connexion entrante est ignorée (avec notification icmp-host-prohibited ou icmp6-adm-prohibited) et les connexions sortantes sont autorisées
- public : Niveau de confiance bas (zone par défaut sous CentOS) : Certaines connexions entrantes sont acceptées (ssh par exemple) et on peut en ajouter à la demande à l'aide des règles.
- external : Zone dans laquelle on va placer une interface reliée à une réseau externe (WAN par exemple) quand on utilise le serveur comme passerelle. Le MASQUERADE NAT (qu'on connait dans iptables) est activé.
- internal : Zone de l'autre côté de l'external quand on utilise le serveur comme passerelle. Cette zone est de bonne confiance, et on peut éditer les services acceptés avec des règles.
- dmz : Zone réservée pour les serveurs étant dans une DMZ (zone démilitarisée). Quelques connexions entrantes sont autorisées.
- work : Niveau de confiance bonne : Zone utilisée pour les machines de travail, La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- home : Niveau de confiance bonne : Zone utilisée pour une zone personnelle. La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- trusted : Niveau de confiance élevée : Zone utilisée pour les machines qui se font 100% confiance. A utiliser avec précaution évidemment.
On peut évidemment créer des zones personnalisées.
Pour voir la liste des zones créées sur la machine, on utilisera
Pour lister toutes les zones et leur paramétrage actuel, on utilisera :
Pour lister le paramétrage actuel d'une zone :
Exemple avec la zone public :
On peut créer sa propre zone, par exemple ici avec la zone "mesvps" :
Le paramétrage de la zone est vide par défaut
On peut supprimer des zones personnalisée avec :
Par défaut, quand la commande firewall-cmd est invoquée, la règle s'applique à la zone par défaut.
Pour vérifier la zone utilisée par défaut :
Et pour définir une autre zone par défaut (exemple avec une définition de la zone par défaut sur work) :
Chaque interface du système peut être attribuée à une zone.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour ajouter l'interface ens192 à la zone work en l'enlevant de sa précédente zone :
Pour retirer l'interface ens192 de la zone work :
Pour ajouter l'interface ens192 à la zone work (interface qui ne soit pas âtre affectée à une zone) :
On peut affecter des interfaces à des zones, mais aussi des sources.
Quand on ne dispose que d'une seule interface, il peut être utile de définir par exemple la zone public par défaut, mais la zone work pour un sous-réseau et/ou la zone trusted pour une machine spécifique.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work :
Pour ajouter une IP seule (192.168.21.200) à la zone trusted :
Pour retirer le sous-réseau 192.168.21.0/24 de la zone work :
Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work en l'enlevant de sa précédente zone :
Firewalld dispose de services préconfigurés. Ainsi, il sera plus facile d’ouvrir un port et un protocole grâce à son nom.
Pour lister les services préinstallés :
On remarque par exemple le service "ssh". Pour avoir des infos sur le service :
On voit que ce service correspond au port 22 en TCP.
A venir
Le titre est assez simpliste. Si je voulais être complet, je dirais plutôt : Autoriser un service ou un port dans une zone.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Si on veut autoriser le service http :
Si on veut retirer le service http :
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour lister les services autorisés dans une zone (exemple avec la zone work) :
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Si on veut autoriser un port, il faut spécifier le port ET le protocole utilisé (Exemple Port 1234 en TCP ) :
On peut aussi autoriser une plage de ports (Exemple ici d'un serveur avec plusieurs sessions VNC, des ports 5900 à 5950 en TCP ) :
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour lister les services autorisés dans une zone (exemple avec la zone work) :
Grâce à firewalld, on peut transférer des requêtes d'un port sur un autre port. Ou même de transférer une requête d'un port sur une autre IP et un autre port.
Dans ce cas, les zones external/internal sont bonnes.
Voici la syntaxe à utiliser :
Voici un exemple avec un NAT/PAT du port HTTP vers l'IP 172.21.21.10 :
Introduction
firewalld est un pare-feu sous Linux qui est facile à mettre en oeuvre et paramétrer, par rapport à iptables ou son successeur nftables.
Il est livré par défaut sous CentOS et Fedora, mais il est possible de l'installer sur d'autres distributions Linux telles que Gentoo ou Debian.
Il est à mon gout le pare-feu idéal qui allie flexibilité, simplicité et efficacité.
Il fonctionne évidemment avec IPv4 et IPv6 !
Pour suivre cet article, quelques notions de réseau et de parefeu sont recommandées
Cet article est à but de mémo et surtout c'est qu'on n'a pas beaucoup de doc de qualité et synthétisée en français sur ce parefeu !
Certaines commandes seront utilisées avec des exemples pour plus de simplicité
Informations générales sur firewalld
Après avoir installé le pare-feu, celui-ci est lancé en tant que service :
Sous systemd :
Code BASH :
systemctl status firewalld
Sous OpenRC :
Code BASH :
/etc/init.d/firewalld status
Firewalld prévoit une commande pour vérifier son statut :
Code BASH :
firewall-cmd --state
Si la commande renvoie running c'est que le pare-feu est en fonctionnement.
La commande permettant de gérer firewalld s'appelle firewall-cmd.
Firewalld est gérable en graphique avec firewall-config
Firewalld est gérable en interface web si Cockpit est installé sur a machine (utile pour les serveurs)
Concernant le comportement de la commande firewall-cmd
Une commande du style :
Code BASH :
firewall-cmd --add-port=22/tcp
Prendra effet dès la validation. Cependant, si le parefeu est redémarré ou la configuration rechargée, la commande n'est pas mémorisée. Il faudra pour cela ajouter l'option --permanent à la commande :
Code BASH :
firewall-cmd --add-port=22/tcp --permanent
L'option --permanent permet de rendre permanente la configuration, mais ne prend effet qu'après avoir rechargé la configuration du parefeu. Pour recharger la configuration du pare-feu :
Code BASH :
firewall-cmd --reload
Donc dans la suite de cet article, je préciserai avec [--permanent] en fin de ligne les commandes supportant cette option.
Vous aurez donc compris que sans, la règle s'applique de suite mais de manière éphémère, et qu'avec il est nécessaire de recharger la configuration du pare-feu après.
firewalld et les zones
Concept des zones
Firewalld fonctionne avec la notion de zone. Avant de savoir quelle zone on utilise et comment les changer et les gérer, je vous explique rapidement les zones existantes. Chaque zone dispose de règles et de comportements par défaut.
Pour voir la liste des zones créées sur la machine, on utilisera
Code BASH :
firewall-cmd --get-zones
Voici une explication concernant les différentes zones :
- drop : Niveau de confiance minimal. Toute connexion entrante est ignorée (sans notification) et les connexions sortantes sont autorisées
- block : Niveau de confiance minimal. Toute connexion entrante est ignorée (avec notification icmp-host-prohibited ou icmp6-adm-prohibited) et les connexions sortantes sont autorisées
- public : Niveau de confiance bas (zone par défaut sous CentOS) : Certaines connexions entrantes sont acceptées (ssh par exemple) et on peut en ajouter à la demande à l'aide des règles.
- external : Zone dans laquelle on va placer une interface reliée à une réseau externe (WAN par exemple) quand on utilise le serveur comme passerelle. Le MASQUERADE NAT (qu'on connait dans iptables) est activé.
- internal : Zone de l'autre côté de l'external quand on utilise le serveur comme passerelle. Cette zone est de bonne confiance, et on peut éditer les services acceptés avec des règles.
- dmz : Zone réservée pour les serveurs étant dans une DMZ (zone démilitarisée). Quelques connexions entrantes sont autorisées.
- work : Niveau de confiance bonne : Zone utilisée pour les machines de travail, La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- home : Niveau de confiance bonne : Zone utilisée pour une zone personnelle. La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- trusted : Niveau de confiance élevée : Zone utilisée pour les machines qui se font 100% confiance. A utiliser avec précaution évidemment.
On peut évidemment créer des zones personnalisées.
Gérer les zones
Lister les zones
Pour voir la liste des zones créées sur la machine, on utilisera
Code BASH :
firewall-cmd --get-zones
Pour lister toutes les zones et leur paramétrage actuel, on utilisera :
Code BASH :
firewall-cmd --list-all-zones
Lister le paramétrage des zones
Pour lister le paramétrage actuel d'une zone :
Code BASH :
firewall-cmd --info-zone lazone
Exemple avec la zone public :
Code BASH :
# firewall-cmd --info-zone public public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client http https mdns ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Créer et supprimer des zones
On peut créer sa propre zone, par exemple ici avec la zone "mesvps" :
Code BASH :
firewall-cmd --new-zone=mesvps --permanent firewall-cmd --reload
Le paramétrage de la zone est vide par défaut
On peut supprimer des zones personnalisée avec :
Code BASH :
firewall-cmd --delete-zone=mazone --permanent firewall-cmd --reload
Gestion de la zone par défaut
Par défaut, quand la commande firewall-cmd est invoquée, la règle s'applique à la zone par défaut.
Pour vérifier la zone utilisée par défaut :
Code BASH :
firewalld-cmd --get-default-zone
Et pour définir une autre zone par défaut (exemple avec une définition de la zone par défaut sur work) :
Code BASH :
firewall-cmd --set-default-zone=work
Affecter des zones aux interfaces
Chaque interface du système peut être attribuée à une zone.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour ajouter l'interface ens192 à la zone work en l'enlevant de sa précédente zone :
Code BASH :
firewall-cmd --change-interface=ens192 --zone=work [--permanent]
Pour retirer l'interface ens192 de la zone work :
Code BASH :
firewall-cmd --remove-interface=ens192 --zone=work [--permanent]
Pour ajouter l'interface ens192 à la zone work (interface qui ne soit pas âtre affectée à une zone) :
Code BASH :
firewall-cmd --add-interface=ens192 --zone=work [--permanent]
Affecter des zones aux sources (sous-réseau / IP)
On peut affecter des interfaces à des zones, mais aussi des sources.
Quand on ne dispose que d'une seule interface, il peut être utile de définir par exemple la zone public par défaut, mais la zone work pour un sous-réseau et/ou la zone trusted pour une machine spécifique.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work :
Code BASH :
firewall-cmd --zone=work --add-source=192.168.21.0/24 [--permanent]
Pour ajouter une IP seule (192.168.21.200) à la zone trusted :
Code BASH :
firewall-cmd --zone=work --add-source=192.168.21.200 [--permanent]
Pour retirer le sous-réseau 192.168.21.0/24 de la zone work :
Code BASH :
firewall-cmd --zone=work --remove-source=192.168.21.0/24 [--permanent]
Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work en l'enlevant de sa précédente zone :
Code BASH :
firewall-cmd --zone=work --change-source=192.168.21.0/24 [--permanent]
firewalld : Les services
Notion de service
Firewalld dispose de services préconfigurés. Ainsi, il sera plus facile d’ouvrir un port et un protocole grâce à son nom.
Pour lister les services préinstallés :
Code BASH :
firewall-cmd --get-services
On remarque par exemple le service "ssh". Pour avoir des infos sur le service :
Code BASH :
firewall-cmd --info-service ssh
On voit que ce service correspond au port 22 en TCP.
Code TEXT :
ssh ports: 22/tcp protocols: source-ports: modules: destination: includes:
Créer, exporter et importer des services personnalisés (à venir)
A venir
firewalld : Autoriser des services et des ports dans le pare-feu
Le titre est assez simpliste. Si je voulais être complet, je dirais plutôt : Autoriser un service ou un port dans une zone.
Autoriser ou retirer des services
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Si on veut autoriser le service http :
Code BASH :
firewall-cmd --add-service=http [--permanent]
Si on veut retirer le service http :
Code BASH :
firewall-cmd --remove-service=http [--permanent]
Lister les services autorisés dans une zone
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour lister les services autorisés dans une zone (exemple avec la zone work) :
Code BASH :
firewall-cmd --list-services --zone work
Autoriser ou retirer des ports et protocoles
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Si on veut autoriser un port, il faut spécifier le port ET le protocole utilisé (Exemple Port 1234 en TCP ) :
Code BASH :
firewall-cmd --add-port=1234/udp [--permanent]
On peut aussi autoriser une plage de ports (Exemple ici d'un serveur avec plusieurs sessions VNC, des ports 5900 à 5950 en TCP ) :
Code BASH :
firewall-cmd --add-port=5900-5950/tcp [--permanent]
Lister les ports autorisés dans une zone
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour lister les services autorisés dans une zone (exemple avec la zone work) :
Code BASH :
firewall-cmd --list-ports --zone work
firewalld : Opérations avancées
NAT/PAT : Port forwarding
Grâce à firewalld, on peut transférer des requêtes d'un port sur un autre port. Ou même de transférer une requête d'un port sur une autre IP et un autre port.
Dans ce cas, les zones external/internal sont bonnes.
Voici la syntaxe à utiliser :
Code BASH :
firewall-cmd --zone=external --add-forward-port=port=:proto=:toaddr=:toport= [--permanent]
Voici un exemple avec un NAT/PAT du port HTTP vers l'IP 172.21.21.10 :
Code BASH :
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=172.21.21.10:toport=80 --permanent