Principio Architetturale Fondamentale: Nessun componente dell'infrastruttura utilizza simulazione o emulazione software. Tutti i protocolli di rete, le tabelle di routing, le operazioni di switching e il forwarding dei pacchetti sono eseguiti mediante stack software reali che operano su interfacce di rete virtuali ma funzionalmente identiche a quelle hardware. Questo approccio garantisce che il comportamento osservato dagli studenti sia identico a quello che riscontrerebbero su apparati fisici Cisco o altri vendor enterprise.
name: full-lab
topology:
nodes:
r1:
kind: linux
image: frrouting/frr:latest
exec:
- ip addr add 10.0.0.1/30 dev eth1
- sysctl -w net.ipv4.ip_forward=1
r2:
kind: linux
image: frrouting/frr:latest
exec:
- ip addr add 10.0.0.2/30 dev eth1
- sysctl -w net.ipv4.ip_forward=1
links:
- endpoints: ["r1:eth1", "r2:eth1"]clab deploy, destroy, inspect) consentono di avviare, terminare e ispezionare i laboratori, facilitando il reset rapido tra sessioni didattiche.Razionale della Scelta Architetturale: FRRouting è per il routing IP, non per lo switching L2. Open vSwitch è uno switch L2, non implementa protocolli di routing. Questa separazione netta riflette la realtà delle architetture di rete enterprise, con dispositivi distinti (o logicamente separati) e responsabilità definite nello stack ISO/OSI.
ovs-vsctl, l'utility di gestione di Open vSwitch. Un bridge viene creato e popolato con porte virtuali che rappresentano le interfacce dello switch:# Creazione del bridge
ovs-vsctl add-br sw1
# Aggiunta porte
ovs-vsctl add-port sw1 sw1p1
ovs-vsctl add-port sw1 sw1p2
ovs-vsctl add-port sw1 sw1p3
# Verifica configurazione
ovs-vsctl showovs-vswitchd. Possono essere ispezionati e configurati tramite i tool OVS (ovs-vsctl, ovs-ofctl, ovs-appctl) ma non appaiono nell'elenco dei container ottenibile con docker ps. Questa scelta architetturale è deliberata e riflette la natura fondamentalmente diversa delle funzionalità L2 e L3.ovs-vsctl add-port. Per automatizzare la creazione di switch con molte porte, è possibile utilizzare script bash che iterano sulla creazione delle interfacce:# Script di espansione a 48 porte
for i in $(seq 1 48); do
ovs-vsctl add-port sw1 sw1p$i \
-- set interface sw1p$i type=internal
done
# Verifica numero porte
ovs-vsctl list-ports sw1 | wc -lzebra – Core routing managerospfd – OSPF routing protocolripd – RIP routing protocolstaticd – Static routes managerbgpd – BGP routing protocol (configurazioni avanzate)vtysh (Virtual Teletype Shell). L'interfaccia è strutturata in modalità gerarchiche che replicano il pattern di Cisco IOS:router# enable
router# configure terminal
router(config)# interface eth0
router(config-if)# ip address 192.168.1.1/24
router(config-if)# no shutdown
router(config-if)# exit
router(config)# router ospf
router(config-router)# network 192.168.1.0/24 area 0
router(config-router)# exitrouter# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF
O>* 10.0.1.0/24 [110/20] via 10.0.0.2, eth1, 00:05:23
C>* 10.0.0.0/30 is directly connected, eth1
S>* 0.0.0.0/0 [1/0] via 192.168.1.254, eth0
router# show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
10.0.0.2 1 Full/DR 00:00:35 10.0.0.2 eth1do. FRRouting non supporta questa sintassi: i comandi di visualizzazione (show) devono essere eseguiti dopo essere usciti dalla configuration mode tramite exit o end.router(config)# do show ip routerouter(config)# end seguito da router# show ip router1, r2, r3 tramite useradd). Questi utenti hanno home directory dedicate ma permessi limitati sul filesystem dell'host./etc/passwd per impostare come shell /usr/local/bin/router-shell-r1 invece della bash standard.docker exec -it clab-full-lab-r1 vtysh, attaccando una sessione interattiva al container del router r1 ed eseguendo la CLI vtysh. L'utente si trova immediatamente nel prompt FRR senza mai vedere la shell Linux.exit o quit), lo script wrapper termina e la sessione SSH viene chiusa automaticamente. Questo previene l'accesso indesiderato alla shell Linux dell'host, mantenendo l'isolamento di sicurezza./usr/local/bin/router-shell-r1:#!/bin/bash
# Auto-login script per router r1
# Verifica esistenza container
if ! docker ps | grep -q clab-full-lab-r1; then
echo "Errore: router r1 non disponibile"
exit 1
fi
# Esecuzione vtysh nel container
exec docker exec -it clab-full-lab-r1 vtyshchmod +x) e deve essere registrato come shell valida in /etc/shells.ovs-vsctl, un'utility amministrativa che utilizza una sintassi completamente diversa dagli standard del networking.ovs-vsctl è progettata per amministratori di sistema Linux, non per network engineer. La sua sintassi è orientata alla manipolazione di un database di configurazione (OVSDB) piuttosto che alla configurazione di apparati di rete. Esempi:# Assegnazione VLAN (sintassi OVS)
ovs-vsctl set port sw1p1 tag=10
# Configurazione trunk (sintassi OVS)
ovs-vsctl set port sw1p2 vlan_mode=trunk
ovs-vsctl set port sw1p2 trunks=10,20,30
# Visualizzazione configurazione
ovs-vsctl show#!/usr/bin/env python3
class SwitchCLI:
def __init__(self, switch_name):
self.switch = switch_name
self.mode = "exec"
self.current_interface = None
def parse_command(self, cmd):
if self.mode == "exec":
return self.exec_mode(cmd)
elif self.mode == "config":
return self.config_mode(cmd)
elif self.mode == "config-if":
return self.interface_mode(cmd)def switchport_access_vlan(self, vlan_id):
"""
Traduce: switchport access vlan 10
In: ovs-vsctl set port sw1p1 tag=10
"""
port = self.current_interface
cmd = f"ovs-vsctl set port {self.switch}{port} tag={vlan_id}"
return subprocess.run(cmd, shell=True)Switch> – Modalità di visualizzazione, comandi show disponibili, nessuna configurazioneSwitch# – Accesso a comandi avanzati di diagnostica e configurazione globaleSwitch(config)# – Modalità di configurazione globale dello switchSwitch(config-if)# – Configurazione specifica di un'interfacciaenable, configure terminal, interface gigabitethernet 0/1, exit, replicando esattamente il comportamento di uno switch Cisco reale.interface gigabitethernet 0/1 o int gi0/1). Il prompt cambia in Switch(config-if)# per la configurazione specifica della porta.switchport access vlan 10). Valido solo su porte in modalità access; su trunk port genera errore.vlan 10, vlan 10-20, vlan 10,15,20). Implementa VLAN pruning, riducendo il broadcast domain sulle trunk port.
switches) che facilita la gestione collettiva dei permessi./etc/sudoers, agli utenti del gruppo switches viene concesso il permesso di eseguire solo il comando /usr/bin/ovs-vsctl con privilegi elevati, utilizzando la direttiva NOPASSWD per evitare richieste di password che potrebbero confondere gli studenti./etc/sudoers (o più correttamente, un file dedicato in /etc/sudoers.d/switches) specifica esattamente quali comandi possono essere eseguiti con privilegi elevati:# File: /etc/sudoers.d/switches
# Permessi per utenti switch
# Gruppo switches può eseguire solo ovs-vsctl
%switches ALL=(root) NOPASSWD: /usr/bin/ovs-vsctl
# Blocco esplicito di altri comandi
%switches ALL=(root) !ALLovs-vsctl set port ...ovs-vsctl showovs-vsctl list ...ovs-vsctl del-br (cancellazione bridge)ovs-vsctl add-br (creazione bridge)

