Recherche de site Web

Présentation de firewalld et de la commande firewall-cmd sous Linux


Objectif

Apprenez les concepts de base de firewalld et comment interagir avec celui-ci à l’aide de l’utilitaire firewall-cmd

Exigences

  • Autorisations root

Difficulté

FACILE

Conventions

  • # – nécessite que les commandes Linux données soient exécutées avec les privilèges root, soit
    directement en tant qu’utilisateur root, soit en utilisant la commande sudo
  • $ – nécessite que des commandes Linux données soient exécutées en tant qu’utilisateur régulier non privilégié

Introduction

Un pare-feu basé sur des zones

Firewalld est un pare-feu zonal : chaque zone peut être configurée pour accepter ou refuser certains services ou ports, et donc avec un niveau de sécurité différent. Les zones peuvent être associées à une ou plusieurs interfaces réseau. Habituellement, firewalld est livré avec un ensemble de zones préconfigurées : pour lister ces zones, et plus généralement pour interagir avec le pare-feu, nous allons utiliser l’utilitaire firewall-cmd. Je tourne sur un système Fedora 27, vérifions quelles sont les zones disponibles :

firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work

Comme vous pouvez le voir, la commande ci-dessus renvoie une liste de toutes les interfaces disponibles dans mon système. Leur nom est assez révélateur de leur objectif, mais nous devons savoir quels services et ports sont disponibles par leur intermédiaire : la règle générale par défaut est que chaque service ou port est refusé. Chaque interface est ensuite configurée avec quelques exceptions, en fonction des services qui doivent être autorisés. Si nous voulons avoir une liste de tous les services associés à une zone, nous pouvons exécuter firewall-cmd avec l’option --get-services. Si une zone n’est pas explicitement passée à la commande, la zone par défaut sera interrogée :

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens5f5
  sources:
  services: ssh mdns dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

La commande renvoyait un résumé de l’état de la zone (dans ce cas, l’état par défaut, « public »). Entre autres choses, vous pouvez voir clairement quelles interfaces réseau sont associées à cette zone (ens5f5 dans ce cas) et quels services y sont autorisés (ssh, mdns, dhcpv6-client). Si nous voulons récupérer des informations sur une zone spécifique, qui n’est pas par défaut, nous devons passer le nom de la zone en argument à l’option --zone. Par exemple, pour récupérer des informations sur la zone externe, nous exécuterions :

firewall-cmd --zone=external --list-all
external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Manipulation de zones

Comme dit précédemment, lors de l’utilisation de l’outil firewall-cmd, si aucune zone n’est spécifiée, la zone par défaut est référencée. Nous pouvons vouloir changer la zone par défaut. Supposons par exemple que nous voulions définir la zone externe par défaut :

firewall-cmd --set-default=external

C’est très facile, n’est-ce pas ? Voyons maintenant comment nous pouvons ajouter ou supprimer des services ou des ports à une zone spécifique. Tout d’abord, les services sont un ensemble préconfiguré de ports associés à un protocole spécifique. Par exemple : le service ssh inclura le port TCP 22, tandis que le service samba comprendra l’ensemble des ports 139 et 445 TCP et 137 et 138 UDP. En utilisant les services, nous pouvons éviter d’avoir à nous souvenir de ports spécifiques à chaque fois. Supposons que nous voulions ajouter le service samba à la zone externe, tout ce que nous ferions serait de :

firwall-cmd --zone=external --add-service=samba
success

Le démon firewalld a répondu avec succès, ce qui signifie que l’exécution a réussi. Pour le vérifier, vérifions les services de zone :

sudo firewall-cmd --zone=external --list-services
ssh samba

Comme vous pouvez le voir, nous avons utilisé l’option --list-services à cet effet. Le résultat de la commande signifie clairement que le service samba a été ajouté à la zone. Cependant, les modifications apportées de cette manière sont temporaires et ne survivront pas à un redémarrage du démon firewalld. Vérifions-le. Tout d’abord, nous rechargeons le service :

 # firewall-cmd --reload

Ensuite, nous vérifions à nouveau les services autorisés dans la zone externe :

firewall-cmd --zone=external --list-services
ssh

Comme vous pouvez le voir, le seul service autorisé dans la zone externe est ssh. Pour apporter une modification persistante à une zone, nous devons utiliser l’option --permanent :

 # firewall-cmd --permanent --zone=external --add-service=samba

Les modifications permanentes devront être rechargées par le pare-feu pour être efficaces.

