Com crear una xarxa Docker personalitzada i controlar-ne l’accés amb firewalld
Quan treballem amb contenidors Docker, sovint ens cal més control sobre la xarxa que utilitzen. Ja sigui per raons de seguretat, segmentació o rendiment, crear una xarxa personalitzada ens dona molta més flexibilitat. A continuació t’explico com fer-ho pas a pas i com protegir-la amb firewalld.
🛠️ Creació d’una xarxa Docker personalitzada
docker network create \
--driver bridge \
--subnet 10.20.30.0/24 \
--gateway 10.20.30.1 \
--opt com.docker.network.bridge.enable_icc=true \
--opt com.docker.network.bridge.enable_ip_masquerade=false \
--opt com.docker.network.bridge.host_binding_ipv4=0.0.0.0 \
--opt com.docker.network.driver.mtu=1500 \
my-docker-network
Què fa això?
--driver bridge
: Utilitzem el controlador per defecte de Docker, que crea una xarxa local aïllada.--subnet
i--gateway
: Definim l’adreçament IP de la nova xarxa. És útil per evitar conflictes amb altres xarxes i tenir control total sobre la segmentació.enable_icc=true
: Permet la comunicació entre contenidors dins la mateixa xarxa. Això pot ser útil en entorns de desenvolupament.enable_ip_masquerade=false
: Evitem que Docker faci NAT (traducció d’adreces), cosa que dona més control sobre la sortida cap a l’exterior.host_binding_ipv4=0.0.0.0
: Permet que els ports exposats dels contenidors estiguin disponibles a qualsevol interfície del host.mtu=1500
: Establim la mida màxima de transmissió de la xarxa, normalment 1500 és l’estàndard i evita problemes amb la fragmentació de paquets.
Aquesta xarxa, anomenada
my-docker-network
, es pot utilitzar en qualsevol contenidor afegint--network my-docker-network
en executar-lo.
🔐 Control d’accés amb firewalld
Un cop creada la xarxa, cal assegurar-nos que el trànsit entre els contenidors i altres serveis estigui controlat. Aquí entra en joc firewalld.
1. Assignem la nova subxarxa a la zona docker
sudo firewall-cmd --permanent --zone=docker --add-source=10.20.30.0/24
Això associa la subxarxa que hem creat a la zona “docker”, de manera que podem definir polítiques específiques per a aquest trànsit.
2. Creem una nova política d’accés
sudo firewall-cmd --permanent --new-policy=docker2world
Definim una política que gestionarà com es mou el trànsit des de la zona docker cap a l’exterior.
3. Assignem la zona d’origen a la política
sudo firewall-cmd --permanent --policy=docker2world --add-ingress-zone=docker
Això indica que la política s’aplicarà al trànsit entrant des de la zona docker.
4. Definim regles d’accés directes a IPs específiques
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -s 10.20.30.0/24 -d 10.29.252.4/32 -j ACCEPT
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -s 10.20.30.0/24 -d 10.29.252.5/32 -j ACCEPT
Aquí permetem explícitament connexions des de la xarxa Docker cap a dues adreces IP concretes. És una forma molt controlada d’obrir trànsit només a serveis autoritzats.
5. Activem la política i el masquerading
sudo firewall-cmd --permanent --policy=docker2world --set-target=ACCEPT
sudo firewall-cmd --permanent --policy=docker2world --add-masquerade
- Establim que, per defecte, el trànsit d’aquesta política sigui acceptat.
- Afegim el masquerading, que permet que els contenidors accedeixin a xarxes externes utilitzant la IP del host (similar a NAT).
6. Apliquem tots els canvis
sudo firewall-cmd --reload
Amb això, firewalld relectura la configuració i activa totes les regles i polítiques que hem afegit.
Beneficis d’aquesta configuració
- Segmentació i seguretat millorada: només els contenidors dins de la xarxa poden parlar amb determinades IPs.
- Evitem NAT innecessari: gràcies a
enable_ip_masquerade=false
, tenim més control i transparència sobre el trànsit de xarxa. - Flexibilitat total: podem gestionar la xarxa Docker com si fos una xarxa física real.