9 votes

Docker ne liera les ports transférés qu'aux interfaces IPv6.

Existe-t-il un moyen de dire à Docker de ne lier les ports transférés qu'aux interfaces IPv4 ?

J'ai une machine fonctionnant sur Digital Ocean avec l'IPv6 désactivé :

# echo '1' > /proc/sys/net/ipv6/conf/lo/disable_ipv6  
# echo '1' > /proc/sys/net/ipv6/conf/lo/disable_ipv6  
# echo '1' > /proc/sys/net/ipv6/conf/all/disable_ipv6  
# echo '1' > /proc/sys/net/ipv6/conf/default/disable_ipv6
# /etc/init.d/networking restart

ifconfig signale qu'il n'y a pas d'interfaces compatibles IPv6 :

# ifconfig
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:1372 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7221 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:88091 (88.0 KB)  TX bytes:10655750 (10.6 MB)

eth0      Link encap:Ethernet  HWaddr 04:01:08:c1:b1:01  
          inet addr:198.XXX.XXX.XXX  Bcast:198.199.90.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:97602 errors:0 dropped:4 overruns:0 frame:0
          TX packets:15362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:141867997 (141.8 MB)  TX bytes:1376970 (1.3 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lxcbr0    Link encap:Ethernet  HWaddr 9e:51:04:ed:13:d4  
          inet addr:10.0.3.1  Bcast:10.0.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Lorsque je lance un nouveau conteneur docker et que je lui demande de transférer le port 8000 vers 8000 dans le conteneur, il le fait uniquement sur les interfaces IPv6. Existe-t-il un moyen de le faire se lier uniquement aux interfaces IPv4 ?

# docker run -p 8000:8000 -i -t colinsurprenant/ubuntu-raring-amd64 /bin/bash

# lsof -OnP | grep LISTEN
sshd      1275             root    3u     IPv4 ... TCP *:22 (LISTEN)
sshd      1275             root    4u     IPv6 ... TCP *:22 (LISTEN)
dnsmasq   2975      lxc-dnsmasq    7u     IPv4 ... TCP 10.0.3.1:53 (LISTEN)
docker    9629             root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9630        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9631        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9632        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9633        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9634        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9698        root    7u     IPv6 ... TCP *:8000 (LISTEN)

1 votes

J'ai créé un ticket sur le repo Github de Docker : github.com/dotcloud/docker/issues/2174

0 votes

Êtes-vous sûr qu'il n'écoute que l'IPv6 ? Quelle est la sortie de lsof -i 4tcp:8000 ?

3voto

Chris Watts Points 243

J'ai rencontré le même problème :

Editar /etc/modprobe.d/blacklist.conf avec :

blacklist ipv6

Y /etc/default/grub avec :

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 console=ttyS0"

Puis update-grub y reboot .

1voto

Mildred Points 815

En fait, docker utilise le pare-feu netfilter pour s'assurer que le service est disponible. lsof ne vous dira rien. Essayez de courir

iptables -L -t nat
ip6tables -L -t nat

Il est toutefois possible que le conteneur n'écoute pas le port spécifié.

Vous pouvez regarder dans votre conteneur pour vous assurer que votre service écoute les ports attendus en utilisant nsenter :

nsenter --net -t PID netstat -ltpn

PID doit être le PID d'un processus en cours d'exécution dans le conteneur, très probablement votre service. --net est d'entrer dans l'espace de noms du réseau. Ensuite, les options de netstat -ltpn est d'énumérer les écoutes ( -l ) TCP ( -t ). Montrer le processus ( -p ), et afficher les numéros de port au format numérique ( -n ).

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