Tagging 802.1Q, trunk, access port, inter-VLAN routing e "perché non pinga tra una VLAN e l'altra". Spoiler: manca il routing.
"Tanto tagliamo la rete con le VLAN" — sì, finché non scopri che il broadcast storm passa lo stesso perché qualcuno ha lasciato VLAN 1 ovunque.
Versione veloce: prendere uno switch fisico e fingere che siano tanti switch separati. Tutto qui. Il resto sono dettagli che ti faranno bestemmiare.
Uno switch senza VLAN è una sala riunioni unica: tutti sentono tutti, e quando qualcuno urla (broadcast) si gira mezza palazzina. Le VLAN sono pareti divisorie virtuali: stesso edificio, stessi cavi, ma stanze separate. Per parlare tra una stanza e l'altra serve uscire e passare dal corridoio (il router). Se non c'è il corridoio, non parli. Se il corridoio è chiuso, idem.
Una VLAN (Virtual LAN) è un dominio di broadcast logico definito a livello 2. Lo switch tiene una tabella che associa ogni porta (e/o ogni MAC) a un VLAN ID (1-4094). I frame di una VLAN non vengono mai consegnati a porte di un'altra VLAN, anche se sono sullo stesso chip.
Standard: IEEE 802.1Q. Tutto il resto (PVST, MVRP, GVRP, VTP) è ornamento o roba proprietaria Cisco di cui puoi felicemente non sapere nulla finché qualcuno non ti ci costringe.
Meno traffico inutile, meno collisioni logiche, meno storm.
Camere IP, NAS, IoT, ospiti: ognuno nella sua bolla. La stampante non parla col PLC.
Uno switch da 24 porte invece di 4 switch da 8. Stessi cavi, stesse patch.
Sposti un utente da una VLAN all'altra cambiando una riga di config, non strappando cavi.
4 byte aggiunti al frame Ethernet che cambiano la vita. Letteralmente: il tuo MTU passa da 1500 a 1504 e qualcosa, da qualche parte, esplode.
Il tag 802.1Q si infila tra il SRC MAC e l'EtherType. È fatto così:
TPID (16 bit) = 0x8100 # Tag Protocol Identifier — "ehi sono un tag"
PCP ( 3 bit) # Priority Code Point — QoS, valori 0-7
DEI ( 1 bit) # Drop Eligible Indicator — "scartami se devi"
VID (12 bit) # VLAN ID — 0-4095, ma 0 e 4095 sono riservati
# Risultato: 4094 VLAN utilizzabili (1-4094).
# Se ti servono di più: QinQ (802.1ad) = doppio tag.
jumbo frame nelle impostazioni se devi anche fare jumbo + VLAN.
Il 90% dei problemi VLAN nasce qui. Dimentichi di mettere una porta in trunk, oppure tagghi cose che non vanno taggate. Benvenuto.
Porta che parla con un solo dispositivo (PC, stampante, telecamera, AP non gestito) e appartiene a una sola VLAN.
interface GigabitEthernet0/5
switchport mode access
switchport access vlan 20
Porta che trasporta più VLAN insieme. Si usa tra switch e switch, tra switch e router/firewall, tra switch e hypervisor.
chmod 777.interface GigabitEthernet0/24
switchport mode trunk
switchport trunk allowed vlan 10,20,30,40
switchport trunk native vlan 999
La feature di compatibilità che è diventata il vettore preferito di chi vuole fare VLAN hopping a casa tua.
Su un trunk, i frame escono taggati. Eccezione: i frame della native VLAN escono untagged. Serviva per retrocompatibilità con dispositivi vecchi che non capivano 802.1Q.
Default Cisco: native VLAN = 1. Default di mezzo mondo: native VLAN = 1. Risultato: tutti hanno la stessa, e questo è un problema.
Lo schema che useresti tu in casa, in ufficio o in un piccolo ambiente. Non serve avere 50 VLAN. Ne bastano 5-7 fatte bene.
| VLAN | Nome | Subnet | Cosa ci sta |
|---|---|---|---|
| 10 | MGMT | 10.0.10.0/24 | Switch, AP, IPMI, console — solo admin |
| 20 | LAN | 10.0.20.0/24 | PC, laptop, dispositivi fidati |
| 30 | SERVER | 10.0.30.0/24 | NAS, server, host VM |
| 40 | IOT | 10.0.40.0/24 | Smart TV, Alexa, lampadine, robot aspirapolvere |
| 50 | CAM | 10.0.50.0/24 | Telecamere e NVR — niente internet uscente |
| 60 | GUEST | 10.0.60.0/24 | Wi-Fi ospiti — solo internet, zero LAN |
| 999 | BLACKHOLE | — | Native VLAN dei trunk. Niente dispositivi. |
Default: tutto bloccato tra VLAN. Poi apri solo quello che serve. Il modello è quello del firewall, non del "vediamo cosa rompe".
# MGMT → tutto: PERMIT (è la rete di chi gestisce)
# LAN → SERVER: PERMIT solo porte necessarie (SMB, HTTPS, ecc.)
# LAN → IOT/CAM: PERMIT in uscita per controllo, REJECT viceversa
# IOT → internet: PERMIT (purtroppo serve per gli aggiornamenti)
# IOT → LAN/SERVER/MGMT: DENY
# CAM → internet: DENY (le telecamere cinesi non hanno NUOVI casi d'uso)
# GUEST → solo internet, DENY tutto il resto (anche client isolation sull'AP)
Le VLAN non si parlano da sole. Per definizione. Se due dispositivi in VLAN diverse "non si pingano", è una feature, non un bug.
Un router con una sola interfaccia trunk verso lo switch. Sub-interface per ogni VLAN. Semplice, comune nei lab e nelle PMI. Bottleneck: tutto il traffico inter-VLAN passa per quel cavo.
Lo switch fa anche routing. Crei SVI (Switch Virtual Interface) per ogni VLAN, ognuna con il suo IP gateway. Il routing avviene in hardware, alla velocità del backplane. È quello che vuoi se hai più di 3 VLAN serie.
Tipico setup home/PMI: un pfSense / OPNsense / OpenWrt riceve un trunk dallo switch e fa routing + firewall tra le VLAN. Lento se è un mini-PC scarso, ma flessibile e si filtra tutto in un punto solo.
Un kernel Linux e una NIC normale fanno tutto. Switch L3 fai-da-te in 4 comandi. vconfig è morto, viva iproute2.
# crea una sub-interface VLAN 20 sopra eth0
ip link add link eth0 name eth0.20 type vlan id 20
# assegna IP e tira su
ip addr add 10.0.20.1/24 dev eth0.20
ip link set eth0.20 up
# non scordarti la fisica
ip link set eth0 up
# verifica che il tag stia funzionando
ip -d link show eth0.20
# cerca: vlan protocol 802.1Q id 20
network:
version: 2
ethernets:
eth0:
dhcp4: no
vlans:
eth0.20:
id: 20
link: eth0
addresses: [10.0.20.10/24]
gateway4: 10.0.20.1
nameservers:
addresses: [10.0.10.1]
eth0.30:
id: 30
link: eth0
addresses: [10.0.30.10/24]
tcpdump -i eth0 -e vlan. Se sniffi sulla sub-interface (eth0.20) il tag non lo vedi (è già stato tolto). Se sniffi sulla fisica (eth0) lo vedi. Tienilo a mente, ti farà risparmiare ore.
Il modo standard di gestire VLAN in casa o in piccoli uffici: una NIC, un trunk, e tutto il routing/firewall in un solo posto. E sì, le regole si scrivono cliccando.
L'idea è semplice: una sola interfaccia fisica (es. igb1) di pfSense viene collegata via trunk a uno switch managed. Su quell'interfaccia crei tante interfacce VLAN quante ne servono. Ogni VLAN diventa un'interfaccia logica con il suo IP, il suo DHCP, le sue regole.
[pfSense]
├─ igb0 ─── WAN (modem fibra)
└─ igb1 ─── TRUNK ─── [Switch managed] ─── porte access per VLAN 10/20/30/40/60
└── porta access untagged per AP Wi-Fi (se l'AP non gestisce VLAN)
└── porta trunk verso AP managed (UniFi/Mikrotik) per multi-SSID
igb1. VLAN tag: 20. Description: LAN. Salva. Ripeti per ogni VLAN.LAN_UFFICI), tipo Static IPv4, IP del gateway di quella subnet (es. 10.0.20.1/24). Salva e applica.10.0.20.100-10.0.20.200), gateway, DNS. Salva.Il pattern che funziona quasi sempre: blocca prima il traffico verso le altre VLAN, poi permetti tutto verso internet. Le regole si valutano dall'alto in basso, prima match vince.
# 1) permetti accesso ai DNS del firewall stesso
PASS proto tcp/udp source LAN_UFFICI net dest This Firewall port 53
# 2) blocca verso tutte le altre VLAN private (alias "RFC1918_LOCAL")
BLOCK proto any source LAN_UFFICI net dest RFC1918_LOCAL
# 3) permetti tutto il resto (= internet)
PASS proto any source LAN_UFFICI net dest any
Trucco con gli alias: crea un alias RFC1918_LOCAL con dentro 10.0.10.0/24, 10.0.30.0/24, 10.0.40.0/24… Poi una sola regola di block li copre tutti. Quando aggiungi una VLAN, aggiorni l'alias e le regole continuano a funzionare. Aliases → Firewall → Add.
Se hai un access point decente (UniFi, Mikrotik, OpenWrt, Aruba Instant On), puoi avere un SSID per la LAN e un SSID per gli ospiti, ognuno mappato su una VLAN diversa. L'AP riceve un trunk dallo switch con tutte le VLAN che gli servono, e tagga il traffico Wi-Fi sulla VLAN corrispondente al SSID.
CasaLAN → VLAN 20 (LAN_UFFICI)Ospiti → VLAN 60 (GUEST) — con client isolation attivaIoT → VLAN 40 (IOT) — separato perché non vuoi che la lampadina cinese ti sniffi i pacchettipfctl -d da console fisica per disabilitare temporaneamente il firewall. Morale: tieni sempre un cavo console pronto quando rifai il networking.
Proxmox, KVM, Docker. Far passare le VLAN dentro le VM è la cosa che ti fa scoprire perché la tua NIC supporta SR-IOV (o non lo supporta).
Su Proxmox basta abilitare VLAN aware sul bridge (vmbr0) e poi specificare il VLAN tag per ogni VM nelle impostazioni di rete della stessa. Il bridge si comporta come uno switch managed.
auto vmbr0
iface vmbr0 inet manual
bridge-ports eno1
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
# Poi nella GUI Proxmox: VM → Hardware → Network → Tag = 20
Docker ha un driver macvlan e un driver ipvlan L2 per dare ai container un IP "vero" sulla LAN, opzionalmente su una VLAN specifica.
docker network create -d macvlan \
--subnet=10.0.40.0/24 \
--gateway=10.0.40.1 \
-o parent=eth0.40 \
iot_net
docker run --network=iot_net --ip=10.0.40.50 myapp
Le VLAN sono un meccanismo di segmentazione, non di sicurezza forte. Sono solo etichette su un frame. Senza misure aggiuntive, "ho messo l'IoT in una sua VLAN" significa poco.
Se una porta è in modalità auto/dynamic trunk (DTP, roba Cisco), un attaccante può fingere di essere uno switch e negoziare un trunk. A quel punto vede tutte le VLAN.
Mitigazione: mai lasciare le porte in DTP auto. Tutte le porte utente in switchport mode access esplicito + switchport nonegotiate.
Vedi capitolo 04. Funziona solo se la native VLAN del trunk uplink coincide con la VLAN dell'attaccante.
Mitigazione: native VLAN dedicata e mai usata, o vlan dot1q tag native.
Perché "non funziona" è una diagnosi incompleta. Ecco i sintomi più comuni e dove guardare prima.
| Sintomo | Causa probabile |
|---|---|
| "Non prende IP" su una porta | Access port nella VLAN sbagliata, o DHCP server non raggiungibile dalla VLAN (manca ip helper-address / DHCP relay). |
| Prende IP ma non naviga | Default gateway non risponde (SVI mancante), oppure regola firewall che blocca verso WAN. |
| Pinga il gateway ma non altre VLAN | Inter-VLAN routing assente, oppure regole firewall che bloccano. Probabilmente è normale e voluto. |
| Funziona solo per alcune VLAN | Trunk con allowed vlan incompleto. La VLAN che non funziona non è nella lista. |
| Tutto rallenta dopo un cambio di config | Probabile loop L2 perché STP è stato disabilitato o c'è un bridge VLAN-aware mal configurato. |
| Le VM Proxmox non vedono la VLAN | bridge-vlan-aware non attivo, oppure tag mancante nelle impostazioni della VM. |
| Sniffi su eth0 ma non vedi tag | Stai sniffando sulla sub-interface, non sulla parent. Oppure il driver toglie i tag prima. |
| Tutto va, tranne il telefono VoIP | QoS / CoS sul tag 802.1Q non rispettato. Oppure il telefono si aspetta CDP/LLDP per scoprire la voice VLAN. |
I comandi che userai davvero, e qualcuno che non userai mai ma fa scena al colloquio.
# crea VLAN
ip link add link eth0 name eth0.20 type vlan id 20
# elenca tutte le VLAN sull'host
ip -d link show | grep -A1 vlan
# cattura solo frame con VLAN tag
tcpdump -i eth0 -e vlan
# filtra per VLAN specifica
tcpdump -i eth0 -e vlan 20
# decodifica un singolo frame nei dettagli
tcpdump -i eth0 -e -vvv -X vlan
# ho un IP?
ip -br addr
# sono nella VLAN che credo? guarda il primo broadcast
tcpdump -i eth0 -nn -e -c 5
# pingo il gateway?
ping -c 3 10.0.20.1
# risolvo DNS?
dig @10.0.10.1 google.com
# traceroute per capire dove si ferma
mtr 1.1.1.1