Co to jest bridge?
Bridge jest urządzeniem odzielającym dwa lub więcej fizyczne segmenty sieci będące w jednej sieci logicznej (w obrębie jednej klasy adresowej).
Bridge jest najczęściej umieszczany pomiędzy dwoma grupami komputerów w sieci, gdzie komputery w obrębie danej grupy komunikują się ze sobą bardzo często, lecz komputery pomiędzy tymi grupami komunikują się rzadziej. W takim wypadku bridge zminimalizuje obciążenie 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.
- po przypisaniu karty sieciowej do bridge’a staje się ona jego portem i nie mamy nad nią już żadnej kontroli;
- port może być przypisany tylko do jednego bridge’a (na jednej maszynie może być kilka bridge’y);
- bridge nic nie wie na temat protokołów wyższych niż ARP, dlatego potrafi obsłużyć każdy możliwy protokół uruchomiony w Twojej sieci lokalnej;
- bridge może mieć dowolną ilość interfejsów (mimo iż się spotkałem z opiniami że bridge może mieć tylko dwa porty i po uruchomieniu bridge’a komputer staje się bezwartościowy jako maszyna tcp/ip);
- bridge działa jak interfejs sieciowy, może mieć swój adres IP;
- można uruchomić dowolną ilość bridge’y, np: bridge1 obsługuje sieci na eth0 i eth1 a bridge2 obsługuje sieci na eth2 i eth3, a pomiędzy bridge1 i bridge2 można uruchomić normalny routing tak jakby bridge1 i bridge2 były kartami sieciowymi;
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 brctl wygląda tak: brctl <komenda> [parametry]
Podstawowe komendy:
addbr [nazwa], delbr [nazwa] – odpowiednio dodanie bridge’a i usnięcie bridge’a o podanej nazwie. Nazwa może być prawie dowolna – np. mostek, most0, bridge7, br0. Uwaga. Usunięcie bridge jest możliwe tylko wtedy kiedy nie są przypisane do niego żadne interfejsy.
addif [nazwa] [iface], delif [nazwa] [iface] – odpowiednio dodanie interfejsu (portu) do bridge’a o nazwie ‘nazwa’ i jego usunięcie. Przykładowo: brctl addif br0 eth0 – to dodaje do bridge’a br0 port eth0.
showbr [nazwa] – pokazanie listy bridge’ów lub wyświetlenie ustawień jednego z nich.
showmacs [bridge] – pokazanie listy widocznych adresów sprzętowych kart (MAC) które widzi [bridge] oraz portów (kart sieciowych) przez które je widzi
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.