introduction
Firewalld est une solution de gestion de pare-feu disponible pour de nombreuses distributions Linux. Elle constitue une interface pour le système de filtrage de paquets iptables fourni par le noyau Linux. Dans ce guide, nous expliquerons comment configurer un pare-feu pour votre serveur et vous montrerons les bases de la gestion du pare-feu avec l'outil d'administration defirewall-cmd
(si vous préférez utiliseriptables
avec CentOS, suivez this guide).
[.note] #Note: Il est possible que vous utilisiez une version plus récente de firewalld que celle disponible au moment de la rédaction de cet article, ou que votre serveur ait été configuré légèrement différemment de l'exemple de serveur utilisé tout au long ce guide. Ainsi, le comportement de certaines des commandes expliquées dans ce guide peut varier en fonction de votre configuration spécifique.
#
Concepts de base dans Firewalld
Avant de commencer à parler de la façon d'utiliser réellement l'utilitairefirewall-cmd
pour gérer la configuration de votre pare-feu, nous devons nous familiariser avec quelques concepts de base que l'outil introduit.
Zones
Le démonfirewalld
gère des groupes de règles à l'aide d'entités appelées «zones». Les zones sont essentiellement des ensembles de règles qui dictent le trafic à autoriser en fonction du niveau de confiance que vous avez dans les réseaux auxquels votre ordinateur est connecté. Une zone est affectée aux interfaces réseau pour déterminer le comportement que le pare-feu doit autoriser.
Ce type de flexibilité est une bonne méthode pour modifier les règles en fonction de votre environnement pour les ordinateurs susceptibles de passer fréquemment d’un réseau à l’autre (tels que les ordinateurs portables). Vous pouvez avoir mis en place des règles strictes interdisant la majorité du trafic lorsque vous travaillez sur un réseau WiFi public, tout en autorisant des restrictions plus souples lors de la connexion à votre réseau domestique. Pour un serveur, ces zones ne sont pas aussi importantes immédiatement car l'environnement réseau change rarement, voire jamais.
Quelle que soit la dynamique de votre environnement réseau, il est toujours utile de se familiariser avec l'idée générale derrière chacune des zones prédéfinies pourfirewalld
. Dans l'ordre deleast trusted àmost trusted, les zones prédéfinies à l'intérieur defirewalld
sont:
-
drop: le niveau de confiance le plus bas. Toutes les connexions entrantes sont abandonnées sans réponse et seules les connexions sortantes sont possibles.
-
block: similaire à ce qui précède, mais au lieu de simplement abandonner les connexions, les requêtes entrantes sont rejetées avec un message
icmp-host-prohibited
ouicmp6-adm-prohibited
. -
public: représente les réseaux publics non approuvés. Vous ne faites pas confiance aux autres ordinateurs, mais vous autorisez certaines connexions entrantes au cas par cas.
-
external: réseaux externes dans le cas où vous utilisez le pare-feu comme passerelle. Il est configuré pour le masquage NAT afin que votre réseau interne reste privé mais accessible.
-
internal: l'autre côté de la zone externe, utilisé pour la partie interne d'une passerelle. Les ordinateurs sont assez fiables et certains services supplémentaires sont disponibles.
-
dmz: Utilisé pour les ordinateurs situés dans une DMZ (ordinateurs isolés qui n'auront pas accès au reste de votre réseau). Seules certaines connexions entrantes sont autorisées.
-
work: utilisé pour les machines de travail. Faites confiance à la plupart des ordinateurs du réseau. Quelques services supplémentaires pourraient être autorisés.
-
home: un environnement domestique. Cela implique généralement que vous faites confiance à la plupart des autres ordinateurs et qu’un peu plus de services seront acceptés.
-
trusted: faites confiance à toutes les machines du réseau. La plus ouverte des options disponibles doit être utilisée avec parcimonie.
Pour utiliser le pare-feu, nous pouvons créer des règles et modifier les propriétés de nos zones, puis affecter nos interfaces réseau aux zones les plus appropriées.
Permanence de la règle
Dans firewalld, les règles peuvent être désignées comme permanentes ou immédiates. Si une règle est ajoutée ou modifiée, le comportement du pare-feu en cours d'exécution est modifié par défaut. Au prochain démarrage, les anciennes règles seront annulées.
La plupart des opérationsfirewall-cmd
peuvent utiliser l'indicateur--permanent
pour indiquer que le pare-feu non éphémère doit être ciblé. Cela affectera le jeu de règles rechargé au démarrage. Cette séparation signifie que vous pouvez tester les règles dans votre instance de pare-feu active, puis recharger en cas de problème. Vous pouvez également utiliser l'indicateur--permanent
pour créer un ensemble complet de règles au fil du temps qui seront toutes appliquées en même temps lorsque la commande de rechargement est émise.
Installer et activer votre pare-feu pour qu'il démarre au démarrage
firewalld
est installé par défaut sur certaines distributions Linux, y compris de nombreuses images de CentOS 7. Cependant, vous devrez peut-être installer vous-même firewall:
sudo yum install firewalld
Après avoir installéfirewalld
, vous pouvez activer le service et redémarrer votre serveur. N'oubliez pas que l'activation de firewalld entraînera le démarrage du service au démarrage. Il est recommandé de créer vos règles de pare-feu et de les tester avant de configurer ce comportement afin d'éviter des problèmes potentiels.
sudo systemctl enable firewalld
sudo reboot
Lorsque le serveur redémarre, votre pare-feu doit être activé, vos interfaces réseau doivent être placées dans les zones que vous avez configurées (ou revenir à la zone configurée par défaut), et toute règle associée à la ou aux zones sera appliquée aux zones associées. interfaces.
Nous pouvons vérifier que le service est en cours d'exécution et accessible en tapant:
sudo firewall-cmd --state
outputrunning
Cela indique que notre pare-feu est opérationnel avec la configuration par défaut.
Familiarisation avec les règles actuelles du pare-feu
Avant de commencer à apporter des modifications, nous devons nous familiariser avec l'environnement par défaut et les règles fournies par le démon.
Explorer les valeurs par défaut
Nous pouvons voir quelle zone est actuellement sélectionnée par défaut en tapant:
firewall-cmd --get-default-zone
outputpublic
Puisque nous n'avons donné àfirewalld
aucune commande pour s'écarter de la zone par défaut, et qu'aucune de nos interfaces n'est configurée pour se lier à une autre zone, cette zone sera également la seule zone «active» (la zone qui contrôle le trafic pour nos interfaces). Nous pouvons vérifier cela en tapant:
firewall-cmd --get-active-zones
outputpublic
interfaces: eth0 eth1
Ici, nous pouvons voir que notre exemple de serveur a deux interfaces réseau contrôlées par le pare-feu (eth0
eteth1
). Ils sont tous deux en cours de gestion selon les règles définies pour la zone publique.
Comment savons-nous quelles règles sont associées à la zone publique? Nous pouvons imprimer la configuration de la zone par défaut en tapant:
sudo firewall-cmd --list-all
outputpublic (default, active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Nous pouvons dire à partir de la sortie que cette zone est à la fois la zone par défaut et active et que les interfaceseth0
eteth1
sont associées à cette zone (nous savions déjà tout cela lors de nos précédentes enquêtes). Cependant, nous pouvons également constater que cette zone autorise les opérations normales associées à un client DHCP (pour l'attribution d'adresse IP) et à SSH (pour l'administration à distance).
Explorer des zones alternatives
Nous avons maintenant une bonne idée de la configuration de la zone par défaut et de la zone active. Nous pouvons également trouver des informations sur d'autres zones.
Pour obtenir une liste des zones disponibles, tapez:
firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
Nous pouvons voir la configuration spécifique associée à une zone en incluant le paramètre--zone=
dans notre commande--list-all
:
sudo firewall-cmd --zone=home --list-all
outputhome
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Vous pouvez générer toutes les définitions de zone à l'aide de l'option--list-all-zones
. Vous voudrez probablement diriger la sortie dans un pager pour une visualisation plus facile:
sudo firewall-cmd --list-all-zones | less
Sélection de zones pour vos interfaces
Sauf si vous avez configuré vos interfaces réseau autrement, chaque interface sera placée dans la zone par défaut lors du démarrage du pare-feu.
Changer la zone d'une interface
Vous pouvez effectuer la transition d'une interface entre des zones au cours d'une session en utilisant le paramètre--zone=
en combinaison avec le paramètre--change-interface=
. Comme pour toutes les commandes qui modifient le pare-feu, vous devrez utilisersudo
.
Par exemple, nous pouvons faire la transition de notre interfaceeth0
vers la zone «home» en tapant ceci:
sudo firewall-cmd --zone=home --change-interface=eth0
outputsuccess
Note
[.note] # Chaque fois que vous effectuez la transition d'une interface vers une nouvelle zone, sachez que vous modifiez probablement les services qui seront opérationnels. Par exemple, ici, nous passons à la zone «home», où SSH est disponible. Cela signifie que notre connexion ne doit pas chuter. Certaines autres zones n'ont pas SSH activé par défaut et si votre connexion est interrompue lors de l'utilisation de l'une de ces zones, vous risquez de ne pas pouvoir vous reconnecter.
#
Nous pouvons vérifier que cela a réussi en demandant à nouveau les zones actives:
firewall-cmd --get-active-zones
outputhome
interfaces: eth0
public
interfaces: eth1
Ajuster la zone par défaut
Si toutes les interfaces peuvent être gérées au mieux par une seule zone, il est probablement plus simple de sélectionner la meilleure zone par défaut, puis de l’utiliser pour votre configuration.
Vous pouvez modifier la zone par défaut avec le paramètre--set-default-zone=
. Ceci changera immédiatement toute interface qui était tombée sur la valeur par défaut vers la nouvelle zone:
sudo firewall-cmd --set-default-zone=home
outputsuccess
Définir des règles pour vos applications
La méthode de base pour définir les exceptions de pare-feu pour les services que vous souhaitez rendre disponibles est simple. Nous allons passer en revue l’idée de base ici.
Ajouter un service à vos zones
La méthode la plus simple consiste à ajouter les services ou les ports dont vous avez besoin aux zones que vous utilisez. Encore une fois, vous pouvez obtenir une liste des services disponibles avec l'option--get-services
:
firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
Note
[.Remarque]##
Vous pouvez obtenir plus de détails sur chacun de ces services en regardant leur fichier.xml
associé dans le répertoire/usr/lib/firewalld/services
. Par exemple, le service SSH est défini comme ceci:
/usr/lib/firewalld/services/ssh.xml
SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
+ You can enable a service for a zone using the `+--add-service=+` parameter. The operation will target the default zone or whatever zone is specified by the `+--zone=+` parameter. By default, this will only adjust the current firewall session. You can adjust the permanent firewall configuration by including the `+--permanent+` flag.
Par exemple, si nous exploitons un serveur Web servant du trafic HTTP conventionnel, nous pouvons autoriser ce trafic pour les interfaces de notre zone «publique» pour cette session en tapant:
sudo firewall-cmd --zone=public --add-service=http
Vous pouvez omettre les--zone=
si vous souhaitez modifier la zone par défaut. Nous pouvons vérifier que l'opération a réussi en utilisant les opérations--list-all
ou--list-services
:
sudo firewall-cmd --zone=public --list-services
outputdhcpv6-client http ssh
Une fois que vous avez vérifié que tout fonctionne comme il se doit, vous souhaiterez probablement modifier les règles de pare-feu permanentes afin que votre service soit toujours disponible après un redémarrage. Nous pouvons rendre notre changement de zone «publique» permanent en tapant:
sudo firewall-cmd --zone=public --permanent --add-service=http
outputsuccess
Vous pouvez vérifier que cela a réussi en ajoutant l'indicateur--permanent
à l'opération--list-services
. Vous devez utilisersudo
pour toutes les opérations--permanent
:
sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh
Votre zone «publique» autorisera désormais le trafic Web HTTP sur le port 80. Si votre serveur Web est configuré pour utiliser SSL / TLS, vous souhaiterez également ajouter le servicehttps
. Nous pouvons ajouter cela à la session en cours et au jeu de règles permanent en tapant:
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https
Que se passe-t-il si aucun service approprié n'est disponible?
Les services de pare-feu inclus dans l'installation de firewalld représentent la plupart des exigences les plus courantes pour les applications auxquelles vous pouvez autoriser l'accès. Cependant, il y aura probablement des scénarios où ces services ne répondent pas à vos besoins.
Dans cette situation, vous avez deux options.
Ouvrir un port pour vos zones
Le moyen le plus simple d’ajouter une prise en charge pour votre application spécifique consiste à ouvrir les ports qu’elle utilise dans la ou les zones appropriées. C’est aussi simple que de spécifier le port ou la plage de ports et le protocole associé aux ports à ouvrir.
Par exemple, si notre application fonctionne sur le port 5000 et utilise TCP, nous pourrions l'ajouter à la zone «publique» pour cette session en utilisant le paramètre--add-port=
. Les protocoles peuvent êtretcp
ouudp
:
sudo firewall-cmd --zone=public --add-port=5000/tcp
outputsuccess
Nous pouvons vérifier que cela a réussi en utilisant l'opération--list-ports
:
sudo firewall-cmd --zone=public --list-ports
output5000/tcp
Il est également possible de spécifier une plage séquentielle de ports en séparant les ports de début et de fin dans la plage par un tiret. Par exemple, si notre application utilise les ports UDP 4990 à 4999, vous pouvez les ouvrir sur «public» en tapant:
sudo firewall-cmd --zone=public --add-port=4990-4999/udp
Après les tests, nous souhaiterions probablement les ajouter au pare-feu permanent. Vous pouvez le faire en tapant:
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports
outputsuccess
success
5000/tcp 4990-4999/udp
Définir un service
Ouvrir des ports pour vos zones est facile, mais il peut être difficile de garder une trace de la fonction de chacune d’elles. Si vous retirez un service sur votre serveur, vous aurez peut-être du mal à vous rappeler quels ports ouverts sont toujours nécessaires. Pour éviter cette situation, il est possible de définir un service.
Les services sont simplement des collections de ports avec un nom et une description associés. L'utilisation des services est plus facile à administrer que les ports, mais nécessite un peu de travail préalable. La manière la plus simple de démarrer est de copier un script existant (trouvé dans/usr/lib/firewalld/services
) dans le répertoire/etc/firewalld/services
où le pare-feu recherche les définitions non standard.
Par exemple, nous pourrions copier la définition de service SSH à utiliser pour notre définition de service «exemple» comme celle-ci. Le nom de fichier moins le suffixe.xml
dictera le nom du service dans la liste des services de pare-feu:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Maintenant, vous pouvez ajuster la définition trouvée dans le fichier que vous avez copié:
sudo vi /etc/firewalld/services/example.xml
Pour commencer, le fichier contiendra la définition SSH que vous avez copiée:
/etc/firewalld/services/example.xml
SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
La majorité de cette définition sont en fait des métadonnées. Vous voudrez changer le nom court du service dans les balises<short>
. Ceci est un nom lisible par l’homme pour votre service. Vous devez également ajouter une description afin de disposer de davantage d'informations si vous devez auditer le service. La seule configuration à effectuer qui affecte réellement la fonctionnalité du service sera probablement la définition du port où vous identifiez le numéro de port et le protocole que vous souhaitez ouvrir. Cela peut être spécifié plusieurs fois.
Pour notre service «exemple», imaginez que nous devions ouvrir le port 7777 pour TCP et 8888 pour UDP. En entrant en mode INSERT en appuyant suri
, nous pouvons modifier la définition existante avec quelque chose comme ceci:
/etc/firewalld/services/example.xml
Example Service
This is just an example service. It probably shouldn't be used on a real system.
Appuyez surESC
, puis entrez:x
pour enregistrer et fermer le fichier.
Rechargez votre pare-feu pour accéder à votre nouveau service:
sudo firewall-cmd --reload
Vous pouvez voir qu'il fait maintenant partie de la liste des services disponibles:
firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
Vous pouvez maintenant utiliser ce service dans vos zones comme vous le feriez normalement.
Créer vos propres zones
Bien que les zones prédéfinies soient probablement plus que suffisantes pour la plupart des utilisateurs, il peut être utile de définir vos propres zones plus descriptives de leur fonction.
Par exemple, vous souhaiterez peut-être créer une zone pour votre serveur Web, appelée "publicweb". Toutefois, vous souhaiterez peut-être configurer une autre zone pour le service DNS que vous fournissez sur votre réseau privé. Vous voudrez peut-être une zone appelée «privateDNS» pour cela.
Lors de l'ajout d'une zone, vous devez l'ajouter à la configuration du pare-feu permanent. Vous pouvez ensuite recharger pour amener la configuration dans votre session en cours. Par exemple, nous pourrions créer les deux zones discutées ci-dessus en tapant:
sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS
Vous pouvez vérifier leur présence dans votre configuration permanente en tapant:
sudo firewall-cmd --permanent --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
Comme indiqué précédemment, ceux-ci ne seront pas encore disponibles dans l'instance actuelle du pare-feu:
firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
Rechargez le pare-feu pour amener ces nouvelles zones dans la configuration active:
sudo firewall-cmd --reload
firewall-cmd --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
Vous pouvez maintenant commencer à attribuer les services et les ports appropriés à vos zones. Il est généralement judicieux d’ajuster l’instance active, puis de transférer ces modifications dans la configuration permanente après le test. Par exemple, pour la zone «publicweb», vous pouvez ajouter les services SSH, HTTP et HTTPS:
sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
sudo firewall-cmd --zone=publicweb --list-all
outputpublicweb
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
De même, nous pouvons ajouter le service DNS à notre zone «privateDNS»:
sudo firewall-cmd --zone=privateDNS --add-service=dns
sudo firewall-cmd --zone=privateDNS --list-all
outputprivateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Nous pourrions ensuite changer nos interfaces vers ces nouvelles zones pour les tester:
sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1
À ce stade, vous avez la possibilité de tester votre configuration. Si ces valeurs fonctionnent pour vous, vous voudrez ajouter les mêmes règles à la configuration permanente. Vous pouvez le faire en réappliquant les règles avec l'indicateur--permanent
:
sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns
Après avoir appliqué de manière permanente ces règles, vous pouvez redémarrer votre réseau et recharger votre service de pare-feu:
sudo systemctl restart network
sudo systemctl reload firewalld
Validez que les bonnes zones ont été attribuées:
firewall-cmd --get-active-zones
outputprivateDNS
interfaces: eth1
publicweb
interfaces: eth0
Et validez que les services appropriés sont disponibles pour les deux zones:
sudo firewall-cmd --zone=publicweb --list-services
outputhttp https ssh
sudo firewall-cmd --zone=privateDNS --list-services
outputdns
Vous avez créé avec succès vos propres zones! Si vous souhaitez faire de l'une de ces zones la valeur par défaut pour d'autres interfaces, n'oubliez pas de configurer ce comportement avec le paramètre--set-default-zone=
:
sudo firewall-cmd --set-default-zone=publicweb
Conclusion
Vous devriez maintenant avoir une assez bonne compréhension de la façon d’administrer le service firewalld sur votre système CentOS pour une utilisation quotidienne.
Le service firewalld vous permet de configurer des règles et des ensembles de règles maintenables qui prennent en compte votre environnement réseau. Il vous permet de passer de manière transparente entre différentes stratégies de pare-feu grâce à l'utilisation de zones et donne aux administrateurs la possibilité de résumer la gestion des ports dans des définitions de service plus conviviales. Acquérir une connaissance pratique de ce système vous permettra de tirer parti de la flexibilité et de la puissance offertes par cet outil.