Comment configurer le pare-feu Linux pour Docker Swarm sur CentOS 7

De Get Docs
Aller à :navigation, rechercher

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 :

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.