baseciq.org

Linux - bridge

Teoretycznie, zapiski nt. tego tekstu sięgają 2004 roku, jednak z pewnych źródeł wiem że tekst ten powstał w październiku 2002. Cięzko mi jednoznacznie stwierdzić kiedy rozłączyłem sieć BNC w moim bloku na 3 segmenty (w tym jeden dedykowany dla mnie). W dzisiejszych czasach obsługa bridge nie dość że jest natywnie w linuksie to i bez problemu obsługiwana przez skrypty startowe. Prawdopodobnie nikomu się już nie przyda.

Co to jest bridge?

Bridge jest urządzeniem odzielającym dwa lub więcej fizyczne segmenty sieci.

Zadaniem bridge’a jest decyzja czy pakiety z jednego interfejsu sieciowego powinny być przeniesione na drugi interfejs sieciowy. Bridge działa podobnie jak switch sieciowy (switch warstwy drugiej) – jest przezroczystym komponentem sieci (są nimi także huby czy też switche). Różnica pomiędzy switchem a zwykłym hubem jest taka, że ten drugi pakiety zasłyszane na jednym porcie przenosi na wszyskie porty, a switch tylko na te na które trzeba. Niektórzy zaraz powiedzą "przecież tak działają także routery!". Nie do końca. Routery działają tylko dla protokołu IP, natomiast bridge nie przenosi pakietów patrząc na typ protokołu (IP, IPX/SPX, NetBeui), ale na adres MAC źródłowe i docelowe. Dlatego też dzięki uruchomieniu bridge’a możemy bezproblemowo korzystać z usługi netbios czy programów korzystających z protokołu IPX/SPX w sieciach połączonych serwerem Linuxowym. Po uruchomieniu bridge’a nadal możemy na serwerze uruchamiać jakiekolwiek usługi o ile chcemy.

Inne pożyteczne zastosowanie bridge’a to możliwość połączenie dwóch standardów sprzętu sieciowego np. 10-Base-T (sieć BNC) i 100-Base-TX (sieć na skrętce) – do tego wystarczy nam komputer klasy 486 ze stacją dyskietek i kością pamięci który leży niepotrzebny pod biurkiem. Efekt: nie musimy kupować huba z uplinkiem BNC a przy okazji bridge taki zmniejszy nam obciążenie sieci.

Jako że autor HOWTO na którym bazuje ten tekst podał swój prywatny powód dlaczego postawil bridge’a, zrobię tak i ja. W naszej sieci blokowej są trzy segmenty sieci na BNC. Każdy z nich miał swoją klasę C z puli 192.168.0.0/16. W jednym z nich (nazwijmy go segmentem nr. 1) stał serwer DHCP dla tego segmentu sieci. Wszystkie 3 segmenty zbiegały się w routerze Linuxowym. Na tymże routerze działał serwer DHCP dla segmentów 2 i 3. Należało oczywiście zainstalować także serwer samby z obsługą wins’a aby w windowsowym otoczeniu sieciowym komputery widziały się nawzajem pomiędzy segmentami. Niestety rozwiązanie to nie pomagało aby chodziły bezproblemowo w sieci programy do komunikacji w lanie a o graniu pomiędzy segmentami w gry wkorzystujące protokół IPX/SPX nie było wogóle mowy. Teraz wszystkie trzy segmenty są w obrębie jednej klasy adresowej, serwer WINS nie jest już potrzebny, DHCP działa jedno dla całej sieci, a i serwer ma tylko jeden adres IP.

Kilka pojęć o bridge

Potrzebne pliki

Wszystkie pliki potrzebne do postawienia bridge’a można znaleźć pod adresem http://bridge.sourceforge.net/download.html. Kernele serii 2.4.* posiadają wbudowaną obsługę bridge’a, natomiast by w kernelach 2.2.* wszystko sprawnie działało potrzebna jest ta łatka: http://bridge.sourceforge.net/patches/bridge-1.0.2-against-2.2.20.diff – powinna się znajdować na dole tamtego indeksu. Do zarządzania bridge’m potrzebny jeszcze jest program brctl: http://bridge.sourceforge.net/bridge-utils/. Obsługę bridge’a najlepiej wkompilować jako moduł (CONFIG_BRIDGE=m). Będzie ona działała poprawnie, natomiast przy kompilacji na stałe może ona wywołać problemy. Później przystępujemy do kompilacji i instalacji bridge-utils:

$ tar -xzf bridge-utils-0.9.3.tar.gz$ cd bridge-utils$ make$ cp brctl/brctl /sbin

Składnia komendy brctl:

brctl <komenda> [parametry]

Podstawowe komendy:

Te kilka komend powyżej pozwolą nam uruchomić i kontrolować bridge’a. Jeżeli nasze karty sieciowe które chcemy włączyć do bridge’a mają już skonfigurowane adresy, należy te adresy im odebrać komendą: ifconfig eth0 0.0.0.0. W tym momencie po wyświetleniu listy interfejsów komendą ‘ifconfig’ powinniśmy widzieć karty sieciowe, ale bez przyznanych adresów IP. Cały skrypt do uruchamiania bridge’a wygląda tak:

#!/bin/sh
#
# Podnieśmy karty sieciowe.
# Oczywiście tych kart sieciowych może być więcej lub mniej (czyli dwie).
# Jeżeli ten skrypt jest już wywoływany po zainicjowaniu sieci (np. z
# rc.local) należy dopisać po każdym 'up' adres '0.0.0.0'
#

/sbin/ifconfig eth0 up
/sbin/ifconfig eth1 up
/sbin/ifconfig eth2 up

#
# Jeżeli mamy wkompilowaną obsługę bridge'a na stałe, możemy zahashować
# następną linijkę. W przeciwnym wypadku należy załadować moduł bridge.
#

/sbin/modprobe bridge

#
# Utwórzmy bridge o nazwie 'br0'.
#

/sbin/brctl addbr br0

#
# Dodajmy do bridge'a br0 karty sieciowe
#

/sbin/brctl addif br0 eth0
/sbin/brctl addif br0 eth1
/sbin/brctl addif br0 eth2

#
# Teraz przydzielmy bridge'owi adres ip, żebyśmy mogli używać serwera
# do normalnych celów
#

/sbin/ifconfig br0 up 192.168.1.1 netmask 255.255.255.0

#
# Powinno działać
#

Teraz, pakiety pomiędzy sieciami powinny przechodzić swobodnie. Jeżeli bridge został uruchomiony na komputerze robiącym maskradę, powinna ona nadal działać. Łaty na ipchains są jedynie potrzebne w momencie gdy chcemy ustawiać regułki pomiędzy sieciami (tj. zrobić przezroczystego firewalla).

A jak to zrobić w PLD? Musimy mieć kernel dystrybucyjny (2.2.20-6.2 na przykład). Tworzymy nowy plik /etc/sysconfig/interfaces/ifcfg-br0 który wygląda tak:

# Nazwa bridge'a

DEVICE=br0

# Adres IP bridge'a:

IPADDR=192.168.1.1/24

# Czy bridge ma być aktywowany podczas uruchamiania systemu:

ONBOOT=yes

# Urządzenia sieciowe które mają być częścią bridge'a:

BRIDGE_DEVS="eth0 eth1"

# Protokół STP (zalecane 'yes')

SPANNING_TREE=yes

Teraz /etc/rc.d/init.d/network restart i powinno chodzić ;). Podziękowania dla Jack’a za pomoc z bridge w PLD.