Quelle est la meilleure pratique de docker + ufw sous Ubuntu
J'ai juste essayé Docker. Il est génial, mais ne semble pas fonctionner correctement avec ufw. Par défaut, le panneau permet de manipuler les iptables un peu. Le résultat n'est pas un bug, mais pas ce que j'attendais.
Pour plus de détails, vous pouvez lire Les dangers de UFW + Docker
Mon objectif est de mettre en place un système comme
Host (running ufw) -> docker container 1 - nginx (as a reverse proxy)
-> docker container 2 - node web 1
-> docker container 3 - node web 2
-> .......
Je veux gérer le trafic entrant (par exemple, limiter l'accès) à travers ufw donc je ne veux pas de menu fixe à toucher mon iptables. Voici mon test de
Environnement:
- nouvellement installé Ubuntu 14.04 (kernel 3.13.0-53 )
- Docker 1.6.2
- ufw le transfert est activé.( Activer UFW transfert )
--iptables=false
a été ajouté le démon Docker.
Première Tentative
docker run --name ghost -v /home/xxxx/ghost_content:/var/lib/ghost -d ghost
docker run --name nginx -p 80:80 -v /home/xxxx/nginx_site_enable:/etc/nginx/conf.d:ro --link ghost:ghost -d nginx
Pas de chance. La première commande est bien, mais le deuxième commande renvoie une erreur
Error response from daemon: Cannot start container
Deuxième Tentative
Ensuite, j'ai trouvé ceci: incapable de conteneurs de liens avec iptables --=false #12701
Après l'exécution de la commande suivante, tout à l'air OK.
sudo iptables -N DOCKER
Cependant, j'ai remarqué que je ne peux pas établir toutes les connexions sortantes à l'intérieur des contenants. Par exemple:
xxxxg@ubuntu:~$ sudo docker exec -t -i nginx /bin/bash
root@b0d33f22d3f4:/# ping 74.125.21.147
PING 74.125.21.147 (74.125.21.147): 56 data bytes
^C--- 74.125.21.147 ping statistics ---
35 packets transmitted, 0 packets received, 100% packet loss
root@b0d33f22d3f4:/#
Si je supprime --iptables=false
du démon Docker, puis la connexion internet de conteneurs sera de retour à la normale, mais la ufw ne fonctionne pas "correctement" (well...by ma définition).
Alors, quelle est la meilleure pratique de docker + ufw? Quelqu'un peut-il fournir de l'aide?
Grâce.
Bart.
iptables -N DOCKER
commence une nouvelle chaîne avec ce nom... peut-être que vous pouvez sortir de la iptables activer (je veux dire sans enlever--iptables=false
et puis vous pouvez exécuter un "poste de commandement" de la chaîne de départ. Je n'ai pas la réponse sur ce qui est la meilleure pratique o_O
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce genre de problème, comme il y a des mois et dernièrement décidé de décrire le problème ainsi que la solution sur mon blog. Voici le raccourci.
À l'aide de
--iptables=false
ne sera pas beaucoup vous aider, avec le cas que vous avez décrit. Il est tout simplement pas assez de place ici. Par défaut, aucun de vos conteneurs peuvent faire toute connexion sortante.Il y a une petite étape vous êtes en omettant sur votre façon d'avoir des conteneurs derrière UFW ici. Vous pouvez utiliser
--iptables=false
ou créer/etc/docker/daemon.json
fichier avec le contenu comme suitle résultat sera le même, mais la dernière option nécessite le redémarrage de l'ensemble panneau de service avec
service docker restart
ou même faire un reboot si le panneau a une chance d'ajouter des règles iptables avant vous avez désactivé cette fonction.Quand c'est fait, il suffit de faire deux choses:
si vous avez configuré par défaut de l'avant des politiques dans UFW pour accepter et d'utilisation:
De cette façon ce que vous êtes réalisation est de désactiver le panneau de désordre de comportement dans vos règles iptables et dans le même temps, le panneau est fourni avec le nécessaire de routage afin de conteneurs vont faire les connexions sortantes l'amende juste. UFW règles seront toujours limitées à partir de ce point, cependant.
Espère que cela résout le problème pour vous et toute qui pénètre ici dans la recherche d'une réponse.
J'ai décrit le problème et la solution la plus exhaustive à l' https://www.mkubaczyk.com/2017/09/05/force-docker-not-bypass-ufw-rules-ubuntu-16-04/
Problème
Ce problème a été autour pendant un long moment.
Désactiver iptables dans le Panneau prendra d'autres problèmes.
Annulation des modifications première
Si vous avez modifié votre serveur en fonction de la solution actuelle que nous trouvons sur internet, veuillez restauration de ces changements, y compris:
Supprimer toutes les modifications comme
--iptables=false
, y compris le fichier de configuration/etc/docker/daemon.json
.DROP
au lieu deACCEPT
./etc/ufw/after.rules
.La résolution de UFW et Docker questions
Cette solution a besoin de modifier un seul UFW fichier de configuration, tous les Panneau de configurations et d'options par défaut. N'a pas besoin de désactiver le menu fixe iptables fonction.
Modifier le UFW fichier de configuration
/etc/ufw/after.rules
et ajouter les règles suivantes à la fin du fichier:L'aide de la commande
sudo systemctl restart ufw
redémarrer UFW après la modification du fichier. Maintenant, le réseau public ne peut pas accéder à la publication de docker ports, le conteneur et le réseau privé peuvent se rendre visite régulièrement, et les récipients peuvent également accéder au réseau externe de l'intérieur.Si vous souhaitez autoriser les réseaux publics d'accéder aux services fournis par le conteneur Docker, par exemple, le port de service d'un conteneur est
80
. Exécutez la commande suivante pour permettre au public de réseaux pour accéder à ce service:Cette commande permet au réseau public d'accéder à toutes les publications, les ports dont le port à conteneurs est de 80.
Remarque: Si nous publions un port à l'aide de l'option
-p 8080:80
, nous devrions utiliser le port à conteneurs80
, pas le port de l'hôte8080
.Si il y a de multiples récipients avec un port de service de 80, mais nous voulons seulement le réseau externe pour accéder à un conteneur particulier. Par exemple, si l'adresse privée du conteneur est 172.17.0.2, utilisez la commande suivante:
Si le protocole de réseau de service est UDP, par exemple, un service de DNS, vous pouvez utiliser la commande suivante pour permettre au réseau externe pour accéder à toutes les publications, les services DNS:
De même, si seulement pour un conteneur spécifique, tels que l'adresse IP 172.17.0.2:
Comment ça marche?
Les règles suivantes permettent les réseaux privés pour être en mesure de visiter les uns les autres. Généralement, les réseaux privés sont plus fiables que les réseaux publics.
Les règles suivantes permettent de UFW à gérer si les réseaux publics sont autorisés à visiter les services fournis par le conteneur Docker. De sorte que nous pouvons gérer toutes les règles de pare-feu dans un seul endroit.
Les règles suivantes bloquer les demandes de connexion initiée par tous les réseaux publics, mais de permettre à l'intérieur des réseaux d'accès à des réseaux externes. Pour le protocole TCP, il empêche activement à l'établissement d'une connexion TCP à partir des réseaux publics. Pour le protocole UDP, tous les accès aux ports qui est à moins de 32767 sont bloqués. Pourquoi est-ce port? Depuis le protocole UDP est apatride, il n'est pas possible de bloquer la poignée de main du signal qui déclenche la demande de connexion TCP n'. Pour GNU/Linux, nous pouvons trouver le local de la plage de port dans le fichier
/proc/sys/net/ipv4/ip_local_port_range
. La plage par défaut est32768 60999
. Lorsque vous accédez à un protocole UDP service de l'exécution d'un conteneur, le port local sera choisi au hasard l'un à partir de la plage de port, et le serveur va renvoyer les données à ce port aléatoire. Par conséquent, nous pouvons supposer que le port d'écoute du protocole UDP à l'intérieur de tous les contenants de moins de 32768. C'est la raison pour laquelle nous ne voulons pas de réseaux publics pour l'accès aux ports UDP moins de 32768.Plus
https://github.com/chaifeng/ufw-docker
D'utilisation
Mise à jour: 2018-09-10
La raison du choix de
ufw-user-forward
, pasufw-user-input
à l'aide de
ufw-user-input
Pro:
Facile à utiliser et à comprendre, prend en charge les anciennes versions d'Ubuntu.
Par exemple, pour autoriser le public à visiter un port publié dont le port à conteneurs est
8080
, utilisez la commande:Con:
Il n'expose pas seulement les ports de conteneurs, mais expose également les ports de l'hôte.
Par exemple, si un service est en cours d'exécution sur l'hôte et le port est
8080
. La commandeufw allow 8080
permet au réseau public de visiter le service et publiés tous les ports dont les conteneurs de port est8080
. Mais nous voulons exposer le service en cours d'exécution sur l'hôte, ou tout simplement le service en cours d'exécution à l'intérieur de conteneurs, pas les deux à la fois.Pour éviter ce problème, nous avons peut-être besoin d'utiliser une commande semblable à la suivante pour tous les conteneurs:
à l'aide de
ufw-user-forward
Pro:
Ne peut exposer des services s'exécutant sur des machines et des conteneurs dans le même temps par la même commande.
Par exemple, si nous voulons publier le port
8080
de conteneurs, utilisez la commande suivante:Le réseau public peut accéder à toutes les publications, les ports dont les ports à conteneurs sont
8080
.Mais le port
8080
de l'hôte n'est pas encore accessible par le réseau public. Si nous voulons le faire, exécutez la commande suivante pour permettre au public d'accéder au port de l'hôte séparément:Con:
Ne prend pas en charge les anciennes versions d'Ubuntu, et la commande est un peu plus compliqué. Mais vous pouvez utiliser mon script https://github.com/chaifeng/ufw-docker.
Conclusion
Si nous sommes en utilisant une ancienne version de Ubuntu, on peut utiliser
ufw-user-input
de la chaîne. Mais être prudent pour éviter d'exposer des services qui ne devraient pas être exposés.Si nous utilisons une version plus récente d'Ubuntu qui est un soutien
ufw route
sous-commande, nous ferions mieux d'utiliserufw-user-forward
de la chaîne, et l'utilisationufw route
de commande pour gérer les règles de pare-feu pour les conteneurs.Mise À Jour: 6 Octobre 2018
Le script ufw-docker prend en charge le Panneau de l'Essaim maintenant. Veuillez consulter la dernière version du code pour plus d', https://github.com/chaifeng/ufw-docker
Installation de Docker Essaim mode
Nous ne pouvons utiliser ce script sur le gestionnaire de noeuds pour gérer les règles de pare-feu lors de l'utilisation dans l'Essaim de mode.
after.rules
fichiers sur tous les nœuds, y compris les gestionnaires et les travailleursCours d'exécution dans le Panneau de l'Essaim de mode, ce script va ajouter un service global
ufw-docker-agent
. L'image chaifeng/ufw-docker-agent est également construite automatiquement à partir de ce projet.172.16.0.0
avec172.17.0.0
ufw-user-forward
chaîne, alors que l'autre solution utiliseufw-user-input
. Je suppose que c'est pourquoi vous avez besoin deufw route ...
. J'ai trouvé queufw route ...
n'est pas pris en charge dans les versions plus anciennes.ufw-user-input
est une mauvaise idée? En fait je pense même que c'est plus facile à comprendre. Quand je le mappage de ports à partir du conteneur à l'hôte, je m'attends à ce que je peux utiliser l'hôte habituel des règles commeufw allow http
. Je trouve la règle un peu plus difficile à retenir et pas aussi intuitif. Si vous pouviez ajouter un peu de pro et des inconvénients de chaque solution, ce serait super.Pas tout à fait sûr de ce que votre demande mais de ce que j'ai pu rassembler vous souhaitez mieux contrôler qui peut accéder à vos applications en cours d'exécution à l'intérieur de Docker? J'ai répondu à une question similaire ici pour le contrôle du trafic via un proxy frontal plutôt qu'avec IP tables Bloquer l'accès externe à conteneurs docker
Espère que cette aide
Dylan
Modifier
Avec l'approche ci-dessus vous pouvez ensuite utiliser UFW pour autoriser uniquement les connexions entrantes sur le port 80 (c'est à dire le proxy). Cela permet de maintenir n'importe quel port de l'exposition à un minimum avec, en bonus, que vous pouvez contrôler le trafic à travers un proxy configuration & DNS
Pour ce que ça vaut voici un additif à @mkubaczyk réponse pour le cas où il y a plus de pont des réseaux impliqués dans l'ensemble de l'installation. Ceux-ci peuvent être fournis par Docker-composition de projets et voici comment les règles adéquates peuvent être générés, étant donné que ces projets sont contrôlés par
systemd
./etc/systemd/system/[email protected]
/usr/local/bin/update-iptables-for-docker-bridges
Évidemment, cela ne va pas si bien que cela.
Il est également intéressant de noter que la totalité de la base du concept de volonté de dissimuler la source de toute connexion pour les applications s'exécutant dans un conteneur.