web-dev-qa-db-fra.com

Le pare-feu simple (UFW) ne bloque rien lorsque vous utilisez Docker

C'est la première fois que je configure un serveur Ubuntu (14.04 LTS) et j'ai des difficultés à configurer le pare-feu (UFW).

Je n'ai besoin que de ssh et http, alors je fais ceci:

Sudo ufw disable

Sudo ufw reset
Sudo ufw default deny incoming
Sudo ufw default allow outgoing

Sudo ufw allow 22/tcp
Sudo ufw allow 80/tcp

Sudo ufw enable
Sudo reboot

Mais je peux toujours me connecter à des bases de données sur d'autres ports de cette machine. Une idée de ce que je fais mal?

EDIT: ces bases de données se trouvent sur des conteneurs Docker. Cela pourrait-il être lié? est-ce que cela remplace ma configuration ufw?

EDIT2: sortie de Sudo ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
42
ESala

Le problème utilisait l'indicateur -p sur les conteneurs.

Il s'avère que Docker apporte des modifications directement sur votre iptables, qui ne sont pas affichées avec ufw status.

Les solutions possibles sont:

  1. Arrêtez d'utiliser l'indicateur -p. Utilisez la liaison Docker ou réseaux Docker à la place.

  2. Liez les conteneurs localement pour qu'ils ne soient pas exposés en dehors de votre machine:

    docker run -p 127.0.0.1:8080:8080 ...

  3. Si vous insistez pour utiliser l'indicateur -p, dites à docker de ne pas toucher votre iptables en les désactivant dans /etc/docker/daemon.json et en redémarrant:

    { "iptables" : false }

Je recommande les options 1 ou 2. Attention, l'option 3 a des effets secondaires , tout comme les conteneurs qui ne peuvent plus se connecter à Internet.

61
ESala

16.04 présente de nouveaux défis. J'ai fait toutes les étapes comme indiqué Lancer Docker derrière le pare-feu ufwMAIS Je ne pouvais PAS faire fonctionner docker plus UFW le 16.04. En d'autres termes, peu importe ce que j'ai fait, tous les ports de docker sont devenus globalement exposés à Internet. Jusqu’à ce que j’ai trouvé ceci: Comment configurer Docker 1.12+ de ne pas interférer avec IPTABLES/FirewallD

Je devais créer le fichier /etc/docker/daemon.json et mettre le texte suivant dans:

{
    "iptables": false
}

J'ai alors publié Sudo service docker stop puis Sudo service docker start FINALLY docker suit simplement les règles appropriées dans UFW.

Données supplémentaires: Docker annule UFW!

8
Hal Jordan

Si vous utilisez le système init de systemd (Ubuntu 15.10 et versions ultérieures), éditez le /etc/docker/daemon.json (vous devrez peut-être le créer s'il n'existe pas), assurez-vous que la clé iptables est configurée:

{   "iptables" : false }

EDIT: vous risquez de perdre la connexion à Internet à partir de conteneurs internes.

Si vous avez activé UFW, vérifiez que vous pouvez accéder à Internet à partir de conteneurs. sinon - vous devez définir DEFAULT_FORWARD_POLICY comme ACCEPT sur /etc/default/ufw et appliquer l'astuce décrite ici: https://stackoverflow.com/a/17498195/507564

4
orshachar

Une solution rapide consiste à exécuter Docker et à mapper les ports. Tu peux toujours faire

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

pour empêcher l'accès à votre Docker de l'extérieur.

2
kimy82

Utilisation de /etc/docker/daemon.json avec du contenu

{
  "iptables": false
}

cela peut sembler être une solution , mais cela ne fonctionne que jusqu'au prochain redémarrage . Après cela, vous remarquerez peut-être qu'aucun de vos conteneurs n'a accès à Internet. Par exemple, vous ne pouvez pas cingler de site Web. Ce peut être un comportement indésirable.

Même chose pour lier un conteneur à une adresse IP spécifique. Vous ne voudrez peut-être pas faire cela. L'option ultime consiste à créer un conteneur et à le placer derrière UFW, peu importe ce qui se passe et comment vous créez ce conteneur. Il existe donc une solution:

Après avoir créé le fichier /etc/docker/daemon.json, appelez:

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

vous devez donc configurer la politique de transfert par défaut dans UFW pour accepter et utiliser:

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Si vous êtes sur le point d'utiliser Docker-Compose, la commande IP de ci-dessus doit être remplacée par l'IP du réseau créé par Docker-Composition lors de son exécution avec docker-compose up.

J'ai décrit le problème et la solution de manière plus complète dans cet article

J'espère que ça aide!

2
mkubaczyk

Dans mon cas, j'ai fini par modifier iptables pour permettre l'accès à Docker uniquement à partir d'adresses IP spécifiques.

Selon réponse de ESala :

Si vous utilisez l'indicateur -p sur les conteneurs, Docker apporte directement les modifications à iptables, en ignorant le paramètre ufw.

Exemple d'enregistrements ajoutés à iptables par Docker

Routage vers la chaîne 'DOCKER':

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Envoi de paquets de la chaîne 'DOCKER' au conteneur:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

Vous pouvez modifier iptables pour autoriser l'accès à la chaîne DOCKER uniquement à partir de l'adresse IP source spécifiée (par exemple, 1.1.1.1):

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

Vous voudrez peut-être utiliser iptables-save > /tmp/iptables.conf et iptables-restore < /tmp/iptables.conf pour vider, éditer et restaurer les règles iptables.

1
AI Mechanic
  1. Connectez-vous à votre console de docker:

    Sudo docker exec -i -t nom_image_stockeur/bin/bash

  2. Et ensuite dans votre console de docker:

    Sudo apt-get update
    Sudo apt-get install ufw
    Sudo ufw allow 22
    
  3. Ajoutez vos règles ufw et activez ufw

    Sudo ufw permettre

    • Votre image Docker doit être démarrée avec --cap-add = NET_ADMIN

Pour activer l'option "NET_ADMIN" de Docker:

1.Stop Container:

docker arrêter votre conteneur; Identifiant du conteneur 2.Get:

docker inspecter votre conteneur; 3. Modifiez hostconfig.json (chemin d'accès au menu fixe par défaut:/var/lib/docker, vous pouvez modifier le vôtre).

vim /var/lib/docker/containers/containerid/hostconfig.json

4.Rechercher "CapAdd" et modifier null en ["NET_ADMIN"];

...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Redémarrez le menu fixe dans la machine hôte;

redémarrage du docker de service; 6. Démarrez yourconatiner;

docker démarrer votre conteneur;

0
Stefan

Utilisez --network = Host lorsque vous démarrez un conteneur afin que docker mappe le port sur un réseau isolé uniquement à la place d'un réseau de pont par défaut. Je ne vois aucun moyen légal de bloquer un réseau ponté. Vous pouvez également utiliser un réseau personnalisé défini par l'utilisateur avec isolation.

0
thecoder

J'ai utilisé docker-compose pour démarrer plusieurs conteneurs et le problème était qu'un port était exposé au monde en ignorant les règles ufw.

Le correctif destiné à rendre le port uniquement disponible pour mes conteneurs Docker était ce changement dans mon fichier docker-compose.yml:

ports:
- "1234:1234"

pour ça:

ports:
- "1234"

Maintenant, les autres conteneurs Docker peuvent toujours utiliser le port, mais je ne peux pas y accéder de l'extérieur.

0
TmTron