[Tuto] Configuration d’un firewall (pare-feu) sous Linux

[Tuto] Configuration d’un firewall (pare-feu) sous Linux

6 octobre 2017 2 Par Nabil Lemz

Comme nous l’avons vu dans un précédent article, le rôle d’un firewall est extrêmement important pour protéger son système linux, et son fonctionnement n’est pas des plus simples. Dans ce tutoriel nous allons donc voir comment configurer proprement son pare-feu, pour cela nous allons voir 3 des outils les plus couramment utilisés sur linux, qui sont « IPTABLES », « FIREWALLD » et « UFW ». Ces 3 outils sont en fait des interfaces différentes qui permettent de contrôler plus simplement Netfilter, qui est une architecture de filtrage de paquets pour les noyaux Linux, il va inspecter seulement les en-têtes des paquets, ce qui le rend très rapide et ne génère pas de latence. Toutes les configurations qui vont suivre doivent être réservés à un administrateur du système, par conséquent les commandes nécessitent d’être « root ».

Iptables

Iptables est un firewall en ligne de commande qui va directement créer ses règles grâce aux arguments que nous allons lui envoyer. Pour chaque paquet entrant, iptables va l’analyser et le comparer aux règles mises en place. Si le paquet correspond à une règle alors elle sera appliquée, sinon le paquet suivra la politique par défaut. Lorsque le paquet entre dans une table, il est comparé aux règles de cette table, dans l’ordre selon lequel les règles se présentent. C’est-à-dire que si un paquet est autorisé par une règle mais que ses critères correspondent à une règle située avant, alors le paquet suivra ce qui est indiqué par la règle la plus récente.

L’outil contient 5 tables mais celle par défaut est la FILTER, elle est classées en 3 chaînes, INPUT (trafic entrant), OUTPUT (trafic sortant) et FORWARD (trafic redirigé). Nous allons ici uniquement nous intéresser à la configuration de cette table par défaut qui est dans la plupart des cas, largement suffisant pour protéger son système.

Nous allons partir du principe qu’il faut tout bloquer puis ouvrir les ports au cas par cas.

Pour voir l’état actuel de la table FILTER, il faut utiliser la commande :

Pour ouvrir un port, on utilisera la commande :

-t filter : indique la table que l’on modifie

-A OUTPUT : indique la chaîne que l’on modifie (OUTPUT, INPUT ou FORWARD)

-p tcp : indique le protocole utilisé par le port (tcp ou udp)

–dport 22 : indique le numéro du port

-j ACCEPT : indique l’action à effectuer (ACCEPT, DROP, LOG, etc)

 

Ainsi j’ai préparé un exemple de script assez détaillé :

 

UFW

UFW est un firewall alternatif à iptables, en un peu plus simple, d’où son nom « Uncomplicated FireWall ». Il fonctionne lui aussi en ligne de commande, mais peut être complété par une interface graphique si l’on installe « Gufw ». Dans ce tutoriel nous allons seulement travailler en ligne de commande.

UFW n’est pas un outil qui est activé par défaut, pour l’utiliser il faut d’abord l’activer :

Pour afficher l’état actuel des règles :

Pour activer la journalisation :

Pour autoriser le trafic sur un port (exemple 22) on utilise simplement :

  • allow : pour autoriser ou refuser le trafic (ALLOW ou DENY)
  • port 22 : indique le numéro du port
  • vous pouvez rajouter /tcp ou /udp après le numéro de port pour ouvrir uniquement en tcp ou en udp
  • vous pouvez aussi remplacer le numéro de port par le nom du service exemple « smtp »
  • vous pouvez ajouter ‘in’ ou ‘out’ juste après le « allow » pour ouvrir seulement dans un sens

 

Voici un exemple de script pour configurer son firewall avec UFW (même principe que tout à l’heure, tout fermer puis ouvrir au cas par cas) :

À noter que pour autoriser les ping il faut aller dans le fichier :

Et y ajouter ces lignes :

 

FirewallD