Si nous voulons faire l’opération inverse, et ainsi supprimer un service d’une zone, nous exécuterions :

 # firewall-cmd --permanent --zone=external --remove-service=samba

La syntaxe est très intuitive et n’a pas besoin d’être expliquée davantage. Mais que se passe-t-il si nous voulons ajouter un port spécifique à la place d’un service ? La syntaxe changerait légèrement :

 # firewall-cmd --permanent --zone=external --add-port=139/tcp

Pour vérifier que le port a été ajouté à la zone :

firewall-cmd --zone=external --list-ports
139/tcp

L’opération a été couronnée de succès. De la même manière, pour supprimer un port, nous ferions :

firewall-cmd --permanent --zone=external --remove-port=139/tcp

Création d’une zone personnalisée

Jusqu’à présent, nous ne voyions que comment modifier des zones existantes. Il est également possible d’en créer de nouveaux, et c’est tout aussi facile. Supposons que nous voulions créer une zone personnalisée appelée linuxconfig :

firewall-cmd --permanent --new-zone=linuxconfig

Une nouvelle zone vide a été créée : par défaut, aucun service ou port n’y est autorisé. Il est également possible de créer une zone en chargeant un fichier de configuration :

firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig

Où file est le chemin d’accès au fichier contenant la définition de zone. Notez que lors de la création ou de la suppression d’une zone, l’option --permanent est obligatoire : une erreur sera générée si elle n’est pas fournie.

Associer une zone à une interface

La création d’une zone n’est que la première étape : il faut maintenant l’associer à une interface réseau. Supposons que nous voulions utiliser notre nouvelle zone créée, en l’associant à l’interface ethernet ens5f5 : voici la commande qui nous a permis d’accomplir la tâche :

firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5

Si nous interrogeons la zone pour les interfaces qui lui sont attribuées, nous devrions voir :

firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5

Supprimer l’interface de la zone est aussi simple que :

firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig

Des règles riches

Dans certaines situations, nous pouvons avoir besoin de créer une règle plus complexe, et de ne pas nous contenter d’autoriser certains ports ou services dans une zone. Par exemple, nous pouvons vouloir créer une règle pour bloquer un certain type de trafic provenant d’une machine spécifique. C’est à cela que servent les règles riches. Une règle se compose essentiellement de deux parties : dans la première, nous spécifions les conditions qui doivent être remplies pour que la règle soit appliquée, et dans la seconde, l’action à exécuter : accepter, abandonner ou rejeter.

Disons que nous voulons bloquer le trafic de la machine avec l’ip 192.168.0.37 dans le réseau local : voici comment nous composerions notre règle :

firewall-cmd --zone=linuxconfig --add-rich-rule="rule \
    family="ipv4" \
    source address=192.168.0.37 \
    service name=ssh \
    reject \

Pour ajouter une règle enrichie, nous avons utilisé l’option --add-rich-rule, en décrivant la règle comme son argument. La règle commence par le mot-clé de la règle. Avec family, nous avons spécifié que la règle s’applique uniquement aux paquets ipv4 : si ce mot-clé n’est pas fourni, la règle est appliquée à la fois à ipv4 et à ipv6. Nous avons ensuite fourni l’adresse source que les paquets doivent avoir pour que la règle soit déclenchée avec l’adresse source. Avec service, nous avons spécifié le type de service pour la règle, dans ce cas ssh. Enfin, nous avons fourni l’action à exécuter si un paquet correspond à la règle, dans ce cas reject. Si nous essayons maintenant d’établir une connexion ssh à partir de la machine avec l’adresse IP 192.168.0.37, nous obtenons :

ssh 192.168.0.35
ssh: connect to host 192.168.0.35 port 22: Connection refused

Celle ci-dessus est très simple, mais une règle peut devenir très complexe. Vous devez consulter la documentation de firewalld pour voir toute la gamme de paramètres et d’options disponibles.

Le mode panique

Le mode panique est un mode qui ne doit être utilisé que dans des situations où il y a des problèmes vraiment graves avec l’environnement réseau. Lorsque ce mode est actif, toutes les connexions existantes sont ignorées et tous les paquets entrants et sortants sont supprimés. Il peut être activé en exécutant :

firewall-cmd --panic-on

Pour sortir du mode panique, la commande est la suivante :

firewall-cmd --panic-off

Il est même possible d’interroger l’état du mode panique, en exécutant :

firewall-cmd --query-panic

Ces options ne sont valides qu’au moment de l’exécution et ne peuvent pas être utilisées avec --permanent.

Articles connexes: