🍺 Buy me a beer
🏷️

VLAN per Svogliati

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.

01 / 12

Cos'è una VLAN (e perché esistono)

Versione veloce: prendere uno switch fisico e fingere che siano tanti switch separati. Tutto qui. Il resto sono dettagli che ti faranno bestemmiare.

💡 L'analogia del condominio

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.

🧠 La definizione tecnica

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.

📡

Segmentazione broadcast

Meno traffico inutile, meno collisioni logiche, meno storm.

🔒

Isolamento

Camere IP, NAS, IoT, ospiti: ognuno nella sua bolla. La stampante non parla col PLC.

💸

Risparmio hardware

Uno switch da 24 porte invece di 4 switch da 8. Stessi cavi, stesse patch.

🧩

Flessibilità

Sposti un utente da una VLAN all'altra cambiando una riga di config, non strappando cavi.

⚠️ VLAN ≠ subnet, anche se in pratica le associ 1:1 La VLAN è L2 (broadcast domain). La subnet è L3 (range IP). Tecnicamente puoi avere due subnet sulla stessa VLAN o una subnet su due VLAN, ma se lo fai meriti il dolore che ne deriverà. Regola: una VLAN = una subnet. Punto.
02 / 12

802.1Q — il tag

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.

📦 Frame Ethernet con tag VLAN

DST MAC6 byte
SRC MAC6 byte
802.1Q TAG4 byte
EtherType2 byte
Payload46-1500 byte
FCS4 byte

Il tag 802.1Q si infila tra il SRC MAC e l'EtherType. È fatto così:

struttura del tag 802.1Q (4 byte = 32 bit)
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.
📏 MTU e i 4 byte in più Il tag aggiunge 4 byte al frame. Ethernet standard: max 1518 byte → con tag 1522 byte. La maggior parte degli switch moderni gestisce questi "baby giant" senza problemi. La maggior parte. Se hai una NIC vecchia o un firmware bizzarro, scoprirai che no. Cerca jumbo frame nelle impostazioni se devi anche fare jumbo + VLAN.
🌀 QinQ / 802.1ad Se hai 4094 VLAN che non bastano (di solito sei un ISP o hai sbagliato qualcosa nella vita), puoi mettere un tag dentro un altro tag. Il tag esterno è S-VLAN (service provider), quello interno C-VLAN (customer). In pratica: dentro casa quasi sempre non ti serve. Sapere che esiste basta.
03 / 12

Access vs Trunk — le due modalità

Il 90% dei problemi VLAN nasce qui. Dimentichi di mettere una porta in trunk, oppure tagghi cose che non vanno taggate. Benvenuto.

🔌 Access Port

Porta che parla con un solo dispositivo (PC, stampante, telecamera, AP non gestito) e appartiene a una sola VLAN.

  • Il dispositivo collegato non sa nulla delle VLAN.
  • I frame entrano untagged, lo switch ci appiccica il tag della VLAN configurata, li smista, e quando escono verso l'access port toglie il tag.
  • Se arriva un frame già taggato su una access port: di default viene scartato. Bene così.
esempio Cisco-style
interface GigabitEthernet0/5
 switchport mode access
 switchport access vlan 20

🌉 Trunk Port

Porta che trasporta più VLAN insieme. Si usa tra switch e switch, tra switch e router/firewall, tra switch e hypervisor.

  • I frame escono taggati con il loro VLAN ID (tranne la native VLAN, vedi prossimo capitolo).
  • Devi specificare quali VLAN sono permesse sul trunk. Non permettere tutto, è la versione network del chmod 777.
  • L'altro lato del cavo deve essere d'accordo: stesso elenco di VLAN, stessa native VLAN. Altrimenti: silenzio + bestemmie.
esempio Cisco-style
interface GigabitEthernet0/24
 switchport mode trunk
 switchport trunk allowed vlan 10,20,30,40
 switchport trunk native vlan 999
