Comment configurer le pare-feu Linux pour Docker Swarm sur CentOS 7
Introduction
Docker Swarm est une fonctionnalité de Docker qui facilite l'exécution d'hôtes et de conteneurs Docker à grande échelle. Un Docker Swarm, ou cluster Docker, est composé d'un ou plusieurs hôtes Dockerisés qui fonctionnent comme des nœuds manager et un nombre quelconque de nœuds worker. La mise en place d'un tel système nécessite une manipulation minutieuse du pare-feu Linux.
Les ports réseau nécessaires au bon fonctionnement d'un Docker Swarm sont :
- Port TCP
2376
pour une communication client Docker sécurisée. Ce port est requis pour que Docker Machine fonctionne. Docker Machine est utilisé pour orchestrer les hôtes Docker. - Port TCP
2377
. Ce port est utilisé pour la communication entre les nœuds d'un Docker Swarm ou d'un cluster. Il ne doit être ouvert que sur les nœuds de gestionnaire. - Port TCP et UDP
7946
pour la communication entre les nœuds (découverte du réseau de conteneurs). - Port UDP
4789
pour le trafic réseau superposé (réseau d'entrée de conteneur).
Remarque : Outre ces ports, le port 22
(pour le trafic SSH) et tous les autres ports nécessaires à l'exécution de services spécifiques sur le cluster doivent être ouverts.
Dans cet article, vous allez configurer le pare-feu Linux sur CentOS 7 à l'aide de FirewallD et IPTables. FirewallD est l'application de pare-feu par défaut sur CentOS 7, mais IPTables est également disponible. Bien que ce didacticiel couvre les deux méthodes, chacune donne le même résultat, vous pouvez donc choisir celle que vous connaissez le mieux.
Conditions préalables
Avant de poursuivre cet article, vous devez :
- Configurez les hôtes qui composent votre cluster, y compris au moins un swarm manager et un swarm worker. Vous pouvez suivre le tutoriel Comment provisionner et gérer des hôtes Docker distants avec Docker Machine sur CentOS 7 ) pour les configurer.
Remarque : Vous remarquerez que les commandes (et toutes les commandes de cet article) ne sont pas précédées de sudo
. En effet, il est supposé que vous êtes connecté au serveur à l'aide de la commande docker-machine ssh
après l'avoir provisionné à l'aide de Docker Machine.
Méthode 1 - Ouvrir les ports Docker Swarm à l'aide de FirewallD
FirewallD est l'application de pare-feu par défaut sur CentOS 7, mais sur un nouveau serveur CentOS 7, elle est désactivée par défaut. Alors activons-le et ajoutons les ports réseau nécessaires au fonctionnement de Docker Swarm.
Avant de commencer, vérifiez son état :
systemctl status firewalld
Il ne devrait pas être en cours d'exécution, alors démarrez-le :
systemctl start firewalld
Activez-le ensuite pour qu'il démarre au démarrage :
systemctl enable firewalld
Sur le nœud qui sera un gestionnaire Swarm, utilisez les commandes suivantes pour ouvrir les ports nécessaires :
firewall-cmd --add-port=2376/tcp --permanent firewall-cmd --add-port=2377/tcp --permanent firewall-cmd --add-port=7946/tcp --permanent firewall-cmd --add-port=7946/udp --permanent firewall-cmd --add-port=4789/udp --permanent
Remarque : Si vous faites une erreur et devez supprimer une entrée, saisissez : firewall-cmd --remove-port=port-number/tcp —permanent
.
Ensuite, rechargez le pare-feu :
firewall-cmd --reload
Redémarrez ensuite Docker.
systemctl restart docker
Ensuite, sur chaque nœud qui fonctionnera en tant que worker Swarm, exécutez les commandes suivantes :
firewall-cmd --add-port=2376/tcp --permanent firewall-cmd --add-port=7946/tcp --permanent firewall-cmd --add-port=7946/udp --permanent firewall-cmd --add-port=4789/udp --permanent
Ensuite, rechargez le pare-feu :
firewall-cmd --reload
Redémarrez ensuite Docker.
systemctl restart docker
Vous avez utilisé avec succès FirewallD pour ouvrir les ports nécessaires pour Docker Swarm.
Remarque : Si vous testez des applications sur le cluster qui nécessitent un accès réseau extérieur, assurez-vous d'ouvrir les ports nécessaires. Par exemple, si vous testez une application Web nécessitant un accès sur le port 80, ajoutez une règle qui accorde l'accès à ce port à l'aide de la commande suivante sur tous les nœuds (gestionnaires et agents) du cluster :
firewall-cmd --add-port=80/tcp --permanent
N'oubliez pas de recharger le pare-feu lorsque vous effectuez cette modification.
Méthode 2 - Ouvrir les ports Docker Swarm à l'aide d'IPTables
Pour utiliser IPTables sur n'importe quelle distribution Linux, vous devez d'abord désinstaller tous les autres utilitaires de pare-feu. Pour basculer vers IPTables depuis FirewallD, arrêtez d'abord FirewallD :
systemctl stop firewalld
Puis désactivez-le
systemctl disable firewalld
Installez ensuite le package iptables-services
qui gère le chargement automatique des règles IPTables :
yum install iptables-services
Ensuite, démarrez IPTables :
systemctl start iptables
Activez-le ensuite pour qu'il démarre automatiquement au démarrage :
systemctl enable iptables
Avant de commencer à ajouter des règles spécifiques à Docker Swarm à la chaîne INPUT, examinons les règles par défaut de cette chaîne :
iptables -L INPUT --line-numbers
La sortie devrait ressembler exactement à ceci :
OutputChain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Ensemble, les règles par défaut fournissent une protection avec état pour le serveur, refusant tout trafic d'entrée à l'exception de ceux qui sont déjà établis. Le trafic SSH est autorisé. Faites attention à la règle numéro 5, mise en évidence ci-dessus, car il s'agit d'une règle de rejet fourre-tout. Pour que votre Docker Swarm fonctionne correctement, les règles que vous ajoutez doivent être ajoutées au-dessus de cette règle. Cela signifie que les nouvelles règles doivent être insérées, au lieu d'être ajoutées à la chaîne INPUT.
Maintenant que vous savez quoi faire, vous pouvez ajouter les règles dont vous avez besoin à l'aide de l'utilitaire iptables
. Ce premier ensemble de commandes doit être exécuté sur les nœuds qui serviront de gestionnaires Swarm.
iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT
Ces règles sont des règles d'exécution et seront perdues si le système est redémarré. Pour enregistrer les règles d'exécution actuelles dans un fichier afin qu'elles persistent après un redémarrage, tapez :
/usr/libexec/iptables/iptables.init save
Les règles sont maintenant enregistrées dans un fichier appelé iptables
dans le répertoire /etc/sysconfig
. Et si vous affichez les règles à l'aide de iptables -L --line-numbers
, vous verrez que toutes les règles ont été insérées au-dessus de la règle de rejet fourre-tout :
OutputChain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 ACCEPT tcp -- anywhere anywhere tcp dpt:2376 6 ACCEPT tcp -- anywhere anywhere tcp dpt:7946 7 ACCEPT udp -- anywhere anywhere udp dpt:7946 8 ACCEPT udp -- anywhere anywhere udp dpt:4789 9 ACCEPT tcp -- anywhere anywhere tcp dpt:http 10 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Redémarrez ensuite Docker.
Outputsystemctl restart docker
Sur les nœuds qui fonctionneront en tant que nœuds de calcul Swarm, exécutez ces commandes :
iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT
Enregistrez les règles sur le disque :
/usr/libexec/iptables/iptables.init save
Redémarrez ensuite Docker :
systemctl restart docker
C'est tout ce qu'il faut pour ouvrir les ports nécessaires pour Docker Swarm en utilisant IPTables. Vous pouvez en savoir plus sur le fonctionnement de ces règles dans le tutoriel Fonctionnement du pare-feu IPTables.
Remarque : Si vous testez des applications sur le cluster qui nécessitent un accès réseau extérieur, assurez-vous d'ouvrir les ports nécessaires. Par exemple, si vous testez une application Web qui nécessite un accès sur le port 80, ajoutez une règle qui accorde l'accès à ce port à l'aide de la commande suivante sur tous les nœuds (gestionnaire et nœuds de calcul) du cluster :
iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT
Assurez-vous d'insérer la règle au-dessus de la règle de rejet fourre-tout.
Conclusion
FirewallD et IPTables sont deux des applications de gestion de pare-feu les plus populaires dans le monde Linux. Vous venez de lire comment les utiliser pour ouvrir les ports réseau nécessaires à la configuration de Docker Swarm. La méthode que vous utilisez n'est qu'une question de préférence personnelle, car ils sont tous également capables.