Pare-feuVoici le deuxième article dans la série sur le système de pare-feu FirewallD. Dans notre précédent article, nous avons configuré FirewallD sur un serveur simple dans le réseau local. Aujourd’hui nous allons nous intéresser de plus près à la configuration de FirewallD sur une machine qui relie deux réseaux entre eux.

État des lieux

Dans le réseau de mon entreprise, la machine proxy.microlinux.lan est un routerboard PC Engines muni d’une installation de CentOS 7. Elle dispose actuellement d’un pare-feu géré par un script iptables.

Avant de supprimer ce pare-feu « fait maison », j’affiche les règles en vigueur et je prends note des différents services autorisés. Voici le minimum syndical pour que mon réseau fonctionne correctement.

  • SSH
  • DHCP
  • DNS
  • NTP

Le script iptables gère également le relais des paquets (IP Masquerading) pour que les machines du réseau local puissent se connecter à Internet.

Installation et mise en service

Je désactive le pare-feu « fait maison ».

$ sudo systemctl stop iptables
$ sudo yum remove iptables-services

J’installe le paquet firewalld.

$ sudo yum install firewalld

J’active et je lance le service correspondant.

$ sudo systemctl enable firewalld --now

J’affiche l’état du pare-feu.

$ sudo firewall-cmd --state 
running

Interfaces réseau et zone par défaut

Le routeur dispose d’une interface réseau enp1s0 relié à la Freebox et d’une autre interface enp2s0 reliée au switch côté réseau local.

$ nmcli con show 
NAME  UUID                                  TYPE      DEVICE 
WAN   b22b118d-6152-3295-a095-1154a6f056cb  ethernet  enp1s0 
LAN   c9489004-f823-42df-8d23-5c4ad1294220  ethernet  enp2s0

Dans la configuration par défaut, les deux interfaces sont associées à la zone public.

$ firewall-cmd --get-active-zones 
public 
  interfaces: enp1s0 enp2s0

Définir les zones appropriées

Dans notre précédent article, nous avons eu l’occasion d’aborder les « zones » de FirewallD, qui représentent une collection de règles de pare-feu adaptées à un certain contexte. Les deux zones external et internal sont spécialement adaptées à l’utilisation sur un routeur.

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

J’associe la zone external à l’interface enp1s0.

$ sudo firewall-cmd --permanent --zone=external --change-interface=enp1s0
The interface is under control of NetworkManager, setting zone to 'external'.
success

Quant à l’interface enp2s0, elle va opérer la transition vers la zone internal.

$ sudo firewall-cmd --permanent --zone=internal --change-interface=enp2s0 
The interface is under control of NetworkManager, setting zone to 'internal'.
success

Voici mes deux zones internal et external avec les interfaces réseau respectives qui leur sont associées.

$ sudo firewall-cmd --get-active-zones 
internal 
  interfaces: enp2s0 
external
  interfaces: enp1s0

Cette information est inscrite dans la configuration réseau des interfaces respectives.

$ grep -i zone /etc/sysconfig/network-scripts/ifcfg-LAN 
ZONE=internal 
$ grep -i zone /etc/sysconfig/network-scripts/ifcfg-WAN 
ZONE=external

Je définis la zone internal comme zone par défaut.

$ sudo firewall-cmd --set-default-zone=internal
success

Afficher les services autorisés

J’affiche la configuration de la zone internal. Étant donné que je viens de la définir comme zone par défaut, je n’ai pas besoin de préciser --zone=internal dans la commande.

$ 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:

Supprimer quelques services prédéfinis

Je peux sereinement me débarrasser de dhcpv6-client, mdns et samba-client pour ne garder que le seul service ssh.

$ 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

Afficher les services disponibles

J’affiche la liste complète des services disponibles et je repère ceux qui m’intéressent.

$ firewall-cmd --get-services 
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula
bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph
ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns
docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client
etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust
ftp ganglia-client ganglia-master git gre high-availability http https imap
imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos
kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls
lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd
mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn
ovirt-imageio ovirt-storageconsole ...

Autoriser les services nécessaires

J’autorise les services dns, dhcp et ntp pour la zone internal. Là encore, ce n’est pas la peine de préciser la zone explicitement, étant donné qu’il s’agit de la zone par défaut.

$ sudo firewall-cmd --permanent --add-service=dns 
success 
$ sudo firewall-cmd --permanent --add-service=dhcp 
success 
$ sudo firewall-cmd --permanent --add-service=ntp 
success 
$ sudo firewall-cmd --reload 
success

J’affiche le résultat de l’opération.

$ sudo firewall-cmd --list-services dhcp dns ntp ssh

Le relais des paquets

À partir de là, mon routeur est parfaitement fonctionnel, et je n’ai rien de plus à faire. En effet, la configuration par défaut de la zone external gère d’emblée le relais des paquets, sans qu’il y ait quoi que ce soit à configurer à la main.

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

Un peu de ménage

Pour finir, je peux faire un peu de ménage. Le répertoire /etc/sysctl.d contient encore un fichier enable-ip-forwarding.conf qui active explicitement le relais des paquets dans le noyau.

# /etc/sysctl.d/enable-ip-forwarding.conf
net.ipv4.ip_forward = 1

Nous pouvons sereinement envoyer ce fichier au paradis des octets, étant donné que FirewallD gère désormais tout ce qui relève du relais des paquets.

$ sudo rm /etc/sysctl.d/enable-ip-forwarding.conf

En conclusion pour aujourd’hui, nous pouvons dire que la transition vers FirewallD sur un routeur apporte une amélioration réelle en termes de facilité et de confort d’utilisation.

Notre prochain article traitera de l’utilisation de FirewallD sur un serveur dédié.


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.