1 votes

Pas de mise en réseau à partir du pont Docker

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 que 172.17.0.1 es docker0 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 :

  1. 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.

  2. 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 ?

1voto

Jacek Kobus Points 11

J'ai eu le même problème avec le réseau ponté sur docker 19.03.8 sur ubuntu 18.04.4 LTS (pc1) et j'ai finalement réussi à le résoudre.

J'avais docker qui fonctionnait sur l'autre pc (pc2) qui utilisait aussi ubuntu 18.04.4 LTS mais avec docker 19.03.5.

J'ai comparé les IPTABLES - pour une raison quelconque, au cours de mes tentatives pour résoudre le problème, il me manquait quelques règles. Les règles que j'utilise maintenant sur pc1 sont :

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -N DOCKER
sudo iptables -N DOCKER-ISOLATION-STAGE-1
sudo iptables -N DOCKER-ISOLATION-STAGE-2
sudo iptables -N DOCKER-USER
sudo iptables -A FORWARD -j DOCKER-USER
sudo iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1
sudo iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -o docker0 -j DOCKER
sudo iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
sudo iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
sudo iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
sudo iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN
sudo iptables -A DOCKER-USER -j RETURN

J'ai aussi enlevé sudo rm /etc/docker/daemon.json (il y a eu quelques conflits avec le VPN et j'ai déjà changé le bip). L'étape finale était : sudo service docker restart

Résultat :

$ docker run --rm -it busybox ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=54 time=9.479 ms
64 bytes from 8.8.8.8: seq=1 ttl=54 time=7.697 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 7.697/8.588/9.479 ms

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