Realizzare un "bridge"

Ven, 22/10/2004 - 00:35

Realizzare un "bridge"

Inviato da jordan83 6 commenti

Con questa piccola guida vorrei far luce su come realizzare una interfaccia di tipo bridge in un sistema GNU/Linux.
Preciso fin da subito che non ho l'autorevolezza di un sistemista e che io stesso calpesto con passo ancora insicuro l'insidioso sentiero del "networking".
Quanto è qui riportato potrebbe essere parzialmente inesatto o poco chiaro. Siete liberi di migliorare, espandere, arricchire.

Fatte le dovute premesse, passiamo al mitico bridge.

Che cos'è un bridge? Ragionando sul significato della parola si pensa subito a un "ponte". In effetti è questo quello cui dovete pensare quando realizzate un "bridge". Questa interfaccia virtuale non è altro che un artificio che serve a mettere in comunicazione più interfacce di rete tra loro (N.B non solo schede ethernet).

Quando sono andato in cerca di lumi su questa struttura logica avevo il problema di far comunicare due interfacce ethernet tra di loro. Avevo realizzato per un amico un piccolo server dotato di 3 schede di rete:
- eth0: questa era adibita al collegamento col modem adsl al web.
- eth1: a questa si collegava un unico pc, quello del mio amico.
- eth2: a questa era attaccato uno switch cui via via si potevano aggiungere più pc via dhcp.

Ora, i client win connessi a eth2 riuscivano a condividere risorse tra loro (come cartelle di files) mentre nessuno di essi poteva fare altrettanto col client win attaccato a eth1. Tutti i pc però riuscivano a pingarsi.
Il bridge vi permette di risolvere tra l'altro proprio questo problema (e ha permesso pure lo svolgersi di succulente partite in LAN a giochi vari tra cui Starcraft... Wink).

Realizzare un bridge comporterà dunque che più interfacce di rete vengano conglobate in una soltanto.

Prima di tutto ci serve il software necessario. A questo scopo dobbiamo installare il pacchetto bridge-utils (do per scontato che abbiate già installato il pacchetto ifupdown).
Da root:

# apt-get install bridge-utils

Dovete inoltre avere nel vostro kernel il supporto per il bridge. Se avete il modulo (omonimo), esso verrà caricato a bisogno.

Proviamo ora a realizzare manualmente un semplice bridge che metta in comunicazione eth1 ed eth2.

Se le interfacce di rete che volete "legare" assieme sono attive dovete disattivarle. Nel mio caso:

# ifconfig eth1 down
# ifconfig eth2 down

Creiamo l'interfaccia virtuale br0.

# brctl addbr br0

Fatto il "contenitore" non ci resta che aggiungervi le interfacce che vogliamo porre in comunicazione tra loro:

# brctl addif br0 eth1
# brctl addif br0 eth2

Bene! br0 è ufficialmente un'unica grande sottorete. Dimenticatevi pure dell'esistenza di eth1 e eth2. Diamo a queste due ultime interfacce un indirizzo di comodo:

# ifconfig eth1 0.0.0.0
# ifconfig eth2 0.0.0.0

Notate che entrambe utilizzano lo stesso ip speciale 0.0.0.0

Ora potete assegnare tranquillamente a br0 un ip come a una qualunque interfaccia:

# ifconfig br0 192.168.45.1

(questo ip è ovviamente d'esempio)

Complimenti! Il vostro bridge è perfettamente funzionante. Potete ora avviarci sopra un server dhcp, uno ftp o quello che volete. E se un pc connesso a eth2 condividerà qualcosa, anche il pc connesso a eth1 potrà usufruirne. Non dovrete più fare riferimento a eth1 o eth2: è come se non esistessero più. Ora al loro posto c'è solo br0. Semplice, no?

Non resta che far in modo che tutto venga caricato ad ogni riavvio.

Prima di tutto bisogna configurare il file /etc/network/interfaces.
Ecco un esempio (al solito si rifà al caso da me introdotto inizialmente):

auto lo
iface lo inet loopback
 
 
auto eth0
iface eth0 inet dhcp
        hwaddress ether xx:yy:xx:yy:xx:yy
 
 
auto br0
iface br0 inet static
        bridge-ifaces eth1 eth2
        address 192.168.45.1
        netmask 255.255.255.0
        network 192.168.45.0
        broadcast 192.168.45.255
 
 
iface eth1 inet static
        address 0.0.0.0
        netmask 255.255.255.255
        hwaddress ether xx:yy:xx:yy:xx:yy
 
 
iface eth2 inet static
        address 0.0.0.0
        netmask 255.255.255.255
        hwaddress ether xx:yy:xx:yy:xx:yy

NOTA BENE! Le interfacce eth1 ed eth2 non vengono attivate all'avvio del pc (manca infatti la relativa riga "auto ..." che c'è invece per lo e per br0 e eth0). Ciò è importante per il corretto avvio del bridge.