Switch a 8 porte — esempio realistico
G0/1access 10
uffici
G0/2access 10
uffici
G0/3access 20
VoIP
G0/4access 20
VoIP
G0/5access 30
guest
G0/6access 30
guest
G0/7trunk
10,20,30
G0/8trunk
→pfSense
04 / 12

Native VLAN — la trappola

La feature di compatibilità che è diventata il vettore preferito di chi vuole fare VLAN hopping a casa tua.

🪤 Cos'è la native VLAN

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.

🚨 VLAN Hopping via double tagging Se la native VLAN del tuo trunk è la stessa VLAN di un attaccante connesso a una access port, lui può forgiare un frame con doppio tag (tag esterno = native, tag interno = la VLAN che vuole raggiungere). Lo switch toglie il tag esterno (perché matcha la native), forwarda il frame con il tag interno e l'attaccante parla con la VLAN protetta. Unidirezionale, ma sufficiente per far danni.

✓ Cosa fare

  • Imposta la native VLAN a un valore non usato (es. 999) — una "black hole VLAN".
  • Non assegnare mai nessuna porta access a quella VLAN.
  • Se lo switch lo supporta, attiva vlan dot1q tag native per taggare anche la native (così niente è untagged).
  • VLAN 1 disabilitata o ridotta al minimo essenziale.

✗ Cosa non fare

  • Lasciare native VLAN = 1 di default ovunque.
  • Usare la native VLAN per traffico utente reale.
  • Mettere un access port nella stessa VLAN della native del trunk dello switch dove sta connesso.
  • Pensare "tanto siamo in LAN, chi vuoi che venga ad attaccarci". L'IoT cinese da 12€ è già dentro.
05 / 12

Design — quante VLAN e come chiamarle

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.

🏠 Schema tipico SOHO/PMI

VLANNomeSubnetCosa ci sta
10MGMT10.0.10.0/24Switch, AP, IPMI, console — solo admin
20LAN10.0.20.0/24PC, laptop, dispositivi fidati
30SERVER10.0.30.0/24NAS, server, host VM
40IOT10.0.40.0/24Smart TV, Alexa, lampadine, robot aspirapolvere
50CAM10.0.50.0/24Telecamere e NVR — niente internet uscente
60GUEST10.0.60.0/24Wi-Fi ospiti — solo internet, zero LAN
999BLACKHOLENative VLAN dei trunk. Niente dispositivi.
💡 Convenzione utile per i numeri Lascia gap tra le VLAN (10, 20, 30...) così se domani ne aggiungi una "vicina" hai spazio. Non usare VLAN ID consecutivi 2,3,4,5 — sembra ordinato ma non lo è. Allinea il terzo ottetto della subnet al VLAN ID (VLAN 20 → 10.0.20.0/24): risparmi ore di mal di testa quando guardi i log.

🧭 Regole di firewall di base tra VLAN

Default: tutto bloccato tra VLAN. Poi apri solo quello che serve. Il modello è quello del firewall, non del "vediamo cosa rompe".

policy minima
# 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)
06 / 12

Inter-VLAN Routing

Le VLAN non si parlano da sole. Per definizione. Se due dispositivi in VLAN diverse "non si pingano", è una feature, non un bug.

🍡

Router-on-a-stick

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.

🧠

L3 Switch (SVI)

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.

🛡️

Firewall come router

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.

⚠️ "Non pinga tra VLAN" — il classico Prima di toccare le ACL, controlla l'ovvio: 1) il client ha il default gateway giusto? 2) il gateway esiste davvero (SVI/sub-interface configurata)? 3) il routing tra le VLAN è abilitato sul dispositivo L3? 4) la regola di firewall esiste e non è dopo un deny più generico? Il 95% dei "non funziona" è uno di questi quattro.
07 / 12

VLAN su Linux

Un kernel Linux e una NIC normale fanno tutto. Switch L3 fai-da-te in 4 comandi. vconfig è morto, viva iproute2.

🐧 Creare una sub-interface VLAN

