Configurar redes IPv6 para contenedores Docker

·4 min de lectura·

Docker puede asignar direcciones IPv6 a los contenedores conectados a una red bridge. Para probar la conectividad entre el host y los contenedores basta una red local; para exponer un contenedor a otros equipos hacen falta además un prefijo adecuado, rutas y reglas de firewall. Esta guía usa una red bridge definida por el usuario y separa ambos casos [1][2].

Importante: no copies a la configuración una dirección IPv6 pública de otro servidor. Usa un prefijo ULA para una red privada o el prefijo global que tu proveedor haya delegado para tu red de contenedores.

IPv6 privado o enrutable

Una dirección ULA pertenece al espacio privado fd00::/8: sirve para comunicación interna y no se enruta por Internet. Una dirección global debe proceder del prefijo que el proveedor o administrador de red haya asignado y requiere una ruta hacia la red bridge. Activar IPv6 en Docker, por sí solo, no crea esa ruta [1][2].

Docker puede asignar direcciones ULA automáticamente cuando IPv6 está habilitado y no se especifica otro pool. Para un ejemplo controlado, crearemos explícitamente una red IPv6 de usuario [1]:

docker network create \
  --ipv6 \
  --subnet fd42:62ab:9e12:1::/64 \
  red-ipv6

El prefijo ULA del ejemplo es ilustrativo. En una red propia, genera un prefijo ULA único para evitar solapamientos con otras redes conectadas.

Ejecutar un contenedor y comprobar la red

Publica el servicio de prueba solo en el loopback IPv6 del host. Así se puede comprobar desde el propio host sin abrirlo a otros equipos:

docker run -d \
  --name web-prueba-ipv6 \
  --network red-ipv6 \
  -p '[::1]:8080:80' \
  nginx:alpine

Consulta la dirección asignada y comprueba la respuesta local:

docker network inspect red-ipv6
curl -g -6 'http://[::1]:8080'

En Docker Engine anterior a la versión 28 hay una salvedad: otros equipos del mismo segmento de capa 2 podrían alcanzar puertos publicados en loopback. No uses este método como único control de acceso en esas versiones [2].

Para retirar el contenedor y la red de prueba:

docker rm -f web-prueba-ipv6
docker network rm red-ipv6

Publicar un servicio con IPv6 global

Para acceso desde otras redes, sustituye el prefijo del ejemplo por el prefijo global que tu proveedor haya delegado y crea una red configurada para enrutamiento directo IPv6 [1][2]:

docker network create \
  --ipv6 \
  --subnet 2001:db8:1::/64 \
  -o com.docker.network.bridge.gateway_mode_ipv6=routed \
  red-ipv6-publica

2001:db8:1::/64 está reservado para documentación y no es enrutable en Internet. Debes reemplazarlo por el prefijo real asignado a tu red; no uses un prefijo ULA para este caso.

Publica el puerto del contenedor para IPv6 y comprueba su dirección con docker network inspect:

docker run -d \
  --name web-publica-ipv6 \
  --network red-ipv6-publica \
  -p '[::]::80' \
  nginx:alpine

En modo routed, los clientes acceden al puerto 80 de la dirección IPv6 del contenedor; no se crea una traducción al puerto 8080 del host. Para que funcione desde fuera, la red externa debe tener una ruta hacia el prefijo de los contenedores y el firewall debe permitir el tráfico previsto [2].

Diagnóstico básico

Si no hay conectividad, revisa los puntos siguientes antes de cambiar la configuración del host:

  1. Comprueba que el daemon de Docker admite IPv6 y que la red se creó con --ipv6.
  2. Consulta docker network inspect red-ipv6 para verificar el prefijo y la dirección del contenedor.
  3. Comprueba que el puerto publicado corresponde al modo de red elegido. Con modo nat, Docker publica el puerto en el host; con modo routed, el cliente remoto necesita una ruta hasta la dirección del contenedor [2].
  4. Revisa el firewall del host y las rutas del router. Docker gestiona reglas de filtrado para sus redes; una regla añadida a una cadena equivocada puede no filtrar el tráfico como se esperaba [3].
  5. Si se modifica /etc/docker/daemon.json, valida el JSON y planifica el reinicio de Docker: reiniciar el daemon afecta a los contenedores en ejecución [1].

No desactives ip6tables para intentar resolver un problema de conectividad: Docker lo usa para el aislamiento y el mapeo de puertos en redes bridge [1][3].

En resumen

  • Una red bridge definida por el usuario puede asignar direcciones IPv6 a los contenedores.
  • Las direcciones ULA permiten comunicación interna; para acceso externo se necesita un prefijo global y una ruta.
  • -p publica puertos y puede hacerlos accesibles desde fuera del host. Limita la publicación cuando el servicio no deba ser público.
  • En modo routed, el tráfico llega a la dirección del contenedor y requiere enrutamiento y reglas de firewall correctas.

📚 Fuentes consultadas

  1. Use IPv6 networking — Docker Docs
  2. Port publishing and mapping — Docker Docs
  3. Docker with iptables — Docker Docs

Imagen

Red bridge IPv6 para contenedores Docker

¿Te ha resultado útil?

Compártelo con tu red de contactos profesionales.

Comentarios (0)

Sé el primero en comentar.