FirewallD est lui aussi un pare-feu disponible en ligne de commande ou via une interface graphique. Il intègre  une notion de zone de réseaux,  ainsi à chaque zone de réseau est associée un ensemble de services réseaux. Une interface réseau peut être affectée à une zone de réseau. Une zone de réseau est définie par défaut pour les interfaces de réseaux non affectées explicitement à une zone de réseau. Il existe par défaut 9 zones :

  • Trusted : totalement fiable, tout le traffic entrant est accepté, usage pour un réseau local
  • Home : partiellement fiable,  l’admin définit les services ouverts, usage à la maison
  • Work : partiellement fiable, l’admin définit les services ouverts, usage par exemple lors de l’utilisation d’un pc personnel au travail
  • Internal : partiellement fiable, l’admin définit les services ouverts, même  chose que home
  • Dmz : pas de confiance, adressage IP statique
  • Public : non fiable, l’admin définit les services ouverts, usage dans des zones publics
  • External : non fiable, l’admin définit les services ouverts, zone prévue pour un accès dans une zone « externe » en utilisant le masquage d’adresse comme un VPN
  • Block : Aucune sollicitation n’est autorisée. Les tentatives sont rejetées avec un message de rejet, zone prévue pour bloquer complètement le trafic en cas d’accès potentiellement frauduleux
  • Rejet : Aucune sollicitation n’est autorisée. Les tentatives sont bloquées SANS même un message de rejet, zone prévue pour bloquer complètement le trafic en cas d’accès potentiellement frauduleux.

Les fichiers de configuration par défaut se trouvent dans :

Les fichiers de configuration par l’admin se trouvent dans :

Pour modifier un fichier du répertoire par défaut, il faut copier le fichier dans le répertoire adéquat de etc/firewalld et le modifier dans celui-ci, l’interface graphique permettra de modifier bien plus facilement le contenu de ces fichiers. Pour ouvrir l’interface graphique on fait :

Pour afficher les règles actuelles sur la zone « public » :

Pour ouvrir par exemple le port 8080 (protocole tcp) de la zone ‘public’ :

  • –zone : indique la zone à configurer
  • –add : indique si l’on veut ouvrir ou fermer un port (add ou remove)
  • -port : indique soit le port avec « –add-port=8080 », soit le service avec « –add-service=http »
  • –permanent : indique que cette règle restera même après le redémarrage du pare-feu

On peut aussi ouvrir un flux pour une adresse IP spécifique :

Pour actualiser le firewall on lance :

Voici un exemple de script FirewallD qui définit la zone en public, ferme tous les ports et en ouvre au cas par cas :

 

Tableau de comparaison : Iptables – FirewallD – UFW

 

IPTABLES

 

FIREWALLD

 

UFW

 

Démarrer les services

 

Déjà démarré

 

Déjà démarré

 

ufw enable

 

Voir les règles actuelles

 

iptables –L

 

firewall-cmd –zone=public –list-all

 

ufw status verbose

 

Supprimer toutes les règles

iptables -t filter -F

iptables -t filter -X

 

————-

 

————-

 

Bloquer tous les ports

iptables -t filter -P INPUT DROP

iptables -t filter -P FORWARD DROP

iptables -t filter -P OUTPUT DROP

 

Se mettre en zone public et ouvrir les ports voulus

firewall-cmd –set-default-zone=public

 

 

ufw default deny incoming

ufw default deny outgoing

 

Ouvrir un port

iptables -t filter -A OUTPUT -p tcp –dport 22 -j ACCEPT

iptables -t filter -A INPUT -p tcp –dport 22 -j ACCEPT

 

firewall-cmd –zone=public –add-port=22/tcp –permanent

 

ufw allow 25/tcp

 

Autoriser un service

 

Via son numéro de port

 

firewall-cmd –add-service=http

 

ufw allow http

 

Appliquer les modifications

 

Automatique

 

Automatique

 

ufw reload

 

Mode d’utilisation

 

Ligne de commande

 

Ligne de commande

Interface graphique (firewall-config)

 

Ligne de commande

 

Etat des règles au redémarrage

 

Il faut relancer le script à chaque redémarrage

 

Toutes les règles appliquées avec

« -permanent » restent

 

Configuration conservée

 

 

C’est la fin de ce tutoriel, si vous avez des questions n’hésitez pas à les poster directement en commentaires.