79 votes

Uncomplicated Firewall (UFW) ne bloque rien lors de l'utilisation de 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).

J'ai seulement besoin ssh y http alors je fais ça :

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 aux bases de données sur d'autres ports de cette machine. . Une idée sur ce que je fais mal ?

EDITAR Ces bases de données sont sur des conteneurs Docker. Est-ce que cela pourrait être lié ? Est-ce qu'il outrepasse 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)

119voto

ESala Points 2041

Le problème était d'utiliser le -p sur les conteneurs.

Il s'avère que Docker effectue des changements directement sur votre iptables qui n'apparaissent pas avec ufw status .

Les solutions possibles sont les suivantes :

  1. Arrêtez d'utiliser le -p drapeau. Utilisez la liaison docker ou réseaux de dockers à la place.

  2. Liez les conteneurs localement afin 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 le -p indique à docker de ne pas toucher à votre iptables en les désactivant dans /etc/docker/daemon.json et de redémarrer :

    { "iptables" : false }

Je recommande l'option 1 ou 2. Attention à l'option 3 a des effets secondaires comme des conteneurs incapables de se connecter à Internet.

8voto

Hal Jordan Points 89

16.04 présente de nouveaux défis. J'ai fait toutes les étapes comme indiqué Exécution de Docker derrière le pare-feu ufw MAIS Je n'ai PAS pu faire fonctionner docker plus UFW sur 16.04. En d'autres termes, peu importe ce que je faisais, tous les ports de docker étaient globalement exposés à Internet. Jusqu'à ce que je trouve ceci : Comment configurer Docker 1.12+ pour ne PAS interférer avec IPTABLES/FirewallD

J'ai dû créer le fichier /etc/docker/daemon.json et mettez ce qui suit :

{
    "iptables": false
}

J'ai alors émis sudo service docker stop puis sudo service docker start ENFIN, Docker ne fait que suivre les règles appropriées de l'UFW.

Données supplémentaires : Docker annule l'UFW !

6voto

orshachar Points 169

Si vous utilisez le système init de systemd (Ubuntu 15.10 et plus), modifiez le fichier /etc/docker/daemon.json (il peut être nécessaire de le créer s'il n'existe pas), assurez-vous qu'il dispose de iptables configurée :

{   "iptables" : false }

EDITAR : cela pourrait vous faire perdre la connexion à Internet depuis l'intérieur des conteneurs.

Si vous avez activé l'UFW, vérifiez que vous pouvez accéder à l'internet depuis l'intérieur des conteneurs. Si ce n'est pas le cas, vous devez définir les éléments suivants DEFAULT_FORWARD_POLICY como ACCEPT en /etc/default/ufw et appliquer l'astuce décrite ici : https://stackoverflow.com/a/17498195/507564

4voto

AI Mechanic Points 141

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

Conformément à La réponse d'ESala :

Si vous utilisez -p sur les conteneurs, Docker apporte des modifications directement à iptables, en ignorant l'ufw.

Exemple d'enregistrements ajoutés à iptables par Docker

Acheminement 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

Transfert des 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 n'autoriser l'accès à la chaîne DOCKER qu'à partir d'une IP source spécifiée (par ex. 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 pouvez utiliser iptables-save > /tmp/iptables.conf y iptables-restore < /tmp/iptables.conf pour vider, modifier et restaurer les règles iptables.

3voto

kimy82 Points 131

Une solution rapide consiste à exécuter Docker et à effectuer le mappage des ports. Vous pouvez toujours faire

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X