r1# (FRR vtysh). Per gli switch: Switch> (wrapper CLI). Non è necessaria alcuna autenticazione aggiuntiva.show ip route, show vlan brief, ping, traceroute) per verificare la corretta implementazione della configurazione e diagnosticare eventuali problemi di connettività. L'output è identico a quello che si otterrebbe su apparati fisici.exit nella CLI. Le configurazioni sono persistenti: riaprendo la stessa connessione in seguito, le configurazioni precedentemente inserite sono ancora presenti (a meno che non sia stato eseguito un reset del laboratorio da parte del docente).
clab destroy seguito da clab deploy per ripristinare l'intero laboratorio allo stato iniziale in circa 2-3 minuti, consentendo di ricominciare l'esercitazione.Conclusione: Il laboratorio realizzato rappresenta una soluzione tecnica robusta, pedagogicamente valida e operativamente sostenibile per la formazione pratica in ambito networking. L'approccio basato su tecnologie reali, pur richiedendo maggiore complessità implementativa rispetto a soluzioni di simulazione, garantisce un'esperienza formativa di qualità superiore e prepara gli studenti ad affrontare con competenza contesti professionali reali. La soluzione è pronta per la valutazione tecnica formale e per il deployment in ambiente di produzione didattica.prof.Brunetti Marco
