Le piratage de serveur et l'accès non autorisé sont de véritables menaces. Ces raisons expliquent pourquoi vous devez implémenter un pare-feu dans le cadre de votre stratégie globale de sécurité réseau. La configuration d'un pare-feu avec des règles iptables est un moyen d'atténuer ces risques sur les systèmes Linux.
Heureusement pour vous, ce didacticiel vous apprendra à implémenter un pare-feu avec une configuration de règles iptables de base que vous pourrez ensuite personnaliser en fonction de vos besoins. Prêt à vous salir les mains ? Il est temps de plonger !
Prérequis
Ce didacticiel contient des démonstrations pratiques. Si vous souhaitez suivre, assurez-vous que vous disposez d'un serveur Linux ou d'un ordinateur de bureau. Ce didacticiel utilise Ubuntu 14.04 pour les exemples, mais devrait fonctionner avec d'autres distributions Linux et des versions plus récentes d'Ubuntu.
Installation du service de pare-feu persistant Iptables
Comme son nom l'indique, le pare-feu persistant IPTables est un service qui enregistre vos ensembles de règles et applique automatiquement les règles IPTables au redémarrage du serveur. Mais d'abord, vous devrez installer le package de pare-feu persistant.
Pour installer le pare-feu persistant IPTables, procédez comme suit.
1. Ouvrez une session de terminal sur votre serveur soit localement soit via SSH.
2. Ensuite, exécutez la commande ci-dessous pour mettre à jour le cache source du package de votre serveur.
# Updating the package source cache
sudo apt update -y
3. Maintenant, exécutez la commande ci-dessous pour installer le pare-feu persistant IPTables.
# Installing the Persistent Firewall Package
sudo apt install iptables-persistent -y
4. Pour sauvegarderles règles IPv4 actuelles , sélectionnez Oui et appuyez sur Entrée à l'invite. Le programme d'installation enregistre les règles IPv4 dans le fichier /etc/iptables/rules.v4.
5. L'invite suivante vous demande de Enregistrer les règles IPv6 actuelles , sélectionnez Oui, et appuyez sur Entrée. Le programme d'installation enregistre les règles IPv6 dans le fichier /etc/iptables/rules.v6.
Enfin, confirmez que le netfilter-persistent.service
est actif et activé.
sudo systemctl status netfilter-persistent
Configuration des règles Iptables de base
Dans la configuration de base du pare-feu, vous construirez un cadre extensible sur lequel vous pourrez vous appuyer pour configurer votre pare-feu. Généralement, vous mettrez en place un "refuser tout-accepter tout ", ce qui signifie que toute demande entrante provenant de n'importe quelle adresse IP sera refusée, à l'exception de votre adresse IP et du port SSH 22 (pour l'accès administrateur).
Toutes les connexions en cours entre l'adresse IP de votre serveur et l'Internet plus large seront autorisées ; toutes les connexions entrantes seront abandonnées (sauf pour SSH). Ensuite, vous créerez des exceptions pour les services spécifiques et les types de trafic dont vous avez besoin, en apprenant progressivement plus tard dans ce didacticiel.
1. Ouvrez le fichier /etc/iptables/rules.v4 fichier dans un éditeur de texte. Cet exemple utilise nano
en tant qu'éditeur.
sudo nano /etc/iptables/rules.v4
Ensuite, supprimez tout le contenu de /etc/iptables/rules.v4 fichier et remplacez-le par les lignes suivantes. Reportez-vous aux commentaires en ligne pour comprendre ce que fait chaque ligne/section.
Remarque :La configuration du pare-feu ci-dessous est ce que vous pouvez qualifier de stricte et sert uniquement à créer une règle de pare-feu de base, que vous pourrez personnaliser ultérieurement.
*filter
# Setting up a "deny all-accept all" policy
# Allow all outgoing, but deny/drop all incoming and forwarding traffic
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
# Defining custom rules for UDP protocol.
:UDP - [0:0]
# Defining custom rules for TCP protocol.
:TCP - [0:0]
# Defining custom rules for ICMP protocol.
:ICMP - [0:0]
# Accept SSH UDP traffic
-A TCP -p udp --dport 22 -j ACCEPT
# Accept SSH TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
# Allowing packets based on the CONNTRACK connection states of ESTABLISHED and RELATED
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allowing packets through the loopback interface, which is used for local connections
-A INPUT -i lo -j ACCEPT
# Packets that do not match any rules in the protocol-specific should be dropped.
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Allowing new protocol-specific chains to process packets for UDP that have a NEW conntrack state.
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# Allowing new protocol-specific chains to process packets for TCP that have a NEW conntrack state.
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Allowing new protocol-specific chains to process packets for ICMP that have a NEW conntrack state.
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything at this point. And print out rejection message with its specific protocol.
# Issuing an ICMP "port unreachable" message to any new incoming UDP packets, rejecting them.
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# Issuing a "tcp-reset" message to any new incoming TCP packets, rejecting them.
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
# Issuing an "icmp-proto-unreachable" message to any new incoming TCP packets, dropping all other incoming packets.
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
# Allowing packets in the PREROUTING chain
:PREROUTING ACCEPT [0:0]
# Allows packets in the OUTPUT chain, which is used for locally generated packets
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
# NAT table is used to alter packets as they are routed through the system
*nat
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for NAT
:INPUT ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for NAT
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for NAT
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
*security
# Allowing packets in the INPUT chains for security
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for security
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for security
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
*mangle
# Allowing packets in the PREROUTING chains for mangle
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for mangle
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for mangle
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for mangle
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for mangle
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
3. Enregistrez le fichier. En nano
, appuyez sur CTRL+X, Y, Entrée.
4. Exécutez le iptables-restore
commande ci-dessous pour valider ou rechercher d'éventuelles erreurs de syntaxe. S'il n'y a pas d'erreurs, le pare-feu redémarrera avec les règles que vous avez définies dans le fichier. S'il y a des erreurs, la commande renverra une liste des erreurs et comment les corriger.
sudo iptables-restore -t /etc/iptables/rules.v4
5. Ensuite, modifiez le /etc/iptables/rules.v6 pour mettre en œuvre votre politique et votre infrastructure de pare-feu pour IPv6.
sudo nano /etc/iptables/rules.v6
6. Remplacez le fichier /etc/iptables/rules.v6 avec les lignes suivantes. Enregistrez et quittez /etc/iptables/rules.v6 en appuyant sur CTRL+X, Y, Entrée.
Les règles iptables ci-dessous supprimeront tout le trafic IPv6 et supposent qu'il n'y a pas d'application ou de service sur le serveur qui s'appuie sur ou utilise IPv6.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
7. Exécutez la commande ci-dessous pour rechercher et corriger les erreurs de syntaxe.
sudo ip6tables-restore -t /etc/iptables/rules.v6
8. Maintenant, rechargez le netfilter-persistent
service pour que les règles iptables prennent effet.
sudo service netfilter-persistent reload
9. Exécutez la commande ci-dessous pour enregistrer les nouvelles règles iptables.
sudo service netfilter-persistent save
10. Exécutez la commande ci-dessous pour répertorier toutes les règles pour IPv4 actuellement utilisées.
sudo iptables -S
10. Enfin, répertoriez les règles iptables pour IPv6.
sudo ip6tables -S
Modification de l'adresse IP du serveur DNS de votre serveur (conditionnel)
Le blocage de tout le trafic IPv6 peut entraîner des effets secondaires défavorables, en particulier si votre serveur s'appuie sur IPv6 pour la résolution de noms.
Dans cet exemple, la configuration réseau repose sur des serveurs de noms IPv6 (tels que 2001:4860:4860::8888 et 2001:4860:4860::8844). Étant donné que le pare-feu applique uniquement le trafic IPv4, le système ne peut pas rechercher les serveurs de noms pour IPv6.
Par exemple, certains de vos référentiels APT peuvent ne pas fonctionner si le pare-feu bloque tout le trafic IPv6. Si vous essayez de relancer le sudo apt update
commande, vous pourriez obtenir l'erreur suivante.
La solution consiste à mettre à jour votre fichier de configuration réseau, en préférant utiliser des serveurs de noms IPv4 (tels que 8.8.8.8 et 8.8.4.4).
1. Ouvrez le fichier /etc/network/interfaces fichier dans un éditeur de texte.
Les fichiers de configuration de l'interface network peuvent différer selon la distribution ou la version de Linux. L'exemple ci-dessous est spécifiquement pour Ubuntu 14.04 LTS.
sudo nano /etc/network/interfaces
2. Recherchez le dns-nameservers
directif. Remplacez cette directive par dns-nameservers 8.8.8.8 8.8.4.4
.
Les 8.8.8.8 et 8.8.4.4 sont des serveurs DNS publics gérés par Google. Ces serveurs DNS publics sont fiables et rapides. N'hésitez pas à utiliser d'autres serveurs DNS, tels que OpenDNS ou le DNS IPv4 interne de votre organisation.
3. Exécutez la commande ci-dessous pour faire défiler l'interface réseau de votre serveur et utiliser les nouveaux serveurs de noms.
sudo ifdown eth0 && sudo ifup eth0
4. Ensuite, ouvrez /etc/apt/apt.conf.d/99force-ipv4 dans un éditeur de texte. Cette configuration par défaut enregistre ce que APT
utilise pour les paramètres persistants.
sudo nano /etc/apt/apt.conf.d/99force-ipv4
5. Renseignez le 99force-ipv4 fichier avec la ligne suivante. Cette valeur forcera APT à utiliser IPv4 pour la résolution de noms. Enregistrez et quittez le 99force-ipv4 .
Acquire::ForceIPv4 "true";
6. Déconnectez-vous et reconnectez-vous à votre session SSH et relancez le sudo apt update
commande. Vous ne devriez plus voir les erreurs de résolution de noms.
Ajout d'exemptions pour des services spécifiques
Maintenant que vous disposez des règles iptables "autoriser tout-refuser tout" qui fonctionnent, vous pouvez maintenant ouvrir des ports spécifiques pour certains services selon vos besoins. Par exemple, si votre serveur héberge ou hébergera un site Web, vous devrez autoriser le trafic du port HTTP 80 ou du port HTTPS 443. Pour ce faire, procédez comme suit.
1. Sur le terminal, exécutez la commande suivante pour ouvrir le port TCP 80 pour le trafic HTTP et le port 443 pour le trafic HTTPS.
- Le
-A
le paramètre accepte la chaîne à laquelle ajouter la règle. - Le
-p
Le paramètre spécifie le type de protocole auquel la règle s'applique. - Le
--dport
la valeur du paramètre est le numéro de port de destination. - Le
-j
paramètre indique l'action à entreprendre lorsque la règle correspond.
sudo iptables -A TCP -p tcp --dport 80 -j ACCEPT
sudo iptables -A TCP -p tcp --dport 443 -j ACCEPT
2. Exécutez la commande ci-dessous pour vérifier que les nouvelles règles sont désormais effectives.
sudo iptables -L -v
Vous verrez vos deux entrées pour HTTP et HTTPS, respectivement.
3. Enfin, exécutez la commande ci-dessous pour enregistrer vos modifications dans les règles iptables.
sudo service netfilter-persistent save
Autoriser les connexions basées sur la source
Iptables vous permet également de créer des règles pour autoriser le trafic provenant de sources spécifiques, telles qu'une ou plusieurs adresses IP. Par exemple, votre entreprise peut avoir trois sites, chacun ayant sa propre adresse IP (par exemple, 192.168.1.20, 192.168.1.30 et 192.168.1.40).
Vous souhaitez probablement autoriser les connexions à votre serveur à partir de chaque site. Pour ce faire, vous allez créer trois règles distinctes avec le -s
pour spécifier la source spécifique.
1. Exécutez les commandes suivantes pour autoriser les connexions à partir de trois adresses IP spécifiques.
Les adresses IP ci-dessous ne sont données qu'à titre d'exemple et peuvent ne pas refléter un scénario réel. Les adresses IP de vos sites seront différentes.
# Allowing connection from 192.168.1.20
sudo iptables -A TCP -s 192.168.1.20 -j ACCEPT
# Allowing connection from 192.168.1.30
sudo iptables -A TCP -s 192.168.1.30 -j ACCEPT
# Allowing connection from 192.168.1.40
sudo iptables -A TCP -s 192.168.1.40 -j ACCEPT
2. Réexécutez la commande ci-dessous pour vérifier que les nouvelles règles que vous avez ajoutées.
sudo iptables -L -v
Vous verrez trois entrées pour vos trois sources spécifiques, leur permettant de se connecter à votre serveur.
3. Enfin, n'oubliez pas de sauvegarder vos règles iptables en exécutant la commande ci-dessous.
sudo service netfilter-persistent save
Réinitialiser les règles Iptables
Vous avez maintenant configuré avec succès un pare-feu avec les règles iptables. Mais tout ne se passe pas toujours comme prévu. Mais que se passe-t-il si vous vous trompez et que vous vouliez repartir à neuf ?
Une option consiste à réinitialiser toutes vos règles iptables. Pour ce faire, suivez les étapes ci-dessous.
1. Tout d'abord, faites une copie de sauvegarde de vos règles iptables existantes. La commande ci-dessous copie le rules.v4 et règles.v6 fichiers dans votre répertoire personnel.
sudo cp /etc/iptables/* ~/
2. Ensuite, videz toutes vos règles iptables existantes en exécutant la commande ci-dessous.
sudo service netfilter-persistent flush
3. Confirmez que les règles n'existent plus.
sudo iptables -S
Comme vous pouvez le voir ci-dessous, seules les règles iptables par défaut restent, autorisant tout. Ce comportement garantit que la réinitialisation des règles n'entraînera pas de scénario de verrouillage de l'accès administrateur.
Conclusion
Tout au long de ce didacticiel, vous avez appris à sécuriser votre pare-feu Linux avec des règles iptables et à configurer des exemptions.
Certains administrateurs Linux peuvent affirmer qu'iptables est obsolète pour configurer le pare-feu Linux. Mais de nombreuses applications reposent encore sur iptables, ce qui pourrait signifier qu'il restera un pilier pendant encore de nombreuses années.
Que pensez-vous de l'utilisation de règles iptables persistantes ? Envisagerez-vous de l'implémenter ou passerez-vous à de nouvelles options comme le pare-feu simple (UFW) ?