Esperienza base su bridge |
|
|
|
Per la realizzazione di questo modulo useremo Netkit4TIC. Riteniamo propedeutica l'esperienza sul protocollo ARP dal sito di Netkit (docs, tarball).
Questa esperienza si basa sulla rete di laboratorio usata nel capitolo 4 del libro di Baldi e Nicoletti SWITCHED LAN. Dal loro sito internet www.netscire.it è possibile consultare le relative slide.
La configurazione della rete è riassunta in (pdf, xml) dove abbiamo pensato di assegnare alle stazioni indirizzi IP della rete 10.0.0.0/8.
Scarica il tarball contenente il tutto,
e come al solito si parte scompattandolo in una sottodirectory della
HOME dell'utente.
Per ogni stazione X lo script assegna l'IP address
10.0.0.X e il MAC address indicato sulla mappa.
Per il bridge lo script assegna
ad ogni interfaccia ethY (detta anche portY+1) il
MAC address 00:00:00:00:00:0(Y+1). Iniziamo:
realHost$ lstart -d nostp
Per prima cosa controlliamo che il kernel abbia caricato gli opportuni moduli:
b# lsmod | \
awk '{ if (NR == 1) print $0; \
else if (index ($0, "bridge")) print $0; }' -
Module Size Used by
bridge 45720 0
atm 40824 1 bridge
il pacchetto che permette la configurazione del
"Linux ethernet bridge" è bridge-utils.
Controlliamo la configurazione del bridge b:
b# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000001 no eth0
eth1
eth2
Possiamo notare che l'id del bridge è ottenuto, come da specifiche, dalla concatenazione di bridge priority (default 32768 ossia 0x8000) e dal MAC address della prima porta (settato nello script a 00:00:00:00:00:01). Vediamo che lo Spanning Tree Protocol (SPT) è disattivato e che il bridge è composto da tre interfacce (in seguito chiamate port).
Ora controlliamo la tabella dei MAC address (learned):
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
(screenshot) ovviamente non ci sono MAC address non locali fino a quando non verrà generato del traffico.
Flooding |
|
Ora proviamo a sperimentare la caratteristica del flooding
nel bridge e per far questo, ad esempio, dalla stazione 1 proviamo
a fare un ping verso un IP address della rete
non appartenente ad alcuna stazione configurata.
Per prima cosa però predisponiamo
la cattura del traffico:
stazione3# tcpdump -i eth0 -v -n stazione4# tcpdump -i eth0 -v -n
e poi lanciamo il comando di un unico pacchetto ping:
stazione1# ping -c 1 10.0.0.10
PING 10.0.0.10 (10.0.0.10): 56 data bytes
--- 10.0.0.10 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
I pacchetti transitati saranno gli stessi in tutte le LAN
(LAN B,
LAN C)
dove possiamo vedere i pacchetti
di ARP per la ricerca del MAC address associato all'IP 10.0.0.10
generata dalla richiesta ping.
In corrispondenza la tabella dei MAC address del bridge subisce
una modifica poichè viene aggiunto il MAC address della
stazione 1:
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
1 08:00:2b:16:50:a0 no 7.25
Inoltro selettivo |
|
Passiamo ora ad analizzare il caso in cui la stazione 1 esegue
un ping verso la stazione 5 e quindi rispetto alla
situazione precedente c'è un pacchetto di risposta della
stazione 5 verso la stazione 1.
stazione1# ping -c 1 stazione5
PING stazione5 (10.0.0.5) 56(84) bytes of data.
64 bytes from stazione5 (10.0.0.5): icmp_seq=1 ttl=64 time=35.0 ms
--- stazione5 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 35.000/35.000/35.000/0.000 ms
Come prima attiviamo la cattura del traffico e questa volta i
pacchetti transitati saranno diversi
(LAN B,
LAB C)
in quanto il pacchetto ARP reply della stazione 5 non viene
visto dalla stazione 3 così come i successivi pacchetti di ICMP
request e reply.
In corrispondenza la tabella dei MAC address del bridge subisce
una modifica poichè viene aggiunto anche il MAC address della
stazione 5:
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
1 08:00:2b:16:50:a0 no 0.20
3 08:00:2b:c4:e6:aa no 0.20
Confinamento del traffico |
|
Ora proviamo a generare del traffico tra la stazione 1 e la stazione 2
e verifichiamo che ad esclusione del pacchetti di ARP request,
trasmessi in broadcast, il traffico avviene solo nella LAN A
(LAN A,
LAN B,
LAN C).
La tabella dei MAC address del bridge:
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
1 08:00:2b:16:50:a0 no 1.39
1 08:00:2b:20:10:56 no 1.39
3 08:00:2b:c4:e6:aa no 15.50
Spostamento di una stazione (caso 1) |
|
Spostiamo la stazione 5 dalla LAN C alla LAN A:
realHost$ lcrash -d nostp stazione5; \
cp nostp/lab.conf nostp/lab.conf.SAVE; \
sed -e 's/stazione5\[0\]="C"/stazione5[0]="A"/' \
nostp/lab.conf.SAVE > nostp/lab.conf; \
lstart -d nostp stazione5
e lanciamo da questa
un ping verso la stazione 2:
stazione5# ping -c 1 stazione2
Questa attività non manifesta alcun malfunzionamento nella rete poichè il bridge rileva la variazione di porta del MAC address e aggiorna di conseguenza la tabella:
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
1 08:00:2b:20:10:56 no 2.56
1 08:00:2b:c4:e6:aa no 2.56
Le relative catture del traffico per (LAN A, LAN B, LAN C).
Spostamento di una stazione (caso 2) |
|
Ripartiamo dalla situazione iniziale:
realHost$ lcrash -d nostp; \
cp nostp/lab.conf.SAVE nostp/lab.conf; \
lstart -d nostp
e supponiamo che la stazione 2 sia già stata contattata dalla stazione 3:
stazione3# ping -c 1 stazione2
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
1 08:00:2b:20:10:56 no 2.60
2 08:00:5a:10:40:e1 no 2.60
Ora spostiamo la stazione 2 nella LAN C:
realHost$ lcrash -d nostp stazione2; \
sed -e 's/stazione2\[0\]="A"/stazione2[0]="C"/' \
nostp/lab.conf.SAVE > nostp/lab.conf; \
lstart -d nostp stazione2
e attiviamo la stazione 3 per l'invio di un pacchetto:
stazione3# ping -c 1 stazione2
Le catture del traffico per
(LAN A,
LAN B,
LAN C). Quindi il bridge
conosce dalla sua tabella dei MAC address che il MAC
08:00:2b:20:10:56 è nella port 1 e quindi
inoltra il pacchetto per quella porta ma la stazione
è stata spostata e nella LAN A non c'è nessuno
che risponde. Soltanto quando l'entry nella tabella dei
MAC address del bridge raggiunge l'expire time, il bridge
si attiva in modalità flooding e quindi "riscopre"
la stazione 2 questa volta collegata alla LAN C e quindi alla
port 3 e il colloquio si compie.
Ecco la situazione
della tabella dei MAC address nel momento di non comunicabilità
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
1 08:00:2b:20:10:56 no 41.03
2 08:00:5a:10:40:e1 no 0.15
e dopo il flooding:
b# brctl showmacs br0
port no mac addr is local? ageing timer
1 00:00:00:00:00:01 yes 0.00
2 00:00:00:00:00:02 yes 0.00
3 00:00:00:00:00:03 yes 0.00
3 08:00:2b:20:10:56 no 0.82
2 08:00:5a:10:40:e1 no 0.82
|
|
Sandro Doro (email me)