Introduction
Firewalld fournit un pare-feu géré dynamiquement avec prise en charge des zones réseaux qui définissent le niveau de confiance des connexions ou des interfaces réseau. Il prend en charge les paramètres de pare-feu IPv4 et IPv6, les ponts ethernet et les ensembles d'IP. Il existe une séparation entre les options d'exécution et de configuration permanente. Il fournit également une interface pour les services ou les applications permettant d'ajouter directement des règles de pare-feu.
Avantages de Firewalld
Les modifications peuvent être effectuées immédiatement dans l'environnement d'exécution. Aucun redémarrage du service ou du démon n'est nécessaire.
Grâce à l'interface D-Bus de Firewalld, il est facile pour les services, les applications et les utilisateurs d'adapter les paramètres du pare-feu. L'interface est complète et est utilisée pour les outils de configuration du pare-feu : firewall-cmd, firewall-config et firewall-applet.
La séparation du runtime et de la configuration permanente permet de faire des évaluations et des tests en runtime. La configuration du runtime n'est valable que jusqu'au prochain rechargement et redémarrage du service ou jusqu'à un redémarrage du système. Ensuite, la configuration permanente sera à nouveau chargée.
Avec l'environnement d'exécution, il est possible d'utiliser le temps d'exécution pour des paramètres qui ne devraient être actifs que pendant une période limitée. Si la configuration du runtime a été utilisée pour l'évaluation, et qu'elle est complète et fonctionnelle, il est alors possible de sauvegarder cette configuration dans l'environnement permanent.
Caractéristiques
- Complete D-Bus API
- IPv4, IPv6, bridge and ipset support
- IPv4 and IPv6 NAT support
- Firewall zones
- Predefined list of zones, services and icmptypes
- Simple service, port, protocol, source port, masquerading, port forwarding, icmp filter, rich rule, interface and source address handlig in zones
- Simple service definition with ports, protocols, source ports, modules (netfilter helpers) and destination address handling
- Rich Language for more flexible and complex rules in zones
- Timed firewall rules in zones
- Simple log of denied packets
- Direct interface
- Lockdown: Whitelisting of applications that may modify the firewall
- Automatic loading of Linux kernel modules
- Integration with Puppet
- Command line clints for online and offline configuration
- Graphical configuration tool using gtk3
- Applet using Qt4
Concepts
Firewalld a une conception à deux couches : La couche centrale et la couche D-Bus au-dessus.
- La couche centrale est responsable de la gestion de la configuration et des éléments arrière comme iptables, ip6tables, ebtables, ipset et le chargeur de modules.
- L'interface D-Bus de Firewalld est le principal moyen de modifier et de créer la configuration du pare-feu. L'interface est utilisée par tous les outils en ligne fournis par firewalld, comme par exemple firewall-cmd, firewall-config et firewall-applet. firewall-offline-cmd ne parle pas à firewalld, mais modifie et crée les fichiers de configuration de firewalld directement en utilisant le noyau de ce dernier avec les gestionnaires d'E/S. firewall-offline-cmd peut être utilisé lorsque firewalld est en cours d'exécution, mais il n'est pas recommandé car il ne peut modifier la configuration permanente qui est visible dans le firewall qu'après environ cinq secondes.
Zone
Une zone de pare-feu définit le niveau de confiance pour une connexion, une interface ou une liaison d'adresse source. Il s'agit d'une relation de un à plusieurs, ce qui signifie qu'une connexion, une interface ou une source ne peut faire partie que d'une seule zone, mais qu'une zone peut être utilisée pour de nombreuses connexions réseau, interfaces et sources.
Pour les ordinateurs susceptibles de passer fréquemment d'un réseau à l'autre (comme les ordinateurs portables), ce type de flexibilité constitue une bonne méthode pour modifier vos règles en fonction de votre environnement. Vous pouvez avoir mis en place des règles strictes interdisant la plupart du trafic lorsque vous opérez sur un réseau WiFi public, tout en autorisant des restrictions plus souples lorsque vous êtes connecté à votre réseau domestique. Pour un serveur, ces zones ne sont souvent pas aussi importantes 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 qui se cache derrière chacune des zones prédéfinies pour firewalld. Les zones prédéfinies au sein de firewalld sont, dans l'ordre, de la moins fiable à la plus fiable :
- drop : Tous les paquets réseau entrants sont abandonnés, il n'y a pas de réponse. Seules les connexions réseau sortantes sont possibles.
- block : Toute connexion réseau entrante est rejetée avec un message icmp-host-prohibited pour IPv4 et icmp6-adm-prohibited pour IPv6. Seules les connexions réseau initiées au sein de ce système sont possibles.
- public : Pour une utilisation dans les lieux publics. Vous ne faites pas confiance aux autres ordinateurs du réseaux pour ne pas endommager votre ordinateur. Seules les connexions entrantes sélectionnées sont acceptées.
- external : Pour une utilisation sur des réseaux externes avec masquage activé, en particulier pour les routeurs. Vous ne faites pas confiance aux autres ordinateurs des réseaux pour ne pas endommager votre ordinateur. Seules les connexions entrantes sélectionnées sont acceptées.
- interne : Pour une utilisation sur les réseaux internes. Vous faites surtout confiance aux autres ordinateurs des réseaux pour ne pas nuire à votre ordinateur. Seules les connexions entrantes sélectionnées sont acceptées.
- dmz : Pour les ordinateurs situés dans votre zone démilitarisée qui sont accessibles au public avec un accès limité à votre réseau interne. Seules les connexions entrantes sélectionnées sont acceptées.
- work : Pour une utilisation dans les zones de travail. Vous faites surtout confiance aux autres ordinateurs du réseaux pour ne pas nuire à votre ordinateur. Seules les connexions entrantes sélectionnées sont acceptées.
- home : Pour une utilisation à domicile. Vous faites surtout confiance aux autres ordinateurs des réseaux pour ne pas endommager votre ordinateur. Seules les connexions entrantes sélectionnées sont acceptées.
- trusted : Toutes les connexions réseau sont acceptées.
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.
Runtime versus Permanent
La configuration est séparée en deux parties : Runtime (l'environnement d'exécution) et Permanent (la configuration permanente).
Runtime Configuration
La configuration d'exécution est la configuration effective réelle et appliquée au pare-feu dans le noyau. Au démarrage du service firewalld, la configuration permanente devient la configuration d'exécution. Les modifications de la configuration d'exécution ne sont pas automatiquement enregistrées dans la configuration permanente.
La configuration d'exécution sera perdue lors de l'arrêt du service firewalld. Un rechargement du service firewalld remplacera la configuration d'exécution par la configuration permanente. Les liaisons de zones modifiées seront restaurées après le rechargement.
Permanent Configuration
La configuration permanente est stockée dans des fichiers de configuration et sera chargée et deviendra une nouvelle configuration d'exécution à chaque démarrage de la machine ou rechargement/redémarrage du service.
Runtime to Permanent
L'environnement d'exécution peut également être utilisé pour créer une configuration de pare-feu adaptée aux besoins. Lorsqu'il est complet et fonctionnel, il peut être migré avec le runtime vers une migration permanente. Il est disponible sous forme de firewall-config et firewall-cmd.
Le commande est :
firewall-cmd --runtime-to-permanent
Si la configuration du pare-feu ne fonctionne pas, un simple rechargement ou redémarrage du pare-feu permet d'appliquer à nouveau la configuration permanente qui fonctionne.
Installation et activation de firewalld
Firewalld est installé par défaut sur certaines distributions Linux. Cependant, il peut vous être nécessaire d'installer firewalld vous-même :
sudo yum install firewalld
Après avoir installé firewalld, vous pouvez activer le service et redémarrer votre serveur. Gardez à l'esprit que l'activation de firewalld entraînera le lancement du service au démarrage. Il est préférable de créer vos règles de pare-feu et de profiter de l'occasion pour les tester avant de configurer ce comportement afin d'éviter les problèmes potentiels.
sudo systemctl enable firewalld sudo systemctl start firewalld
Lorsque le serveur redémarre, votre pare-feu devrait s'afficher, vos interfaces réseau devraient être placées dans les zones que vous avez configurées (ou retomber dans la zone par défaut configurée), et toutes les règles associées à la ou aux zones seront appliquées aux interfaces associées.
Nous pouvons vérifier que le service fonctionne et est accessible en tapant :
[root@m1 ~]# firewall-cmd --state running
Cela indique que notre pare-feu est opérationnel avec la configuration par défaut.
Configuration
Le fichier firewalld.conf dans “/etc/firewalld” fournit la configuration de base pour firewalld. S'il est absent ou si “/etc/firewalld” est absent, les valeurs par défaut internes de firewalld seront utilisées.
Les paramètres énumérés ci-dessous sont les valeurs par défaut.
Default Zone
La zone par défaut utilisée si une chaîne de zone vide est utilisée. Tout ce qui n'est pas explicitement lié à une autre zone sera géré par la zone par défaut.
DefaultZone=public
Minimal Mark
Marks up to this minimum are free for use for example in the direct interface. If more free marks are needed, increase the minimum.
MinimalMark=100
Clean Up On Exit
S'il est défini sur no ou false, la configuration du pare-feu ne sera pas nettoyée à la sortie ou à l'arrêt du pare-feu.
CleanupOnExit=yes
Lockdown
Si elle est définie à “yes”, les modifications du pare-feu avec l'interface D-Bus seront limitées aux applications qui sont énumérées dans la liste blanche de verrouillage.
Le fichier de la liste blanche de verrouillage est lockdown-whitelist.xml.
Lockdown=no
IPv6_rpfilter
Effectue un test de filtre de chemin inverse sur un paquet pour IPv6. Si une réponse au paquet était envoyée via la même interface que celle sur laquelle le paquet est arrivé, le paquet correspondra et sera accepté, sinon abandonné.
Le paramètre rp_filter pour IPv4 est contrôlé à l'aide de sysctl.
IPv6_rpfilter=yes
Individual Calls
N'utilisez pas d'appels combinés, mais des appels individuels. Cela augmente le temps nécessaire pour appliquer les modifications et lancer le démon. Plus intéressant pour le débogage.
IndividualCalls=no
Log Denied
Ajouter des règles d'enregistrement juste avant les règles de rejet et d'abandon dans les chaînes INPUT, FORWARD et OUTPUT pour les règles par défaut et aussi les règles finales de rejet et d'abandon dans les zones.
Les valeurs possibles sont : all, unicast, broadcast, multicast et off.
LogDenied=off
Utilitaires
firewall-cmd
Firewall-cmd est le principal outil en ligne de commande pour firewalld. Il peut être utilisé pour obtenir des informations sur l'état de firewalld, pour obtenir la configuration du pare-feu pour le temps d'exécution et l'environnement permanent et également pour modifier ces derniers.
Selon la politique choisie, vous devez être authentifié pour pouvoir accéder ou modifier la configuration du firewalld. polkit est utilisé à cet effet. Il n'est utilisable que si firewalld est en cours d'exécution.
Cet outil est également utilisé par les services pour avoir un chemin de migration simple à partir de l'utilisation des appels iptables.
Pour obtenir la version Firewalld :
$ firewall-cmd --version
0.4.3.3
Pour obtenir de l'aide :
$ firewall-cmd --help
Pour obtenir l'état de firewalld :
$ firewall-cmd --state
running
Pour obtenir les zones actives avec les interfaces associées :
$ firewall-cmd --get-active-zones
public
interfaces: em1
Pour obtenir la zone de l'interface “em1” :
$ firewall-cmd --get-zone-of-interface=em1
public
firewall-offline-cmd
Il s'agit de l'outil en ligne de commande permettant de configurer firewalld s'il n'est pas en cours d'exécution ou s'il est actif, par exemple lors de l'installation du système.
Vous devez être root pour utiliser le firewall-offline-cmd.
Firewall-offline-cmd est uniquement capable de fournir des informations sur l'environnement permanent et aussi de le modifier. Il utilise le noyau de firewalld avec les gestionnaires d'E/S de fichiers. firewalld-offline-cmd peut être utilisé lorsque firewalld est en cours d'exécution, mais il n'est pas recommandé. Les modifications effectuées avec firewall-offline-cmd sont visibles dans le pare-feu après environ cinq secondes.
Pour obtenir la version firewalld :
# firewall-offline-cmd --version
0.4.3.3
Pour obtenir de l'aide sur firewalld :
# firewall-offline-cmd --help
Pour obtenir les zones actives avec l'interfaces “em1” :
# firewall-offline-cmd --get-zone-of-interface=em1
no zone
ICMP Type
Note:
Path : /etc/firewalld/icmptypes
Le protocole ICMP (Internet Control Message Protocol) est utilisé pour échanger des informations et aussi des messages d'erreur dans le protocole Internet (IP).
Les types ICMP peuvent être utilisés dans firewalld pour limiter l'échange de ces messages.
Afficher la liste des types d'ICMP :
# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
Ajouter l'interdiction d'utiliser des types ICMP.
# firewall-cmd --add-icmp-block=echo-request
success
Supprimer l'interdiction d'utiliser des types ICMP.
# firewall-cmd --remove-icmp-block=echo-request
success
IPSet
Note:
Path : /etc/firewalld/ipsets/
IPSet peut être utilisé pour regrouper plusieurs adresses IP ou MAC. IPSet est utilisable pour les adresses IPv4 ou IPv6. Il est défini par le paramètre de famille d'IPSet. Il peut être soit inet (par défaut), soit inet6.
Avec l'utilisation d'IPSet, le nombre de règles pour la liste noire ou blanche par exemple est réduit à quelques règles seulement pour une longue liste.
# firewall-cmd --get-ipset-types hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
Administration
Lockdown
Les applications s'exécutant sur votre système avec un accès root peuvent parfois modifier la configuration du pare-feu. Pour empêcher les applications de faire cela, vous pouvez activer le verrouillage en utilisant l'option --lockdown-on.
Vérification de l'état de Lockdown
Vous pouvez vérifier si le verrouillage est activé ou non en utilisant l'option --query-lockdown comme indiqué ci-dessous.
# firewall-cmd --query-lockdown
no
Activation de Lockdown
Vous pouvez activer le verrouillage en utilisant l'option --lockdown-on
# firewall-cmd --lockdown-on
success
Désactivation de Lockdown
Pour désactiver le verrouillage, vous pouvez utiliser l'option --lockdown-off.
# firewall-cmd --lockdown-off
success
Explorer les valeurs par défaut
Nous pouvons voir quelle zone est actuellement sélectionnée comme étant la zone par défaut en tapant :
# firewall-cmd --get-default-zone
public
Comme nous n'avons donné à firewalld aucune commande pour dévier 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 de nos interfaces). Nous pouvons vérifier cela en tapant :
# firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
Ici, nous pouvons voir que notre serveur possède deux interfaces réseau contrôlées par le pare-feu (eth0 et eth1). Elles sont toutes deux gérées actuellement en fonction des règles définies pour la zone public.
Mais comment savoir quelles sont les règles associées à la zone public ? Nous pouvons afficher la configuration de la zone par défaut en tapant :
# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: cockpit dhcpv6-client ssh 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 par défaut et active, et que les interfaces eth0 et eth1 sont associées à cette zone (nous savions déjà tout cela lors de nos précédentes demandes). Cependant, nous pouvons également voir que cette zone permet le trafic d'un client DHCP (pour l'attribution d'adresses IP), SSH (pour l'administration à distance), et Cockpit (une console basée sur le web).
Explorer les zones alternatives
Nous pouvons également trouver des informations sur d'autres zones.
Pour obtenir une liste des zones disponibles, tapez :
# firewall-cmd --get-zones
block 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 :
# firewall-cmd --zone=home --list-all home target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Vous pouvez produire toutes les définitions de zones en utilisant l'option --list-all-zones. Vous allez probablement acheminer la sortie dans un pager pour qu'elle soit plus facile à consulter :
# firewall-cmd --list-all-zones | less
Changer la zone d'une interface
Vous pouvez déplacer une interface entre les zones pendant 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.
Par exemple, nous pouvons déplacer notre interface eth0 vers la zone home en tapant ceci :
# firewall-cmd --zone=home --change-interface=eth0
success
Note:
Chaque fois que vous déplacez une interface vers une nouvelle zone, sachez que vous modifiez probablement les services qui seront opérationnels. Par exemple, ici nous nous déplaçons vers la zone home, qui dispose de SSH. Cela signifie que notre connexion ne doit pas être interrompue. Certaines autres zones n'ont pas SSH activé par défaut, et le passage à l'une de ces zones pourrait entraîner la perte de votre connexion, vous empêchant de vous reconnecter à votre serveur.
Nous pouvons vérifier que cela a réussi en demandant à nouveau les zones actives :
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
Ajuster la zone par défaut
Si toutes vos interfaces peuvent être bien gérées par une seule zone, il est probablement plus facile de désigner la meilleure zone comme zone par défaut et de l'utiliser ensuite pour votre configuration.
Vous pouvez modifier la zone par défaut avec le paramètre --set-default-zone= Cela changera immédiatement toute interface utilisant la zone par défaut :
# firewall-cmd --set-default-zone=home
success
Définir des règles pour vos applications
Passons en revue la méthode de base pour définir les exceptions de pare-feu pour les services que vous souhaitez rendre disponibles.
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. Vous pouvez obtenir une liste des définitions de service disponibles avec l'option --get-services :
# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Note:
Vous pouvez obtenir plus de détails sur chacun de ces services en consultant le fichier .xml qui leur est associé dans le répertoire /usr/lib/firewalld/services. Par exemple, le service SSH est défini comme ceci :
# cat /usr/lib/firewalld/services/ssh.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>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.</description> <port protocol="tcp" port="22"/> </service>
Vous pouvez activer un service pour une zone en utilisant le paramètre --add-service=. L'opération ciblera la zone par défaut ou toute zone est spécifiée par le paramètre --zone=. Par défaut, cela n'ajustera que la session de pare-feu actuelle. Vous pouvez ajuster la configuration du pare-feu permanent en incluant le drapeau --permanent.
Par exemple, si nous exploitons un serveur web desservant un trafic HTTP classique, nous pouvons temporairement autoriser ce trafic pour les interfaces dans notre zone public en tapant :
# firewall-cmd --zone=public --add-service=http
Vous pouvez omettre le drapeau --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 :
# firewall-cmd --zone=public --list-services cockpit dhcpv6-client http ssh
Une fois que vous avez vérifié que tout fonctionne comme il devrait, vous allez probablement vouloir modifier les règles de pare-feu permanent de sorte que votre service soit toujours disponible après un redémarrage. Nous pouvons rendre notre changement précédent permanent en le répétant et en ajoutant le drapeau --permanent :
# firewall-cmd --zone=public --add-service=http --permanent
success
Vous pouvez également utiliser le drapeau --runtime-to-permanent pour enregistrer la configuration du pare-feu en cours d'exécution dans la configuration permanente :
# firewall-cmd --runtime-to-permanent
Faites attention à cela, car toutes les modifications apportées au pare-feu en cours d'exécution seront appliquées de manière permanente.
Quelle que soit la méthode que vous avez choisie, vous pouvez vérifier qu'elle a réussi en ajoutant le drapeau --permanent à l'opération --list-services. Vous devez utiliser sudo pour toute opération --permanent :
# firewall-cmd --zone=public --list-services --permanent cockpit dhcpv6-client http ssh
Votre zone public autorisera désormais le trafic web HTTP sur le port 80. Si votre serveur web est configuré pour utiliser SSL/TLS, vous voudrez également ajouter le service https. Nous pouvons ajouter cela à la session en cours et au jeu de règles permanent en tapant :
# firewall-cmd --zone=public --add-service=https # firewall-cmd --zone=public --add-service=https --permanent
Ouvrir un port pour vos zones
La façon la plus simple d'ajouter un support à votre application spécifique consiste à ouvrir les ports qu'elle utilise dans la ou les zone(s) appropriée(s). Cela se fait en spécifiant le port ou la plage de ports, et le protocole associé (TCP ou UDP) pour les ports.
Par exemple, si notre application fonctionne sur le port 5000 et utilise TCP, nous pourrions temporairement ajouter cela à la zone public en utilisant le paramètre --add-port=. Les protocoles peuvent être désignés sous forme de tcp ou udp :
# firewall-cmd --zone=public --add-port=5000/tcp
success
Nous pouvons vérifier que cela a réussi en utilisant l'opération --list-ports :
# firewall-cmd --zone=public --list-ports 5000/tcp
Il est également possible de spécifier une plage séquentielle de ports en séparant le port de début et de fin de la plage avec un tiret. Par exemple, si notre application utilise UDP ports 4990 à 4999, nous pourrions les ouvrir sur public en tapant :
# firewall-cmd --zone=public --add-port=4990-4999/udp
Après avoir testé, nous voudrions probablement les ajouter au pare-feu permanent. Utilisez firewall-cmd –runtime-to-permanent pour faire cela ou réexécutez les commandes avec le drapeau --permanent :
# firewall-cmd --zone=public --permanent --add-port=5000/tcp # firewall-cmd --zone=public --permanent --add-port=4990-4999/udp # firewall-cmd --zone=public --permanent --list-ports success success 5000/tcp 4990-4999/udp
Définir un service
Les services qui sont inclus dans l'installation firewalld représentent un grand nombre des applications les plus courantes auxquelles vous pouvez souhaiter autoriser l'accès. Cependant, il y aura probablement un scénarios où ces services ne correspondent pas à vos exigences.
L'ouverture de ports pour vos zones est une solution simple, mais il peut être difficile de savoir à quoi chacun d'entre eux sert. Si jamais vous désactivez un service sur votre serveur, vous aurez peut-être du mal à vous souvenir des ports qui ont été ouverts et qui sont encore nécessaires. Pour éviter cette situation, il est possible de définir un nouveau service.
Les services sont des collections de ports avec un nom et une description associés. L'utilisation de services est plus facile à administrer que les ports, mais nécessite un bon travail en amont. La façon la plus simple de commencer consiste à copier un script existant (trouvé dans /usr/lib/firewalld/services) dans le répertoire /etc/firewalld/services où le pare-feu recherche des définitions non standard.
Par exemple, nous pourrions copier la définition du service SSH pour l'utiliser dans notre exemple de définition de service :
# 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é. Ouvrez-le d'abord dans votre éditeur de texte.
# nano /etc/firewalld/services/example.xml
Pour commencer, le fichier contiendra la définition SSH que vous avez copiée :
# /etc/firewalld/services/example.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>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.</description> <port protocol="tcp" port="22"/> </service>
La majorité de cette définition est en fait des métadonnées. Vous aurez besoin de changer le nom abrégé du service dans les balises <short>. Il s'agit d'un nom lisible par un humain pour votre service. Vous devez également ajouter une description afin de disposer de plus d'informations si jamais vous avez besoin de vérifier le service. La seule configuration que vous devez effectuer et 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. Plusieurs balises <port/> peuvent être spécifiées.
Pour notre exemple de service, imaginez que nous devons ouvrir le port 7777 pour TCP et 8888 pour UDP. Nous pouvons modifier la définition existante avec quelque chose de ce type :
# nano /etc/firewalld/services/example.xml <?xml version="1.0" encoding="utf-8"?> <service> <short>Example Service</short> <description>This is just an example service. It probably shouldn't be used on a real system.</description> <port protocol="tcp" port="7777"/> <port protocol="udp" port="8888"/> </service>
Enregistrez et fermez le fichier.
Rechargez votre pare-feu pour accéder à votre nouveau service :
# firewall-cmd --reload
Vous pouvez voir qu'il se trouve maintenant parmi la liste des services disponibles :
# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server example finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Vous pouvez maintenant utiliser ce service dans vos zones comme vous le feriez normalement.
Création de vos zones
Bien que les zones prédéfinies seront probablement plus que suffisantes pour la plupart des utilisateurs, il peut être utile de définir vos propres zones qui décrivent mieux leur fonction.
Par exemple, vous pouvez créer une zone pour votre serveur web, appelé publicweb. Cependant, vous pouvez avoir une autre zone configurée pour le service DNS que vous fournissez sur votre réseau privé. Vous pouvez vouloir une zone appelée privateDNS.
Lorsque vous ajoutez une zone, vous devez l'ajouter à la configuration du pare-feu permanent. Vous pouvez ensuite recharger pour intégrer la configuration dans votre session en cours. Par exemple, nous pourrions créer les deux zones dont nous avons parlé ci-dessus en tapant :
# firewall-cmd --permanent --new-zone=publicweb # firewall-cmd --permanent --new-zone=privateDNS
Vous pouvez vérifier qu'elles sont présentes dans votre configuration permanente en tapant :
# firewall-cmd --permanent --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work
Comme indiqué précédemment, ils ne seront pas encore disponibles dans le pare-feu en exécution :
# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Rechargez le pare-feu pour amener ces nouvelles zones dans la configuration d'exécution active :
# firewall-cmd --reload # firewall-cmd --get-zones block dmz drop external home internal privateDNS public publicweb trusted work
Maintenant, vous pouvez affecter les services et les ports appropriés à vos zones. Il est généralement bon de régler le pare-feu en cours d'exécution et d'enregistrer ces modifications dans la configuration permanente après l'avoir testé. Par exemple, pour la zone publicweb , vous pouvez vouloir ajouter les services SSH, HTTP et HTTPS :
# firewall-cmd --zone=publicweb --add-service=ssh # firewall-cmd --zone=publicweb --add-service=http # firewall-cmd --zone=publicweb --add-service=https # firewall-cmd --zone=publicweb --list-all publicweb target: default icmp-block-inversion: no interfaces: sources: services: http https ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
De même, nous pouvons ajouter le service DNS à notre zone privateDNS :
# firewall-cmd --zone=privateDNS --add-service=dns # firewall-cmd --zone=privateDNS --list-all privateDNS target: default icmp-block-inversion: no interfaces: sources: services: dns ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Nous pourrions alors changer nos interfaces pour ces nouvelles zones afin de les tester :
# firewall-cmd --zone=publicweb --change-interface=eth0 # firewall-cmd --zone=privateDNS --change-interface=eth1
À ce stade, vous avez la possibilité de tester votre configuration. Si ces valeurs vous conviennent, vous allez vouloir ajouter ces règles à la configuration permanente. Vous pourriez le faire en exécutant à nouveau toutes les commandes avec le drapeau --permanent annexé, mais dans ce cas, nous utiliserons le drapeau --runtime-to-permanent pour sauvegarder de façon permanente l'ensemble de notre configuration d'exécution :
# firewall-cmd --runtime-to-permanent
Après avoir appliqué ces règles de manière permanente, rechargez le pare-feu pour vérifier que les changements demeurent :
# firewall-cmd --reload
Valider que les zones correctes ont été attribuées :
# firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0
Valider le fait que les services appropriés sont disponibles pour les deux zones :
# firewall-cmd --zone=publicweb --list-services http https ssh # firewall-cmd --zone=privateDNS --list-services dns
Vous avez configuré vos propres zones avec succès ! Si vous voulez faire de l'une de ces zones la zone par défaut pour d'autres interfaces, n'oubliez pas de configurer ce comportement avec le paramètre --set-default-zone= :
# firewall-cmd --set-default-zone=publicweb
Gestion des logs
Nous pouvons définir les options LogDenied dans le fichier '/etc/firewalld/firewalld.conf'.
Une autre option consiste à utiliser la commande firewall-cmd. Une fois activée, votre machine Linux enregistrera tous les paquets rejetés ou abandonnés par FirewallD.
Il existe plusieurs méthodes pour activer la journalisation de firewalld.
Avec firewalld.conf
Configurer la journalisation des paquets refusés Editez le fichier '/etc/firewalld/firewalld.conf', entrez :
$ sudo vi /etc/firewalld/firewalld.conf
Rechercher le paramètre :
LogDenied=off
Remplacer 'Off' par 'all' :
LogDenied=all
On recharge la configuration de firewalld
$ sudo systemctl reload firewalld.service
Avec firewalld.cmd
Nous allons utiliser la commande firewall-cmd comme suit.
Trouvez et listez les paramètres actuels de LogDenie
$ sudo firewall-cmd --get-log-denied
Modifiez les paramètres actuels de LogDenie
$ sudo firewall-cmd --set-log-denied=all
Vérifiez-les :
$ sudo firewall-cmd --get-log-denied
Visualisation des logs
Nous pouvons utiliser la commande journalctl
$ journalctl -x -e
Nous pouvons aussi utiliser la combinaison de dmesg et grep comme suit
$ dmesg $ dmesg | grep -i REJECT
Enregistrement des flux bloqués
Nous pouvons aussi pour des raisons de traçabilité, vouloir logger les flux bloqués sur firewalld.
Pour cela, nous allons créer un fichier sur rsyslog
$ sudo nano /etc/rsyslog.de/firewalld-drop.conf
Ajouter la configuration qui suit
:msg,contains,"_DROP" /var/log/firewalld-drop.log :msg,contains,"_REJECT" /var/log/firewalld-drop.log & stop
Maintenant, il ne nous reste plus qu'à relancer le service rsyslog
$ sudo systemctl restart rsyslog
Un nouveau fichier 'firewalld-drop.log' devrait apparait dans '/var/log'
$ tail -f /var/log/firewalld-drop.log