iproute2 — il modo moderno
# 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

📜 Persistenza con netplan / systemd-networkd

/etc/netplan/01-vlan.yaml — Ubuntu
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 e VLAN Per filtrare frame taggati: 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.
08 / 12

VLAN su pfSense (e OPNsense)

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.

🛡️ Lo schema

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.

topologia
 [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

⚙️ Configurazione passo-passo

  1. Interfaces → Assignments → VLANs. Click su Add. Parent interface: igb1. VLAN tag: 20. Description: LAN. Salva. Ripeti per ogni VLAN.
  2. Interfaces → Assignments: ora vedi le VLAN nella dropdown delle "Available network ports". Aggiungile come nuove interfacce (OPT1, OPT2…) e Save.
  3. Interfaces → OPTx: Enable, dai un nome significativo (es. LAN_UFFICI), tipo Static IPv4, IP del gateway di quella subnet (es. 10.0.20.1/24). Salva e applica.
  4. Services → DHCP Server → LAN_UFFICI: enable, range (es. 10.0.20.100-10.0.20.200), gateway, DNS. Salva.
  5. Firewall → Rules → LAN_UFFICI: di default è tutto bloccato sulle nuove interfacce. Aggiungi le regole che servono. (Vedi sotto.)

🚧 Regole firewall — pattern utile

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.

regole sull'interfaccia LAN_UFFICI (VLAN 20)
# 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.

📡 Multi-SSID con AP managed

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.

  • SSID CasaLAN → VLAN 20 (LAN_UFFICI)
  • SSID Ospiti → VLAN 60 (GUEST) — con client isolation attiva
  • SSID IoT → VLAN 40 (IOT) — separato perché non vuoi che la lampadina cinese ti sniffi i pacchetti
🔥 Errore tipico #1 su pfSense Crei la VLAN, configuri tutto, e poi ti accorgi che la VLAN parent (igb1) ha ancora un suo IP e una sua "LAN" assegnata. Risultato: traffico untagged che parla con la VLAN sbagliata, broadcast che entrano dove non devono. Disabilita o rimuovi l'IP dall'interfaccia parent se la usi solo come trunk. Lascia che faccia da carrier muto.
💀 Errore tipico #2 — bloccarti fuori Configuri la VLAN MGMT, sposti pfSense su quella, ti dimentichi di mettere una regola di accesso al WebGUI dalla nuova subnet, e quando applichi le regole resti chiuso fuori. Soluzione: console seriale, oppure pfctl -d da console fisica per disabilitare temporaneamente il firewall. Morale: tieni sempre un cavo console pronto quando rifai il networking.
ℹ️ OPNsense è praticamente identico I menù sono organizzati leggermente diversamente (Interfaces → Other Types → VLAN), ma il modello è lo stesso: parent + tag + nuova interfaccia + regole. Se sai pfSense, sai OPNsense. E se non sai nessuno dei due, OPNsense ha un'interfaccia un filo più moderna.
09 / 12

VLAN e Virtualizzazione

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).

🧱 Proxmox + Linux Bridge VLAN-aware

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.

/etc/network/interfaces — Proxmox
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 e VLAN

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 — macvlan su VLAN 40 (IoT)
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
⚠️ Limite noto del macvlan L'host stesso non riesce a parlare con i container macvlan sulla stessa NIC, per come funziona il kernel. Se ti serve quella comunicazione, devi creare una sub-interface dedicata sull'host e bridgarla, oppure usare ipvlan in modalità L3. Una di quelle robe per cui passi mezza giornata pensando che sia la firewall e invece è una limitazione architetturale.
10 / 12

Sicurezza — VLAN Hopping & co.

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.

🎭 Switch Spoofing

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.

🪆 Double Tagging

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.

