No hay conectividad IPv6 desde el contenedor acoplable

11

Tengo serios problemas para habilitar IPv6 en Docker.

Medio ambiente

  • El anfitrión está ejecutando Debian Jessie.
  • Es un servidor virtual (KVM).
  • eth0 tiene una dirección configurada estáticamente como w: x: y: z :: 1 en una red como w: xy: z :: / 64, que mi empresa de hosting me asignó.
  • Mi host es capaz de usar IPv6 sin ningún problema: hacer ping al mundo exterior funciona, un sitio web que se ejecuta en un contenedor (Puerto 80 vinculado al host: 80) es accesible a través de ipv6.

Problema

¡Sin embargo, no puedo acceder al mundo exterior desde dentro de los contenedores! Mi puente docker0 NO tiene una dirección IPv6 después de reiniciar la ventana acoplable con los siguientes parámetros. No hay ruta ni puerta de enlace tampoco (no tiene sentido sin una dirección ipv6).

Configuración de My Docker: Docker se inicia con estos parámetros en DOCKER_OPTS

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

Algunos parámetros de configuración del host ipv6:

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

Aquí está una de las redes que creé yo mismo:

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": {}
    }
]

Aquí hay información del interior del contenedor, que se menciona anteriormente:

Direcciones

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

Rutas

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

Silbido

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é me estoy perdiendo?

lajuette
fuente

Respuestas:

5

Entonces, después de esperar dos semanas por una respuesta e investigar otras pocas horas después de abrir una recompensa, encontré la solución.

  1. Configure una nueva red habilitada para IPv6 y asigne una subred disponible para mí (a / 80 de mi / 64)

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

    Ahora inicie un contenedor y conéctelo a la nueva red. Descubre su dirección IP. Digamos que es w: x: y: z: aaaa :: 5 en este ejemplo.

  2. Habilitar proxy_ndp

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

    También puede configurar esta configuración a través de /etc/sysctl.conf, para que sea persistente.

  3. Agregue proxy para que mi host (IPv6 habilitado) responda a los mensajes de vecino Sollicitation de mi enrutador (como: "oye, ¿quién aloja w: x: y: z: aaaa :: 5?") Con mensajes de Publicidad de vecinos ("eso sería ¡ser yo!").

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

    ndppd puede ayudarlo a anunciar automáticamente cualquier host en su red.

Bam, eso es.

lajuette
fuente
Puedes instalar el ndppddemonio para automatizar esto.
Michael Hampton
1
@MichaelHampton: Eso es exactamente lo que sugerí.
lajuette