J'ai docker installé sur CentOS 7 et j'utilise firewallD.
De l'intérieur de mon conteneur, aller à l'hôte (par défaut 172.17.42.1)
Avec pare-feu activé
container# nc -v 172.17.42.1 4243
nc: connect to 172.17.42.1 port 4243 (tcp) failed: No route to Host
avec arrêt du pare-feu
container# nc -v 172.17.42.1 4243
Connection to 172.17.42.1 4243 port [tcp/*] succeeded!
J'ai lu les documents sur firewalld et je ne les comprends pas complètement. Existe-t-il un moyen d'autoriser tout simplement dans un conteneur Docker (je suppose sur l'adaptateur Docker0) un accès illimité à l'hôte?
Peut-être mieux que la réponse précédente;
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload
Ces commandes ont fait l'affaire:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
L'une des raisons pour lesquelles la solution acceptée fonctionne pour certaines personnes mais pas pour d'autres réside dans un problème de conception de firewalld. Firewalld traite uniquement la première zone correspondante pour toutes les connexions. Il traite également les zones basées sur l'adresse IP avant les zones basées sur les interfaces. Tant que l'une de vos zones inclut les adresses IP que Docker utilise, la règle ACCEPT dans la zone de confiance ne sera jamais traitée.
Pour vérifier cela, vous pouvez consulter les règles iptables générées sauf si vous utilisez le backend nbt:
iptables -vnL | less
La solution consiste à utiliser une règle directe firewalld au lieu de la zone de confiance. Les règles directes sont toujours traitées en premier. Par exemple, pour le port 3306 (c'est-à-dire, mysqld sur l'hôte local), vous auriez besoin de cette règle:
/bin/firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 10 -p tcp --dport 3306 -i docker0 -j ACCEPT
Si vous répétez la même commande sans le commutateur --permanent, firewalld effectuera la modification à la volée pour vous, et vous ne devriez pas avoir besoin de redémarrer docker.
Une deuxième raison est que, selon la version de docker et la mise en réseau que vous avez configurée, le trafic peut ne pas réellement transiter par l'interface docker0, mais via une interface de pont distincte. Vous pouvez voir cette interface avec la commande
ip address show
Vous devrez répéter l'instruction de règle directe ci-dessus avec cette interface de pont.
Vous pouvez également spécifier votre propre réseau dans Docker. Cet article décrit le processus: https://serverfault.com/questions/885470/how-to-configure-firewall-on-user-defined-docker-bridge
La version courte est que vous spécifiez la section réseaux dans un fichier docker, comme ceci:
version: '3'
.
.
.
networks:
mynetwork:
driver_opts:
com.docker.network.bridge.name: mynetwork_name
Vous pouvez également le faire sur la ligne de commande.
le docker suivant a autorisé l'accès à Internet sur CentOS 7 avec firewalld
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 4 -i docker0 -j ACCEPT
firewall-cmd --reload
systemctl restart docker