Aislamiento de redes en Docker
Qué cubre este artículo sobre aislamiento de redes en Docker
- Puentes estándar y redes personalizadas.
- Redes internas sin comunicación externa.
- Segmentación de redes en Compose.
- Ventajas de seguridad del aislamiento.
- Consejos para arquitecturas de red limpias.
Introducción: Aislamiento de redes en Docker
En Docker, muchos contenedores se ejecutan frecuentemente en el mismo host. Sin aislamiento, los contenedores pueden verse entre sí, hacer ping y comunicarse a través de puertos abiertos. Para configuraciones sensibles a la seguridad, esto es problemático. Docker ofrece diferentes tipos de redes que permiten separar contenedores los unos de los otros. Si colocas bases de datos, APIs y contenedores web públicos en redes separadas, reduces el riesgo y obtienes una infraestructura más clara.
Este artículo muestra cómo aislar redes en Docker.
Conceptos clave
- Bridge: Tipo de red estándar en Docker.
- Overlay: Red para clústeres Swarm.
- Host: El contenedor utiliza la red del host.
- None: Sin red.
- Red interna: Sin comunicación externa.
- Segmentación: División en áreas lógicas de red.
- Microsegmentación: Aislamiento fino por servicio.
- Bridge predeterminado: Red estándar de Docker.
Bridge estándar
Por defecto, todos los contenedores se ejecutan en la red bridge. Pueden alcanzarse mutuamente por IP, siempre que no haya firewall entre ellos. Es conveniente, pero inseguro.
docker network ls
Red personalizada
docker network create app-net
Los contenedores solo en esta red pueden alcanzarse por nombres DNS:
docker run -d --name web --network app-net nginx
docker run -d --name db --network app-net postgres
Red interna
Las redes internas no tienen acceso externo:
docker network create --internal backend-net
Los contenedores en una red interna no pueden acceder a Internet. Ideal para bases de datos o APIs internas.
Ejemplo con Compose
services:
web:
image: nginx
networks:
- frontend
app:
image: mein-app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
driver: bridge
backend:
internal: true
La base de datos es accesible solo a través de app, no directamente desde frontend.
No publicar puertos
Solo los contenedores que deben ser accesibles desde el exterior reciben puertos:
services:
db:
image: postgres
networks:
- backend
# Sin ports aquí
Sin Internet para ciertos contenedores
Con network_mode: none:
services:
batch:
image: batch-processor
network_mode: none
O mediante reglas iptables específicas.
Seguridad a través del aislamiento
- Las bases de datos no son directamente accesibles.
- Las APIs internas están protegidas.
- Menor superficie de ataque.
- Reglas más simples para firewalls y proxy inverso.
- El malware en un contenedor se propaga más lentamente.
Proxy inverso como punto de entrada
Un Traefik o nginx accesible públicamente dirige las solicitudes a la red correcta. Los servicios detrás no necesitan sus propios puertos públicos.
Consejos
- Una red para cada área lógica.
- Bases de datos en la red backend interna.
- No publicar todos los puertos.
- Complementar con firewall en el host.
- Logging y monitoring en todas las redes.
- Permitir solo las conexiones necesarias.
Errores comunes
- Contenedor en la red equivocada: Verifica la accesibilidad.
- DNS no funciona: Las redes personalizadas proporcionan DNS, el bridge predeterminado no.
- Redes internas y actualizaciones: El contenedor no puede descargar paquetes.
- Puertos publicados en el lugar incorrecto: Brecha de seguridad.
- Regla de firewall incorrecta: El contenedor sigue siendo accesible.
Enlaces y recursos adicionales
- BotServ.de Docker Netzwerk
- BotServ.de Docker Ressourcenlimits
- BotServ.de Docker Sicherheit
- BotServ.de Docker Reverse Proxy
FAQ: Aislamiento de redes en Docker
¿Están aislados los contenedores Docker en la misma red? No, por defecto pueden alcanzarse mutuamente.
¿Qué es una red interna? Una red sin conexión externa, por ejemplo para bases de datos.
¿Necesito una red para cada servicio? Con varios servicios, la segmentación tiene sentido, pero no es obligatoria.
¿Puedo desconectar completamente un contenedor de la red?
Sí, con network_mode: none.
¿Cómo accede un contenedor a Internet? En el bridge estándar o en una red personalizada, no en una red interna.
Fuentes y lecturas adicionales
- Docker Network: https://docs.docker.com/network/
- Compose Networks: https://docs.docker.com/compose/networking/
- Bridge vs Overlay: https://docs.docker.com/network/bridge/
Resumen: Aislamiento de redes en Docker
El aislamiento de redes en Docker es una medida de seguridad simple pero efectiva. Las redes personalizadas e internas separan lógicamente los contenedores entre sí. Las bases de datos y APIs internas pertenecen al backend, los servicios públicos al frontend. Si publicas puertos con moderación y no expones la red externa en todas partes, reduces la superficie de ataque y mantienes tu infraestructura clara.