🛡️ Misure di hardening da attivare sempre

  • Port Security / Mac Limit — limita il numero di MAC per porta. Niente hub abusivi sotto la scrivania.
  • BPDU Guard sulle access port — se arriva un BPDU (= qualcuno ha collegato uno switch dove non doveva), spegni la porta.
  • DHCP Snooping — solo le porte trusted possono fare DHCP server. Stop ai rogue DHCP da AP cinesi.
  • Dynamic ARP Inspection — basato sulla tabella DHCP snooping, blocca ARP spoofing.
  • Storm Control — limita broadcast/multicast/unknown unicast oltre una soglia. Salva la rete da loop e da NIC impazzite.
  • 802.1X — autenticazione sulla porta prima ancora di darti un IP. La versione enterprise di "chi sei?".
🧭 Il principio Le VLAN segmentano il broadcast domain. Il firewall L3 decide chi parla con chi. Le feature di hardening dello switch impediscono che qualcuno bypassi il modello. Servono tutti e tre i livelli, da soli nessuno basta.
11 / 12

Troubleshooting — i classici

Perché "non funziona" è una diagnosi incompleta. Ecco i sintomi più comuni e dove guardare prima.

🔧 Sintomi e cause

SintomoCausa probabile
"Non prende IP" su una portaAccess port nella VLAN sbagliata, o DHCP server non raggiungibile dalla VLAN (manca ip helper-address / DHCP relay).
Prende IP ma non navigaDefault gateway non risponde (SVI mancante), oppure regola firewall che blocca verso WAN.
Pinga il gateway ma non altre VLANInter-VLAN routing assente, oppure regole firewall che bloccano. Probabilmente è normale e voluto.
Funziona solo per alcune VLANTrunk con allowed vlan incompleto. La VLAN che non funziona non è nella lista.
Tutto rallenta dopo un cambio di configProbabile loop L2 perché STP è stato disabilitato o c'è un bridge VLAN-aware mal configurato.
Le VM Proxmox non vedono la VLANbridge-vlan-aware non attivo, oppure tag mancante nelle impostazioni della VM.
Sniffi su eth0 ma non vedi tagStai sniffando sulla sub-interface, non sulla parent. Oppure il driver toglie i tag prima.
Tutto va, tranne il telefono VoIPQoS / CoS sul tag 802.1Q non rispettato. Oppure il telefono si aspetta CDP/LLDP per scoprire la voice VLAN.
12 / 12

Tools & Cheat Sheet

I comandi che userai davvero, e qualcuno che non userai mai ma fa scena al colloquio.

Comandi rapidi Linux

iproute2
# 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

🧪 Diagnosi rapida da una macchina

routine veloce quando "non va"
# 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

📚 Sigle da conoscere

  • 802.1Q — standard del tag VLAN
  • 802.1ad — QinQ (doppio tag)
  • 802.1X — autenticazione di porta
  • SVI — Switch Virtual Interface (interfaccia L3 di una VLAN su L3 switch)
  • PVID — Port VLAN ID (la VLAN nativa di una porta)
  • VID — VLAN ID nel tag
  • DTP — Dynamic Trunking Protocol (Cisco, da disabilitare)
  • VTP — VLAN Trunking Protocol (Cisco, da non usare in trasparenza)

🛒 Hardware "decente" per VLAN a casa

  • Switch managed economici: Mikrotik CRS series, TP-Link TL-SG108E (basico ma fa 802.1Q), Zyxel GS1900
  • Switch managed seri: UniFi Switch, Mikrotik CRS3xx, Aruba Instant On 1930
  • Firewall/router: pfSense / OPNsense su mini-PC fanless, Mikrotik RouterOS, OpenWrt su router consumer decente
  • Access Point con multi-SSID/VLAN: UniFi U6, Mikrotik cAP, Aruba Instant On AP22
🔧
NetForge — il toolkit di networking che gira in locale ha generatori e analyzer per firewall, WireGuard/OpenVPN, audit TLS, scanner di rete e packet sniffer. Quando configuri pfSense/OPNsense con un nuovo trunk e nuove regole, può aiutarti a generare/validare la parte firewall senza dover scrivere tutto a mano. → netforge.it