Esperienza su Virtual LAN (VLAN) |
|
|
|
Requisiti |
|
Per sperimentare l'argomento in questione occorre che il kernel della macchina virtuale utilizzata abbia attivato il supporto per VLAN (CONFIG_VLAN_8021Q=[M,Y]). Per caricare il modulo basta dare il comando:
vm# modprobe 8021q
e per controllare l'effettivo caricamento (sia in kernel modulari che statici):
vm# dmesg | grep 802.1Q
802.1Q VLAN Support vX.Y Ben Greear <greearb@candelatech.com>
Per i kernel modulari si può verificare anche con:
vm# lsmod | grep 802
8021q 17544 0
Avendo terminato i requisiti "lato kernel"
passiamo ai requisiti "lato user space": occorre
aver installato il pacchetto vlan
che contiene i programmi utente per aggiungere o rimuovere
device di tipo VLAN dai nostri device ethernet.
Per configurare l'interfaccia di rete occorre procedere in modo leggermente diverso dallo standard: supponiamo di dover definire sulla interfacccia eth0 la VLAN 2 e che questa abbia 192.158.50.1 come IP address:
vm# ifconfig eth0 0.0.0.0 up
Aggiungiamo la "trunked virtual interfaces" 2:
vm# vconfig add eth0 2
Added VLAN with VID == 2 to IF -:eth0:-
Assegniamo l'IP address (e verifichiamo):
vm# ifconfig eth0.2 192.168.50.1 up vm# cat /proc/net/vlan/config VLAN Dev name | VLAN ID Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD eth0.2 | 2 | eth0
È possibile dare dei nomi diversi ai device di tipo eth?.* come ad esempio:
vm# vconfig set_name_type VLAN_PLUS_VID_NO_PAD Set name-type for VLAN subsystem. Should be visible in /proc/net/vlan/config # vconfig add eth0 3 Added VLAN with VID == 3 to IF -:eth0:- vm# ifconfig vlan3 192.168.51.1 up vm# cat /proc/net/vlan/config VLAN Dev name | VLAN ID Name-Type: VLAN_NAME_TYPE_PLUS_VID_NO_PAD vlan3 | 3 | eth0
Esperienza "base" |
|
Per la realizzazione di questo modulo useremo Netkit4TIC.
La rete che useremo la organizziamo come rete switched anarchica e cioè tutte le stazioni sono VLAN-aware e quindi tutti i collegamenti sono trunked. Il piano di numerazione della rete 192.168.50.0/29 ha tre host connessi:
e viene costruita automaticamente dallo script lstart
(scarica il
materiale
per l'esperienza):
realHost$ lstart
Il funzionamento delle VLAN si può provare semplicemente con il comando ping e osservando che dall'host X non sono raggiungibili ne Y ne Z. Invece il ping dall'host Y verso l'host Z e viceversa diagnostica connettività.
Se andiamo a vedere le specifiche e i frame che vengono passati
in un collegamento "trunked" notiamo che il frame viene esteso
con 4 byte e da questo ne segue che i
driver dei dispositivi ethernet devono essere opportunamente
programmati. Nel nostro caso il programma uml_switch che realizza
il nostro switch/hub virtuale non è VLAN compatibile in quanto
non permette l'invio di frame con dimensione superiore a 1500 byte.
Per ovviare a questo bug
dobbiamo diminuire di 4 byte la lughezza dei frame trasmessi.
Quindi dopo aver configurato e attivato una scheda di rete
basta aggiungere il comando che setta
l'mtu a 1496 byte.
Il comando che ricerca il più piccolo mtu nel path
che congiunge due nodi è tracepath contenuto
nel pacchetto Debian iputils-tracepath:
Y# tracepath -n 192.168.50.2 1: 192.168.50.2 3.633ms pmtu 1496 1: 192.168.50.3 2.903ms reached Resume: pmtu 1496 hops 1 back 1 Z# tracepath -n 192.168.50.3 1: 192.168.50.3 5.125ms pmtu 1496 1: 192.168.50.2 3.004ms reached Resume: pmtu 1496 hops 1 back 1
Una applicazione per i laboratori scolastici |
|
È possibile associare più VLAN alla stessa interfaccia e quindi
abbiamo pensato di costruire una rete con un nodo server con
tante VLAN quanti sono i nodi di tipo studente. Nel nostro esempio i nodi sono
due: student1 e student2 e sono di tipo VLAN-unaware
in modo da non essere vulnerabili ad una eventuale riconfigurazione
della interfaccia di rete.
La nostra rete illustra una situazione di prova pratica in
una rete di un laboratorio
(per esercizio 192.168.i.0/24) dove non si vuole che le
macchine client si possano scambiare informazioni.
La configurazione IP è
(per i client ho cercato di far tornare l'ultimo numero IP (della parte rete)
con il numero della VLAN di appartenza in modo da facilitare la lettura
delle tracce):
che viene costruita automaticamente dal comando:
realHost$ lstart -d school
Riportiamo comunque la configurazione delle VLAN 2 e 3 per la macchina server:
server# vconfig add eth0 2 server# ifconfig eth0.2 192.168.2.254 up server# vconfig add eth0 3 server# ifconfig eth0.3 192.168.3.254 up server# cat /proc/net/vlan/config VLAN Dev name | VLAN ID Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD eth0.2 | 2 | eth0 eth0.3 | 3 | eth0
La connettività tra lato VLAN-aware e lato WLAN-unaware lo
abbiamo realizzato tramite un bridge: abbiamo creato un nodo con
tre ethernet: la prima connessa al server e VLAN-aware e quindi con
le VLAN 2 e 3; la seconda connessa a student1 e la
terza connessa a student2 entrambe VLAN-unaware.
Possiamo verificare con il comando ping che non esiste
raggiungibilità tra gli host student1 e
student2 i quali riescono a
comunicare solo con l'host server.
Ecco le traccie sulla VLAN2
(File ACP)
e sulla VLAN3
(File ACP)
ricavate rispettivamente dai seguenti lanci di tcpdump:
server# tcpdump -i eth0.2 -w vlan2-icmp.acp server# tcpdump -i eth0.3 -w vlan3-icmp.acp
Osserviamo che solo dalla cattura completa su eth0 (File ACP) possiamo vedere nella dissezione di WireShark il tag VLAN. Prendiamo ad esempio la richiesta ARP:
server# tcpdump -i eth0 -w vlan23-icmp.acp
Frame 1 (46 bytes on wire, 46 bytes captured)
Ethernet II, Src: 00:00:00_00:20:00 (00:00:00:00:20:00),
Dst: Broadcast (ff:ff:f f:ff:ff:ff)
Destination: Broadcast (ff:ff:ff:ff:ff:ff)
Source: 00:00:00_00:20:00 (00:00:00:00:20:00)
Type: 802.1Q Virtual LAN (0x8100)
802.1Q Virtual LAN
000. .... .... .... = Priority: 0
...0 .... .... .... = CFI: 0
.... 0000 0000 0010 = ID: 2
Type: ARP (0x0806)
Address Resolution Protocol (request)
Verifica di un collegamento trunked tra bridge |
|
Con una piccola modifica dell'esempio precedente possiamo provare il funzionamento trunked tra due bridge. Lo schema che adotteremo è:
eth1 eth1
+-----------+ +-----------+
+----------+ | | | | +----------+
| pc11 |------+ br0 | eth0.2 | br0 +------| pc21 |
+----------+ | | | | +----------+
| ------- +-- eth0 --+ ------- |
+----------+ | | | | +----------+
| pc12 |------+ br1 | eth0.3 | br1 +------| pc22 |
+----------+ | | | | +----------+
+-----------+ +-----------+
eth2 eth2
dove pcXX sono VLAN-unaware e sono così assegnati:
pc11 e pc21 sono nella VLAN2; pc12 e pc22 sono assegnati alla
VLAN 3. Il collegamento tra i due bridge è trunked ossia
veicolerà i VLAN tag di VLAN 2 e di VLAN 3.
Per attivare questo esperimento basta lanciare il comando:
realHost$ lstart -d trunkBridge
|
|
Sandro Doro (email me)