Le framework netfilter
est utilisé pour les opérations de trafic réseau (filtrage paquets, traduction d’adresses, traduction de ports).
La structure netfilter comprend des hooks (scripts automatiques) pour interagir avec les paquets réseau entrants. Ces hooks sont des routines noyau qui interceptent les
événements et lancent d’autres routines connexes (règles de pare-feu).
Achitecture du pare-feu firewalld
nftables
La structure nftables
s’appuie sur netfilter
pour appliquer les règles de pare-feu au trafic réseau.
Maintenant nftables
remplace iptables
(obsolète). Il est malgré tout possible de convertir les anciens fichiers de configuration iptable
en équivalentsnftables
via les utilitaires iptables-translate
et ip6tables-translate
.
firewalld
Le service firewalld
est un gestionnaire dynamique de pare-feu. Il classifie le trafic réseau en zones.
Une zone attribuée à un paquet dépend de critères (adresse IP source, interface réseau entrante, etc.) et chaque zone peut avoir sa propre liste de ports et services ouverts
fermés.
Le service firewalld
vérifie l’adresse source de chaque paquet entrant dans le système :
- Si l’adresse source est liée à une zone spécifique : les règles de cette zone s’appliquent
- Si l’adresse source n’est pas attribuée à une zone :
firewalld
associe le paquet à la zone de l’interface réseau entrante et les règles de cette zone s’appliquent. - Si l’interface réseau n’est associée à aucune zone :
firewalld
envoie le paquet à la zone par défaut
La zone par défaut est une désignation affectée à une zone existante : la zone public, correspond à l’interfaceloopback lo
associée à la zone trusted, qui
autorise tout le trafic par défaut.
Zones prédéfinies
Le service firewalld utilise des zones prédéfinies. Par défaut, toutes les zones autorisent tout trafic entrant et sortant s’il a été initié par le système.
Zone | Configuration par défaut |
---|---|
block | Rejette la totalité du trafic entrant sauf les connexions déjà initiées dans le système |
dmz | Seules les connections entrantes sélectionnées sont acceptés |
drop | Tous les paquets sont supprimés sans réponse Seul les connexions sortantes sont possibles |
external | Pour les réseaux externes avec le masquerading activé Pas de confiance aux autres machines Seules les connexions entrantes sélectionnées sont acceptées |
home | Pour les réseaux personnels Fait confiance aux autres machines du réseau Seules les connections entrantes sélectionnées sont acceptées |
internal | Pour les réseaux interne Fait confiance aux autres machines dans le réseaux non liés à la machine Seules les connections entrantes séléctionnées sont acceptées |
public | Pour les zones publiques Ne pas faire confiance aux autres machines Seules les connections entrantes séléctionnées sont acceptés |
trusted | Toutes les connections réseaux sont acceptées |
work | Pour les zones de travail Fait confiance aux autres machines dans les réseaux de la machine Seules les connexions entrantes sélectionnées sont acceptées |
Services prédéfinis
Le service firewalld inclut des configurations prédéfinies pour les services courants :
- ssh : Serveur SSH local (22/tcp)
- dhcpv6-client : Client DHCPv6 local (546/udp sur le réseau IPv6 fe80::/64)
- ipp-client : Impression IPP locale (631/udp)
- samba-client : Client de partage local de fichiers et d’imprimantes Windows (137/udp et 138/udp)
- mdns : Protocole de résolution de noms sur liaison locale appelée multidiffusion DNS (mDNS, Multicast DNS) (353/udp pour les adresses de multidiffusion 224.0.0.251 (IPv4) ou
ff02::fb (IPv6)) - cockpit : Interface Web Red Hat Enterprise Linux pour la gestion et la surveillance de votre système local et distant (port 9090)
Paquetage
Le paquetage firewalld
inclut de nombreuses configurations de service prédéfinies, la commande firewall-cmd --get-services
permet de les lister :
# firewall-cmd --get-services |
Configuration du daemon firewalld
La commande firewall-cmd
s’interface avec le daemon firewalld
.
La plupart des commandes fonctionnent avec la configuration runtime
.
Si l’option --permanent
est spécifiée il faut l’activer avec firewall-cmd --reload
.
De nombreuses commandes listées utilisent l’option –zone=ZONE pour identifier la zone sur laquelle elles portent. Lorsqu’un masque de réseau est requis, utilisez la notation
CIDR, telle que 192.168.1/24.
Commandes
Commandes de bases :
Commandes |
Explication |
---|---|
--get-default-zone |
Indique l’actuelle zone par défaut |
--set-default-zone=ZONE |
Définit la zone par défaut |
--get-zones |
Répertorie toutes les zones disponibles |
--get-active-zones |
Liste toutes les zones en cours d’utilisation ainsi que leurs informations |
--add-source=CIDR [--zone=ZONE] |
Achemine l’ensemble du trafic provenant de l’adresse IP ou du réseau/masque de réseau vers la zone spécifiée |
--remove-source=CIDR [--zone=ZONE] |
Supprime la règle qui achemine, à partir de la zone, l’ensemble du trafic provenant de l’adresse IP ou du réseau |
--add-interface=INTERFACE [--zone=ZONE] |
Achemine l’ensemble du trafic de INTERFACE vers ZONE |
--change-interface=INTERFACE [--zone=ZONE] |
Associe l’interface à la ZONE |
--list-all [--zone=ZONE] |
Liste l’ensemble des interfaces, sources, services et ports configurés pour la ZONE |
--list-all-zones |
Récupère toutes les informations de toutes les zones |
--add-service=SERVICE [--zone=ZONE] |
Autorise le trafic vers le SERVICE |
--add-port=PORT/PROTOCOL [--zone=ZONE] |
Autorise le trafic vers les ports PORT/ PROTOCOL |
--remove-service=SERVICE [--zone=ZONE] |
Supprime le SERVICE de la liste autorisée pour la zone |
--remove-port=PORT/PROTOCOL [--zone=ZONE] |
Supprime les ports PORT/PROTOCOL pour la zone |
--reload |
Applique la configuration permanente |
Si aucune option --zone=
n’est spécifiée = utilise la zone par défaut.
Exemples
Définir :
- la zone par défaut sur la
dmz
- ajouter l’ensemble du trafic provenant du réseau
192.168.11.0/24
à la zoneinternal
- ouvre les ports réseau pour le service
mysql
dans la zoneinternal
# firewall-cmd --set-default-zone=dmz |
Ajouter tout le trafic entrant de l’adresse IPv4 192.168.10.0 à la zone public
:
# firewall-cmd --permanent --zone=public --add-source=192.168.10.0/24 |
/!\ Résumé des commandes
Commandes :
# firewall-cmd |
Cas pratiques
Gestion de pare-feu serveur
Installation des paquets httpd
et mod_ssl
:
[root@ ~]# dnf install httpd mod_ssl |
Création du fichier /var/www/html/index.html
contenant “I am SERVER01” :
[root@SERVER01 ~]# echo ‘Hello ! We are Cats ! ! I am SERVER01 :3’ > /var/www/html/index.html |
Lancement et activation du service httpd
:
[root@SERVER01 ~]# systemctl enable –now httpd |
À partir de HOST42 la commande curl
doit échouer :
[aline@HOST42 ~]$ curl http://SERVER01.my.company.org |
[aline@HOST42 ~]$ curl -k https://SERVER01.my.company.org |
Vérification de l’activation du service firewalld
sur SERVER01 :
root@SERVER01 ~]# systemctl status firewalld |
Ajout du service https
à la zone de pare-feu public :
[root@SERVER01 ~]# firewall-cmd –set-default-zone public |
[root@SERVER01 ~]# firewall-cmd –get-default-zone |
Ajout du service https
à la configuration permanente de la zone de réseau public :
[root@SERVER01 ~]# firewall-cmd –permanent –add-service=https |
[root@SERVER01 ~]# firewall-cmd –reload |
[root@SERVER01 ~]# firewall-cmd –permanent –zone=public –list-all |
Vérification de l’accès au serveur Web http://SERVER01.my.company.org :
[aline@HOST42 ~]$ curl http://SERVER01.my.company.org |
Vérification de l’accès au serveur Web http://SERVER01.my.company.org via le port 443 :
[aline@HOST42 ~]$ curl -k https://SERVER01.my.company.org |
Contrôle de l’étiquetage de ports (non standards) SELinux
Résoudre un problème de contenu Web en redémarrant le service httpd
:
[root@SERVER01 ~]# systemctl restart httpd.service |
Job for httpd.service failed because the control process exited with error code. |
Affichage de l’état du service httpd
:
[root@SERVER01 ~]# systemctl status -l httpd.service |
● httpd.service - The Apache HTTP Server |
Vérification si SELinux empêcherait httpd
de se lier au port 82/TCP
:
[root@SERVER01 ~]# sealert -a /var/log/audit/audit.log |
100% done |
Chercher un type de port qui conviendrait pour le port 82/TCP
(Le type http_port_t
inclut les ports HTTP 80/TCP
et 443/TCP
) :
[root@SERVER01 ~]# semanage port -l | grep http |
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 |
Attribution du type http_port_t
au port 82/TCP
:
[root@SERVER01 ~]# semanage port -a -t http_port_t -p tcp 82 |
Redémarreage de httpd.service
:
[root@SERVER01 ~]# systemctl restart httpd.service |
Vérification de l’accès au serveur Web exécuté via le port 82/TCP :
[root@SERVER01 ~]# curl http://SERVER01.my.company.org:82 |
Cependant, cette erreur signifie qu’il n’est pas possible d’accéder au service Web à partir de HOST42 :
[aline@HOST42 ~]$ curl http://SERVER01.my.company.org:82 |
Ouverture du port 82/TCP
dans la configuration permanente de la zone par défaut du pare-feu, sur SERVER01 :
[root@SERVER01 ~]# firewall-cmd –permanent –add-port=82/tcp |
Application des modifications du pare-feu sur SERVER01 :
[root@SERVER01 ~]# firewall-cmd –reload |
Test d’accès au service Web à partir de HOST42 :
[aline@HOST42 ~]$ curl http://SERVER01.my.company.org:82 |
Gestion de la sécurité réseau - Configuration des paramètres de pare-feu et de SELinux sur un hôte ayant un serveur Web
Test d’accès à http://SERVER02.my.company.org et http://SERVER02.my.company.org:1001 :
[aline@HOST42 ~]$ curl http://SERVER02.my.company.org |
[aline@HOST42 ~]$ curl http://SERVER02.my.company.org:1001 |
Vérification si le service httpd
est actif :
[aline@SERVER02 ~]$ systemctl is-active httpd |
Activation et démarrage du service httpd
:
[aline@SERVER02 ~]$ sudo systemctl enable –now httpd |
Recherche de la raison pour laquelle le service httpd
n’a pas pu démarrer :
[aline@SERVER02 ~]$ systemctl status httpd.service |
Vérification si SELinux empêche le service httpd
de se lier au port 1001/TCP
:
[aline@SERVER02 ~]$ sudo sealert -a /var/log/audit/audit.log |
Configuration de SELinux pour autoriser le service httpd à écouter sur le port 1001/TCP
. Pour trouver dans un 1er temps le type de port correct :
[aline@SERVER02 ~]$ sudo semanage port -l | grep ‘http’ |
Liaison du port 1001/TCP
au type http_port_t
:
[aline@SERVER02 ~]$ sudo semanage port -a -t http_port_t -p tcp 1001 |
Vérification que le port 1001/TCP
est bien lié au type de port http_port_t
:
[aline@SERVER02 ~]$ sudo semanage port -l | grep ‘^http_port_t’ |
Activation et démarrage du service httpd
:
[aline@SERVER02 ~]$ sudo systemctl enable –now httpd |
Vérificat de httpd
:
[aline@SERVER02 ~]$ systemctl is-active httpd |
[aline@SERVER02 ~]$ systemctl is-enabled httpd |
Test de la configuration :
[aline@HOST42 ~]$ curl http://SERVER02.my.company.org |
[aline@HOST42 ~]$ curl http://SERVER02.my.company.org:1001 |
Vérification que la zone de pare-feu par défaut soit définie sur la zone public :
[aline@SERVER02 ~]$ firewall-cmd –get-default-zone |
Sinon, l’appliquer :
[aline@SERVER02 ~]$ sudo firewall-cmd –set-default-zone public |
Vérification des ports ouverts listés dans la zone de réseau public :
[aline@SERVER02 ~]$ sudo firewall-cmd –zone=public –list-all |
Ajout du port 1001/TCP
à la configuration permanente de la zone de réseau public :
[aline@SERVER02 ~]$ sudo firewall-cmd –permanent –zone=public –add-port=1001/tcp |
Reload de la configuration du pare-feu :
[aline@SERVER02 ~]$ sudo firewall-cmd –reload |
Vérification de la configuration :
[aline@SERVER02 ~]$ sudo firewall-cmd –zone=public –list-all |
Vérification de l’accès à http://SERVER02.my.company.org et à http://SERVER02.my.company.org:1001 :
[aline@HOST42 ~]$ curl http://SERVER02.my.company.org |
[aline@HOST42 ~]$ curl http://SERVER02.my.company.org:1001 |
Documentation
MAN firewall-cmd(1)
MAN firewalld(1)
MAN firewalld.zone(5)
MAN firewalld.zones(5)
MAN nft(8)
https://uubu.fr/?page=00001282