FirewallD est un système de pare-feu principalement utilisé sur les systèmes Fedora, Red Hat Enterprise Linux et CentOS. On le trouve également sur d’autres distributions comme OpenSUSE. C’est un frontal à iptables
qui comporte une série d’avantages par rapport à la gestion « classique » d’un pare-feu avec un script shell fait maison.
- FirewallD a un comportement dynamique, ce qui veut dire qu’un changement « à chaud » de la configuration n’entraîne pas nécessairement un rechargement intégral de l’ensemble des règles du pare-feu avec toutes les perturbations que cela entraîne.
- Il est plus confortable à manipuler qu’une litanie de règles
iptables
. - Les règles prédéfinies sont probablement plus saines que ce que l’on pourra concocter avec un script fait maison.
FirewallD est très bien documenté dans la littérature imprimée et un peu partout sur le web. Je ne vais donc pas réinventer la roue et vous concocter une documentation exhaustive qui servirait tout au plus à vous épuiser aussi bien que le sujet. Au lieu de cela, j’ai décidé de vous présenter FirewallD comme j’aime bien le faire, en plongeant les mains dans le cambouis, et en découvrant ses fonctionnalités avec « quelque chose qui marche ». Suivez le guide.
Installation et mise en service
Mon serveur de sauvegardes nestor.microlinux.lan
tourne sous CentOS 7 et dispose actuellement d’un pare-feu géré par un script iptables
. Avant toute chose, je vais désactiver ce pare-feu « fait maison ».
$ sudo systemctl stop iptables $ sudo yum remove iptables-services
J’installe le paquet firewalld
, qui est fourni par les dépôts officiels.
$ sudo yum install firewalld
J’active et je lance le service correspondant.
$ sudo systemctl enable firewalld --now
L’outil firewall-cmd
sert à communiquer avec le service firewalld
. Nous pouvons déjà l’utiliser pour afficher l’état du pare-feu.
$ sudo firewall-cmd --state running
La zone par défaut
La machine dispose d’une interface réseau enp2s0
reliée au réseau local.
$ nmcli con show NAME UUID TYPE DEVICE LAN d99a2cf4-8576-3e56-993b-b18073ad169d ethernet enp2s0
Cette interface est actuellement associée à la zone public
. Notez en passant que certaines options de firewall-cmd
peuvent très bien être utilisées sans les privilèges de l’administrateur root
.
$ firewall-cmd --get-active-zones public interfaces: enp2s0
Une « zone » est ici une collection de règles de pare-feu associées à un certain contexte. FirewallD fournit toute une série de zones prédéfinies.
$ firewall-cmd --get-zones block dmz drop external home internal public trusted work
Changer de zone comme de chemise
Pour me faire une première idée concrète de ces différentes zones, je vais tenter une petite expérience en passant à la volée de la zone public
à la zone drop
.
$ sudo firewall-cmd --zone=drop --change-interface=enp2s0 success
J’ouvre un deuxième terminal sur ma station de travail et j’essaie d’envoyer un ping
vers mon serveur. Je n’obtiens aucune réponse.
[kikinovak@alphamule:~] $ ping nestor PING nestor.microlinux.lan (192.168.2.250) 56(84) bytes of data.
Je reviens dans la session ouverte sur mon serveur, et je passe de la zone drop
à la zone block
.
$ sudo firewall-cmd --zone=block --change-interface=enp2s0 success
Je retente un ping
depuis ma station de travail. Cette fois-ci, j’ai un message qui me dit explicitement que je n’ai pas le droit d’accéder à la machine.
[kikinovak@alphamule:~] $ ping nestor PING nestor.microlinux.lan (192.168.2.250) 56(84) bytes of data. From nestor.microlinux.lan (192.168.2.250) icmp_seq=1 Destination Host Prohibited From nestor.microlinux.lan (192.168.2.250) icmp_seq=2 Destination Host Prohibited From nestor.microlinux.lan (192.168.2.250) icmp_seq=3 Destination Host Prohibited From nestor.microlinux.lan (192.168.2.250) icmp_seq=4 Destination Host Prohibited
À présent, je rebascule vers la zone public
initialement définie.
$ sudo firewall-cmd --zone=public --change-interface=enp2s0 success
Et je constate que le ping
fonctionne correctement.
[kikinovak@alphamule:~] $ ping nestor PING nestor.microlinux.lan (192.168.2.250) 56(84) bytes of data. 64 bytes from nestor.microlinux.lan (192.168.2.250): icmp_seq=1 ttl=64 time=0.388 ms 64 bytes from nestor.microlinux.lan (192.168.2.250): icmp_seq=2 ttl=64 time=0.394 ms 64 bytes from nestor.microlinux.lan (192.168.2.250): icmp_seq=3 ttl=64 time=0.388 ms 64 bytes from nestor.microlinux.lan (192.168.2.250): icmp_seq=4 ttl=64 time=0.412 ms
Je ne vais pas rentrer dans les détails de chacune de ces zones. C’est très bien documenté dans la littérature officielle.
Définir la zone appropriée
La zone internal
me semble appropriée pour mon serveur de sauvegardes. Comme son nom le suggère, l’option --permanent
assure la persistance de cette transition.
$ sudo firewall-cmd --permanent --zone=internal --change-interface=enp2s0 The interface is under control of NetworkManager, setting zone to 'internal'. success
L’association à la zone internal
est inscrite dans le fichier correspondant à la configuration de l’interface réseau, en l’occurrence ifcfg-LAN
.
$ grep -i zone /etc/sysconfig/network-scripts/ifcfg-LAN ZONE=internal
Je définis cette zone par défaut.
$ sudo firewall-cmd --set-default-zone=internal success
Afficher les services autorisés
J’affiche la configuration associée à la zone.
$ sudo firewall-cmd --list-all internal (active) target: default icmp-block-inversion: no interfaces: enp2s0 sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Je peux limiter cet affichage aux seuls services autorisés.
$ sudo firewall-cmd --list-services dhcpv6-client mdns samba-client ssh
Si l’on veut en savoir un peu plus sur la configuration des accès aux différents services, il suffit de jeter un oeil dans les fichiers XML rangés dans /usr/lib/firewalld/services
.
Supprimer quelques services prédéfinis
Sur cette machine, je peux sereinement me débarrasser de dhcpv6-client
, mdns
et samba-client
pour ne garder que le seul service ssh
. L’option --reload
prend en charge les modifications permanentes effectuées auparavant.
$ sudo firewall-cmd --permanent --remove-service=dhcpv6-client success $ sudo firewall-cmd --permanent --remove-service=mdns success $ sudo firewall-cmd --permanent --remove-service=samba-client success $ sudo firewall-cmd --reload success
Mon serveur de sauvegardes est désormais doté d’un pare-feu avec une configuration adaptée et cohérente.
La suite au prochain numéro, où nous examinerons FirewallD sur un routeur.
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
1 commentaire
bm · 20 avril 2020 à 16 h 53 min
Bonjour,
J’ai justement écrit un petit script il y a quelques jours pour ce type de besoin.
J’ai choisi d’utiliser ipset et d’ajouter une zone au par-feu dans l’idée de créer plus facilement des « pool » d’utilisateurs. Ipset est vraiment facile et rapide pour ajouter de nouvelles adresses / plages « à la volée » (comprendre : plus besoin de –reload).
Disponible ici : https://framagit.org/18informatique/use_ipsets/-/blob/master/18info_fw-cmd_ipset.sh
Cordialement
Les commentaires sont fermés.