L'essentiel du problème est que si je crée et exécute un conteneur docker (à partir de n'importe quelle image, j'en ai essayé plusieurs) le conteneur n'a pas d'accès au réseau externe au-delà du pont par défaut créé par Docker, même en utilisant des adresses IP (et non des URL/noms).
I.e.
-
docker run --rm -it busybox ping 8.8.8.8
se bloque/échoue pour ne pas avoir accédé au réseau -
docker run --rm -it busybox ping 172.17.0.1
échoue également (notez que172.17.0.1
esdocker0
sur l'hôte et également la passerelle définie par docker dans le conteneur). - Si je crée deux conteneurs, je peux envoyer un ping à l'un ou à l'autre sans problème (car ils sont tous deux connectés au pont docker).
La mise en réseau depuis l'hôte fonctionne bien (je peux envoyer un ping, etc.). De plus, si j'exécute docker run --network host --rm -it busybox ping 8.8.8.8
il atteint le serveur et répond en temps voulu.
Il ne s'agit pas d'un ping
problème : traceroute
, wget
y apt-get update
échouent également. (Ils échouent avec les adresses IP ainsi qu'avec les URL ; même si les serveurs DNS sont OK dans la section /etc/resolv.conf
à la fois sur l'hôte et dans le conteneur).
N.B :
-
J'ai deux hôtes Ubuntu (même version) qui exécutent tous deux Docker 19.03.6. Sur l'un d'entre eux (machine de développement), le problème ne se pose pas (il fonctionne parfaitement), mais sur l'autre, oui. Cela signifie qu'il ne s'agit probablement pas d'un problème de système d'exploitation et/ou de version de Docker, mais d'une sorte de mauvaise configuration.
-
Il est no la question DNS posée dans la plupart des questions que j'ai pu trouver. En fait, ce n'est pas du tout un problème de DNS. Il se présente lorsque j'utilise des adresses IP directes ainsi qu'avec des URL.
J'utilise iptables
sur l'hôte. Ce sont les règles (de iptables-save
) sur celle où cela ne fonctionne pas (ils sont différents sur la machine de développement où le réseau fonctionne bien mais je ne peux pas définir les mêmes ici) :
# Generated by iptables-save v1.6.0 on Wed Apr 15 23:14:15 2020
*nat
:PREROUTING ACCEPT [14467:1224366]
:INPUT ACCEPT [479:21744]
:OUTPUT ACCEPT [249:15752]
:POSTROUTING ACCEPT [249:15752]
:DOCKER - [0:0]
COMMIT
# Completed on Wed Apr 15 23:14:15 2020
# Generated by iptables-save v1.6.0 on Wed Apr 15 23:14:15 2020
*filter
:INPUT DROP [4360:696740]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [9497:1567380]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
:f2b-postfix-sasl - [0:0]
:f2b-sshd - [0:0]
:fail2ban-ssh - [0:0]
-A INPUT -p tcp -m multiport --dports 25,465,587,220,993,110,995 -j f2b-postfix-sasl
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p udp -m udp --sport 123 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 465 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 465 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 587 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o docker0 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 465 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A f2b-postfix-sasl -j RETURN
-A f2b-sshd -j RETURN
-A fail2ban-ssh -j RETURN
-A fail2ban-ssh -j RETURN
COMMIT
# Completed on Wed Apr 15 23:14:15 2020
J'ai essayé d'arrêter dockerd
supprimer les règles liées à Docker à la main, et redémarrer le démon. Il a recréé les mêmes règles et le problème persiste.
Je ne suis pas un iptables
Il peut donc s'agir d'un problème quasi trivial ou sans rapport avec iptables ;/).
Je ne suis pas sûr de ce qu'il faut ajouter pour clarifier les choses.
Que dois-je faire ?