Laboratorio

Modulo 6 - Hardware di rete

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

Creative Commons License FREE THE MOUSE Valid HTML! Sandro Doro (email me)
Ultima modifica: $Date: 2007-01-07 10:59:27 $