Je viens d'installer la dernière version de docker-ce
sur CentOS, mais je ne peut pas atteindre les ports publiés depuis un serveur voisin et ne peut pas atteindre l'extérieur depuis le conteneur lui-même.
Exécution d'un simple Vanilla CentOS 8 avec NetworkManager et FirewallD activés. La zone de pare-feu par défaut est public
.
Versions:
docker-ce
19.03.3 (RPM Docker officiel)containerd.io
1.2.6 (RPM Docker officiel pour CentOS 7 - pas encore disponible pour CentOS 8)Après avoir passé quelques jours à regarder les journaux et les configurations des composants impliqués, j'étais sur le point de jeter l'éponge et de revenir à Fedora 30, où cela semble fonctionner directement.
En me concentrant sur le pare-feu, j'ai réalisé que la désactivation de firewalld
semblait faire l'affaire, mais je préférerais ne pas le faire. Lors de l'inspection des règles de réseau avec iptables
, j'ai réalisé que le passage à nftables
signifie que iptables
est maintenant une couche d'abstraction qui ne montre qu'une petite partie de nftables
règles. Cela signifie que la plupart - sinon la totalité - de la configuration firewalld
sera appliquée en dehors de la portée de iptables
.
J'avais l'habitude de pouvoir trouver toute la vérité dans iptables
, donc cela prendra un certain temps pour s'y habituer.
Pour faire court, pour que cela fonctionne, j'ai dû activer le masquage. Il semblait que dockerd
l'ait déjà fait par le biais de iptables
, mais apparemment, cela doit être spécifiquement activé pour que la zone de pare-feu pour que iptables
se mascarade fonctionne:
# Masquerading allows for docker ingress and egress (this is the juicy bit)
firewall-cmd --zone=public --add-masquerade --permanent
# Specifically allow incoming traffic on port 80/443 (nothing new here)
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp
# Reload firewall to apply permanent rules
firewall-cmd --reload
Redémarrez ou redémarrez dockerd
, et les entrées et sorties devraient fonctionner.
Ce qui manque dans les réponses précédentes, c'est le fait que vous devez d'abord ajouter votre interface docker à la zone que vous configurez, par ex. public (ou ajoutez-le à la zone "de confiance" qui a été suggérée ici mais je doute que ce soit sage, du point de vue de la sécurité). Parce que par défaut, il n'est pas affecté à une zone. N'oubliez pas non plus de recharger le démon docker lorsque vous avez terminé.
# Check what interface docker is using, e.g. 'docker0'
ip link show
# Check available firewalld zones, e.g. 'public'
Sudo firewall-cmd --get-active-zones
# Check what zone the docker interface it bound to, most likely 'no zone' yet
Sudo firewall-cmd --get-zone-of-interface=docker0
# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reload
Sudo nmcli connection modify docker0 connection.zone public
# Masquerading allows for docker ingress and egress (this is the juicy bit)
Sudo firewall-cmd --zone=public --add-masquerade --permanent
# Optional open required incomming ports (wasn't required in my tests)
# Sudo firewall-cmd --zone=public --add-port=443/tcp
# Reload firewalld
Sudo firewall-cmd --reload
# Reload dockerd
Sudo systemctl restart docker
# Test ping and DNS works:
docker run busybox ping -c 1 172.16.0.1
docker run busybox cat /etc/resolv.conf
docker run busybox ping -c 1 yourhost.local
J'ai de nouveau changé la variable FirewallBackend en iptables et cela fonctionne pour moi.
Avec cette mise à jour, le sous-système de filtrage nftables est le backend de pare-feu par défaut pour le démon firewalld. Pour modifier le backend, utilisez l'option FirewallBackend dans le fichier /etc/firewalld.conf.
Lien: Centos8 Deprecated_functionality
Je n'ai pas trop d'informations sur ce changement de comportement. Certaines des règles iptables que Docker essaie d'utiliser ne fonctionnent pas selon les journaux CentOS8:
AVERTISSEMENT: COMMAND_FAILED: '/ usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' a échoué: iptables: mauvaise règle (une règle correspondante existe-t-elle dans cette chaîne?).