[Tuto] Configuration d’un firewall (pare-feu) sous Linux
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 :
1 |
iptables -L |
Pour ouvrir un port, on utilisera la commande :
1 |
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT |
-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é :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#Réinitialiser toutes les règles : iptables -t filter -F iptables -t filter -X #Tout bloquer : iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP #Autoriser localhost: iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT #Autoriser les connexions déjà établies : iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #Ouverture port HTTP 80 et HTTPS 443 pour serveur web : iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT #Autoriser ping : iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT #Ouverture port SSH 22 : iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #Ouverture port DNS 53: iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT # Mail SMTP : iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT # Mail POP3 : iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT # Mail IMAP : iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT # NTP (serveur de temps) : iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT #Ouverture port DHCP 68 : iptables -t filter -A OUTPUT -p udp --dport 68 -j ACCEPT iptables -t filter -A INPUT -p udp --dport 68 -j ACCEPT #Supprimer les règles "ACCEPT all" : iptables -t filter -D INPUT 1 iptables -t filter -D OUTPUT 1 |
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 :
1 |
ufw enable |
Pour afficher l’état actuel des règles :
1 |
ufw status verbose |
Pour activer la journalisation :
1 |
ufw logging on |
Pour autoriser le trafic sur un port (exemple 22) on utilise simplement :
1 |
ufw allow port 22 |
- 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) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#Tout bloquer : ufw default deny #Ouverture port 80 et 443 pour serveur web : ufw allow 80/tcp ufw allow 443/tcp #Ouverture port SSH : ufw allow 22/tcp #Ouverture port DNS : ufw allow 53 # Mail SMTP : ufw allow smtp # Mail POP3 : ufw allow pop3 # Mail IMAP : ufw allow imap # NTP (serveur de temps) : ufw allow ntp #Ouverture port DHCP : ufw allow 68 |
À noter que pour autoriser les ping il faut aller dans le fichier :
1 |
/etc/ufw/before.rules |
Et y ajouter ces lignes :
1 2 3 4 5 |
-A ufw-before-output -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-output -p icmp --icmp-type source-quench -j ACCEPT -A ufw-before-output -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-output -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-output -p icmp --icmp-type echo-request -j ACCEPT |
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 :
1 |
usr/lib/firewalld |
Les fichiers de configuration par l’admin se trouvent dans :
1 |
etc/firewalld/ |
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 :
1 |
firewall-config |
Pour afficher les règles actuelles sur la zone « public » :
1 |
firewall-cmd --zone=public --list-all |
Pour ouvrir par exemple le port 8080 (protocole tcp) de la zone ‘public’ :
1 |
firewall-cmd --zone=public --add-port=8080/tcp --permanent |
- –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 :
1 |
firewall-cmd --zone=internal --add-source=1.2.3.4/32 --permanent |
Pour actualiser le firewall on lance :
1 |
firewall-cmd --reload |
Voici un exemple de script FirewallD qui définit la zone en public, ferme tous les ports et en ouvre au cas par cas :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#Définir la zone par défaut à 'public' : firewall-cmd --set-default-zone=public #Ouverture port 80 et 443 pour serveur web : firewall-cmd --zone=public --add-service=http firewall-cmd --zone=public --add-service=https #Autoriser ping : firewall-cmd --zone=public --add-service=icmp #Ouverture port SSH : firewall-cmd --zone=public --add-service=ssh #Ouverture port DNS : firewall-cmd --zone=public --add-service=dns # Mail SMTP : firewall-cmd --zone=public --add-port=25/tcp --permanent # Mail POP3 : firewall-cmd --zone=public --add-port=110/tcp --permanent # Mail IMAP : firewall-cmd --zone=public --add-port=143/tcp --permanent # NTP (serveur de temps) : firewall-cmd --zone=public --add-port=123/tcp --permanent #Ouverture port DHCP : firewall-cmd --zone=public --add-port=68/udp --permanent #Actualiser firewalld firewall-cmd --reload |
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.
Bonjour,
Je me pose une question, pourquoi avoir mis « ouverture des flux web » et donc avoir mis le port 80 en DROP ?
Cdt
Bonjour,
Vous avez tout à fait raison il y avait une erreur dans l’article, les DROP avait été utilisés pour des tests mais la règle nécessaire ici est bien ACCEPT, j’ai corrigé cela, merci pour votre remarque,
Cordialement.