Crear una xarxa Docker personalitzada i controlar-ne l’accés amb firewalld


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.

,