Aucune connectivité IPv6 à partir du conteneur Docker

11

J'ai de sérieux problèmes pour activer IPv6 dans Docker.

Environnement

  • L'hôte exécute Debian Jessie.
  • C'est un serveur virtuel (KVM).
  • eth0 a une adresse configurée statiquement comme w: x: y: z :: 1 dans un réseau comme w: xy: z :: / 64, qui est attribuée à mon par mon hébergeur.
  • Mon hôte est capable d'utiliser IPv6 sans aucun problème: Pinging le monde extérieur fonctionne, un site Web fonctionnant sur un conteneur (Port 80 lié à l'hôte: 80) est accessible via ipv6.

Problème

Je ne peux cependant pas accéder au monde extérieur depuis l'intérieur des conteneurs! Mon pont docker0 n'a PAS d'adresse IPv6 après le redémarrage de docker avec les paramètres ci-dessous. Il n'y a pas de route ni de passerelle non plus (cela n'a pas de sens sans une adresse ipv6).

Ma configuration Docker: Docker est démarré avec ces paramètres dans DOCKER_OPTS

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=w:x:y:z:a::/80"

Certains paramètres de configuration d'hôte ipv6:

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

voici l'un des réseaux que j'ai créés moi-même:

root@wopr:~# docker network inspect wopr6
[
    {
        "Name": "wopr6",
        "Id": "ddc192d4af2a8edc809975e84cf3e4cb82c24d4cfe970dd8e3fc7d6ff31e20ee",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.23.0.0/16",
                    "Gateway": "172.23.0.1/16"
                },
                {
                    "Subnet": "w:x:y:z:a:0:0:0/80",
                    "Gateway": "w:x:y:z:a::1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "dff30ab1496a4c3689ad6da0837fdb6cf7ea1a5b32312116214313b5b14ed07e": {
                "Name": "happy_varahamihira",
                "EndpointID": "8cd4ed4b91d8421171ec8cc771bbe7b7d81f05dc9f4679f20c642c2e828ec475",
                "MacAddress": "02:42:ac:17:00:02",
                "IPv4Address": "172.23.0.2/16",
                "IPv6Address": "w:x:y:z:a::2/80"
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Voici quelques informations de l'intérieur du conteneur, qui sont mentionnées ci-dessus:

Adresses

root@dff30ab1496a:/# ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
332: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet6 2a03:4000:6:2158:a::2/80 scope global nodad
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe17:2/64 scope link
       valid_lft forever preferred_lft forever

Itinéraires

root@dff30ab1496a:/# ip -6 r
2a03:4000:6:2158:a::/80 dev eth0  proto kernel  metric 256
fe80::/64 dev eth0  proto kernel  metric 256
default via 2a03:4000:6:2158:a::1 dev eth0  metric 1024

Ping

PING ipv6.l.google.com (2a00:1450:4001:811::200e): 56 data bytes, id 0x0011 = 17
--- ipv6.l.google.com ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

Qu'est-ce que je rate?

lajuette
la source

Réponses:

5

Donc, après avoir attendu deux semaines pour une réponse et recherché quelques heures après avoir ouvert une prime, j'ai trouvé la solution.

  1. Configurer un nouveau réseau compatible IPv6 et attribuer un sous-réseau à ma disposition (a / 80 de mon / 64)

    docker network create --ipv6 --subnet=w:x:y:z:aaaa::/80 myfancynetwork
    

    Maintenant, démarrez un conteneur et connectez-le au nouveau réseau. Découvrez son adresse IP. Disons que c'est w: x: y: z: aaaa :: 5 dans cet exemple.

  2. Activer proxy_ndp

    sysctl net.ipv6.conf.eth0.proxy_ndp=1
    

    Vous pouvez également configurer ce paramètre via /etc/sysctl.conf, pour le rendre persistant.

  3. Ajouter un proxy pour que mon hôte (IPv6 activé) réponde aux messages de sollicitation de voisin de mon routeur (comme: "hey, qui héberge w: x: y: z: aaaa :: 5?") Avec des messages de publicité de voisin ("qui être moi!").

    ip -6 neigh add proxy w:x:y:z:aaaa::5 dev eth0
    

    ndppd peut vous aider à publier automatiquement tous les hôtes de votre réseau.

Bam, c'est ça.

lajuette
la source
Vous pouvez installer le ndppddémon pour automatiser cela.
Michael Hampton
1
@MichaelHampton: C'est exactement ce que j'ai suggéré.
lajuette