Implement Lab 02 with Docker bridge networks simulating VPC/Subnets. Test Infrastructure (RED phase): - 6 bash test scripts for network creation, isolation, INF-02 compliance - Fail-fast orchestration with run-all-tests.sh - Quick validation script for development Documentation (Diátaxis framework): - 3 tutorials: VPC creation, container deployment, isolation verification - 4 how-to guides: create network, inspect config, test isolation, cleanup - 3 reference docs: Docker network commands, Compose syntax, VPC mapping - 1 explanation: Docker ↔ VPC parallels (PARA-01/02/03/04) Infrastructure (GREEN phase): - docker-compose.yml with VPC networks (10.0.1.0/24, 10.0.2.0/24) - 5 services: web, app, db, test-public, test-private - INF-02 compliant: 127.0.0.1 bindings only, no 0.0.0.0 - Private network with --internal flag - Multi-homed app container (public + private networks) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.9 KiB
Tutorial: Verificare l'Isolamento delle Reti VPC
In questo tutorial imparerai a verificare e testare l'isolamento tra le reti Docker bridge, confermando che la tua architettura VPC multi-tier funziona correttamente.
Obiettivo
Verificare che:
- I container nella stessa rete possono comunicare
- I container in reti diverse NON possono comunicare (isolamento)
- Il DNS funziona entro la stessa rete
- I container multi-homed possono raggiungere entrambe le reti
Prerequisiti
- Completati Tutorial 1 e Tutorial 2
- Container in esecuzione:
docker compose psmostra 3 container attivi
Passo 1: Verificare i Container in Esecuzione
Esegui:
cd ~/laboratori-cloud/labs/lab-02-network
docker compose ps
Assicurati che lab02-web, lab02-app, e lab02-db siano "Up".
Se non lo sono:
docker compose up -d
Passo 2: Test Comunicazione Stessa Rete
I container nella stessa rete devono potersi comunicare.
Esegui:
# Verifica: app puo raggiungere web (stessa rete pubblica)
docker exec lab02-app ping -c 2 lab02-web
Atteso:
PING lab02-web (10.0.1.10): 56 data bytes
64 bytes from 10.0.1.10: seq=0 ttl=64 time=0.123 ms
64 bytes from 10.0.1.10: seq=1 ttl=64 time=0.045 ms
--- lab02-web ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
SUCCESS = Comunicazione funziona nella stessa rete.
Passo 3: Test Comunicazione Cross-Rete (DEVE FALLIRE)
Verifica che l'isolamento funzioni.
Esegui:
# Verifica: web NON puo raggiungere db (reti diverse)
docker exec lab02-web ping -c 2 lab02-db
Atteso:
ping: bad address 'lab02-db'
Oppure:
PING lab02-db (10.0.2.10): 56 data bytes
--- lab02-db ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
FALLIMENTO ATTESO = Isolamento funzionante!
Questo e corretto: lab02-web (10.0.1.10) non puo raggiungere lab02-db (10.0.2.10) perche sono in reti diverse.
Passo 4: Test Container Multi-Homed
Il container lab02-app e connesso a entrambe le reti.
Esegui:
# Verifica: app puo raggiungere web (stessa rete pubblica)
docker exec lab02-app ping -c 2 lab02-web
Atteso: SUCCESSO
Esegui:
# Verifica: app puo raggiungere db (stessa rete privata)
docker exec lab02-app ping -c 2 lab02-db
Atteso: SUCCESSO
Questo dimostra che lab02-app puo fungere da ponte tra le reti.
Passo 5: Test DNS Resolution
Verifica che il DNS funzioni entro la stessa rete.
Esegui:
# Test DNS nella stessa rete
docker exec lab02-app nslookup lab02-web
Atteso:
Name: lab02-web
Address 1: 10.0.1.10
Esegui:
# Test DNS cross-rete (dovrebbe fallire)
docker exec lab02-web nslookup lab02-db
Atteso: Fallisce o restituisce errore
Passo 6: Test Accesso da Host
Verifica INF-02 compliance: servizi privati non accessibili dall'host.
Esegui:
# Test accesso web (pubblico, ma solo localhost)
curl http://127.0.0.1:8080
Atteso: SUCCESSO (HTML response)
Esegui:
# Test accesso app
curl http://127.0.0.1:8081
Atteso: SUCCESSO
Esegui:
# Test accesso database (privato - NON deve funzionare)
curl http://127.0.0.1:5432
Atteso:
curl: (7) Failed to connect to 127.0.0.1 port 5432 after X ms: Connection refused
Questo e corretto! Il database e nella rete privata senza porte esposte.
Passo 7: Test Isolamento Internet (Rete Privata)
La rete privata con flag --internal non puo raggiungere internet.
Esegui:
# Test database non puo raggiungere internet
docker exec lab02-db ping -c 1 -W 1 8.8.8.8
Atteso: FALLISCE (nessuna route verso internet)
Questo e corretto per una subnet privata cloud.
Passo 8: Test Container di Isolamento
Usa lo script di test del lab.
Esegui:
bash tests/02-isolation-verification-test.sh
Questo script verifica automaticamente tutti i casi di isolamento.
Matrice di Connettività
| Source | Target | Stesso Network | Risultato |
|---|---|---|---|
| web (10.0.1.10) | app (10.0.1.20) | Si (vpc-public) | SUCCESSO |
| app (10.0.1.20) | db (10.0.2.10) | Si (vpc-private) | SUCCESSO |
| web (10.0.1.10) | db (10.0.2.10) | No | FALLISCE |
| db (10.0.2.10) | web (10.0.1.10) | No | FALLISCE |
| Host (127.0.0.1) | web (8080) | Port mapping | SUCCESSO |
| Host (127.0.0.1) | db (5432) | Nessun mapping | FALLISCE |
| db | Internet (8.8.8.8) | --internal flag | FALLISCE |
Verifica
Hai completato questo tutorial quando:
- Container nella stessa rete comunicano
- Container in reti diverse sono isolati (ping fallisce)
- Container multi-homed raggiungono entrambe le reti
- DNS risolve i nomi nella stessa rete
- Servizi privati non accessibili dall'host
- Rete privata non raggiunge internet
Prossimi Passi
- Esegui la verifica finale:
bash tests/99-final-verification.sh - Leggi Explanation: Parallelismi VPC
- Procedi al Lab 03: Compute & EC2
Troubleshooting
Problema: Tutti i ping funzionano (nessun isolamento)
Causa: Container potrebbero essere nella rete di default bridge
Soluzione:
# Verifica reti dei container
docker inspect lab02-web --format '{{json .NetworkSettings.Networks}}'
# Devono mostrare solo lab02-vpc-public, non "bridge"
Problema: lab02-app non puo raggiungere nessuno
Causa: IP statici potrebbero entrare in conflitto
Soluzione:
# Ricrea senza IP statici
docker compose down
# Rimuovi ipv4_address dal compose
docker compose up -d
Problema: DNS non funziona
Soluzione:
# Verifica configurazione DNS container
docker exec lab02-app cat /etc/resolv.conf
# Dovrebbe mostrare 127.0.0.11 (Docker embedded DNS)
Problema: Container web non si avvia
Soluzione:
# Verifica logs
docker compose logs web
# Verifica che la porta non sia in uso
ss -tlnp | grep 8080