Ora non resta che collocare il seguente script (lo trovate anche nella documentazione allegata al pacchetto ifupdown) nelle cartelle /etc/network/if-pre-up.d/ e /etc/network/if-down.d/

<br />#!/bin/sh
 
brctl=`which brctl`
 
# Notice that the bridge-utils package must be installed and
# we need to have the BRIDGE_IFACES in order to work
[ "$IF_BRIDGE_IFACES" = "" ] && exit 0
if [ -z "$brctl" ] ; then
        # ? Somebody is trying to use us without having bridge-utils?
        echo "Cannot find the 'brctl' program to setup the bridge"
        echo "Hint: Have you installed the bridge-utils package?"
        exit 1
fi
 
# Check all interfaces before proceeding
for i in $IF_BRIDGE_IFACES; do
        ip link show $i >/dev/null 2>&1
        if [ $? -ne 0 ] ; then
                echo "Interface $i is not available, aborting"
                exit 1
        fi
done
 
if [ "$MODE" = "start" ] ; then
        # We are being called by ifup:
        # Bring up all the bridge interfaces
        for i in $IF_BRIDGE_IFACES; do
                ifconfig $i 0.0.0.0 up
        done
        # And now add the bridge itself and the interfaces which are part
        # of the bridge
        brctl addbr $IFACE
        for i in $IF_BRIDGE_IFACES; do
                brctl addif $IFACE $i
        done
elif [ "$MODE" = "stop" ];  then
        # We are being called by ifdown:
        # Remove the bridge itself and the bridge association
        for i in $IF_BRIDGE_IFACES; do
                brctl delif $IFACE $i
        done
        brctl delbr $IFACE
        # Bring down all the bridge interfaces
        for i in $IF_BRIDGE_IFACES; do
                ifconfig $i down
        done
fi
 
exit 0

In tal modo l'interfaccia verrà avviata correttamente all'avvio e allo spegnimento del pc (o, meglio, quando br0 viene attivata o disattivata).

Affinchè lo script funzioni deve essere installato anche iproute.

Ora siete a posto, avete finito e potrete godervi quest'ennesima vittoria nell'arduo mondo delle configurazioni. Se ancora non vi par vero date un bel

# ifconfig

da root e godetevi lo spettacolo!

Ricordate di modificare e sostituire in eventuali altri file di configurazione alle parole "eth1 eth2" il termine "br0".

Direi che è tutto.

Se volete approfondire consultate la documentazione allegata a ifupdown e bridge-utils.
Il sito di riferimento è http://bridge.sourceforge.net/

Interessante (almeno per me che non lo conoscevo) è la possibilità di scrivere delle regole di firewall per le interfacce ethernet collegate nel bridge (ora infatti comunicano in tutto e per tutto). Il progetto è "ebtables".

Non mi resta che augurarvi un buon smanettamento e pochi intoppi.
Ciao! Laughing





Commenti

Ritratto di jordan83
#1

Inviato da jordan83 il Ven, 22/10/2004 - 20:02.

Re: Ottimo

Beh, grazie! :oops:

Spero più che altro di far penare qualcuno meno di quel che ho penato io... Laughing

"Se avessimo tutti le stesse opinioni non ci sarebbero le corse dei cavalli." G.B.Shaw



Ritratto di beda2
#2

Inviato da beda2 il Mer, 03/11/2004 - 14:14.

Re: Ottimo

Ciao jordan83,
Sono nuovo in questo forum ed anche nel mondo debian. Ho letto la tua guida e mi sembra ottima (anche se la devo ancora provare), io, volevo chiederti una cosa: Supponendo che ho 2 schede di rete, la prima con indirizzo 192.168.x.x che mi fa da gateway verso internet (s.o. debian woody)e la seconda con indirizzo 90.0.x.x client (win xp),devo "costruirmi" un bridge per poter andare in internet anche con il client win xp oppure no?
Spero in una risposta xche' non so dove sbattere la testa. :idea:
Grazie
Beda2



Ritratto di beda2
#3

Inviato da beda2 il Mer, 03/11/2004 - 15:06.

Re: Ottimo

@Debian
Scusami, non pensavo che fossi un argomento "scottante" Sigh! Mea culpa

Beda2 Laughing



Ritratto di jangar
#4

Inviato da jangar il Mer, 28/09/2005 - 01:23.

Re: Ottimo

Scusate, ma che differenza c'è tra questo è un gateway che fa nat per condividere la connessione?
Ma sta cosa si può utilizzare anche con una VPN?