Généralités système Linux

firewalld : Le pare-feu facile sous Linux

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

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 : Opérations de base



Notion de service



Ouvrir et Fermer 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.


firewalld : Opérations avancées



NAT/PAT : Port forwarding




Créer des services personnalisés