Какво е мост ?
Мостът свързва два мрежови сегмента, за да могат пакетите да преминават от единия сегмент в другия все едно са в една мрежа. Този процес се извършва на втория слой от OSI модела и не за виси от протокола, който се използва в мрежата. Обикновено, когато не използваме мостове, компютър с две мрежови карти би бил свързан към две различни мрежи. Въпреки че компютърът не маршрутизира пакети между двете мрежи, на всеки интерфейс би имало различен мрежов адрес и маска в зависимост от мрежата, в която е свързан. Когато ползваме мостове, и двата мрежови интерфейса са част от един и същ логически мрежов сегмент. Двата интерфейса могат да бъдат представени като един мостов интерфейс, а устройствата, свързани към двата мрежови сегмента ще получат адреси от една и съща мрежа.
Само пакетите, които трябва да минат от един сегмент в друг ще преминават физически от единия интерфейс към другия. Мостът ще научи MAC адресите на устройствата от двата сегмента, за да знае кои пакети трябва да се препредават към другия мрежов сегмент. Това прави мостовете полезни за намаляването на трафика като сегментираме мрежата по такъв начин, че в един сегмент е намират устройства, между които се предава голям обем данни. Днес почти всяка мрежа съдържа поне един суич. Суичът може да се разгледа като устройство, което има мост на всеки порт. Това означава, че когато се пренасят данни от един порт на друг данните не се предават и на всички останали портове.
Защо да използваме мостове?
Няма особено голям смисъл да използваме Линукс машина за мост или за суич при положение, че последните са доста по-евтини, тихи и ефективни. Освен това всеки интерфейс, които е конфигуриран на Линукс машина като мост трябва да работи в безразборен режим за да може да получава пакети, които не са предвидени за него. Това би повишило натоварването на машината. За това е добре да се ползва отделна машина като мост, а не такава която изпълнява и други функции. Има работи които могат да се направят с линукс мостове, които не могат да се направят с обикновени суичове. Например мост между една мрежа и ppp интерфейс или мост между няколко частни мрежи.
Поддръжка на мостове в линукс
Поддръжка за мостове в линукс има във всички ядра след 2.4.0.
Конфигурация на ядрото
Ако използвате ядро, което е инсталирано с дистрибуцията която ползвате и не сте си го компилирали вие, има шанс да имате вече поддръжка за мостове в него. Много вероятно поддръжката да е включена като модул. В този случай трябва да заредите модула по този начин:
# modprobe bridge
Ако се налага да прекомпилирате ядрото уверете се че променливата ‘CONFIG_BRIDGE’ има присвоена стойност ‘y’ или ‘m’ по време на конфигурацията. Как да си компилирате ядро, не е част от обхвата на тази статия.
Допълнителни инструменти
Повечето дистрибуции имат пакет, които се казва ‘bridge-utils’. Пакетът съдържа командата ‘brctl’. Ако вашата дистрибуция няма такава команда можете да свалите сорса от тук.
Компилирането и инсталирането е доста лесно
# tar xzf bridge-utils-1.4.tar.gz
# cd bridge-utils-1.4
# ./configure --prefix=/usr/local
# make
# su
# make install
Създаване и използване на мостове
Като пример, нека си представим, че имаме два физически мрежови сегмента и искаме да ги обединим в една логическа мрежа. Имаме една машина, която е мостът, с два мрежови интерфейса eth0 и eth1. Освен това в двата сегмента имаме други машини.


Преди да създадем моста, трябва да сме сигурни, че и двата интерфейса не са вдигнати и нямат мрежови адреси.
# ifconfig eth0 0 down
# ifconfig eth1 0 down
След това може да създадем мрежовия интерфейс. Използваме командата brctl ‘addbr’, която създава мостов интерфейс с име ‘br0′.
# brctl addbr br0
Няма ограничения за името на мостовия интерфейс, стига да няма вече такъв интерфейс със същото име. По принцип, обаче е добре да се именуват br0, br1 и т.н.
След като сме създали мостовия интерфейс, към него трябва да добавим и реалните интерфейси като портове.
# brctl addif br0 eth0
# brctl addif br0 eth1
От тук нататък може да използваме мостовия интерфейс като всеки друг интерфейс в Линукс. Първото нещо което трябва да направим е да му дадем мрежов адрес и да го вдигнем.
# ifconfig br0 10.1.9.1 netmask 255.255.255.0 broadcast 10.1.9.255 up
# ifconfig br0
br0 Link encap:Ethernet HWaddr 10:00:01:04:71:06
inet addr:10.1.9.1 Bcast:10.1.9.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:49 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:9442 (9.2 KiB)
Командата brctl има опция ‘show’ function, чрез която можем да видим състоянието на мостовите интерфейси на машината.
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.100001047106 yes eth0 eth1
Нека да отбележим, че „bridge id“ се използва от Spanning Tree протокола, който е обяснен по-нататък.
В този момент би трябвало да имате ping от моста до клиенти от двата сегмента на мрежата.
bridge01:/# ping -c 1 -n 10.1.9.2
PING 10.1.9.2 (10.1.9.2) 56(84) bytes of data.
64 bytes from 10.1.9.2: icmp_seq=1 ttl=64 time=20.6 ms
bridge01:/# ping -c 1 -n 10.1.9.4
PING 10.1.9.4 (10.1.9.4) 56(84) bytes of data.
64 bytes from 10.1.9.4: icmp_seq=1 ttl=64 time=20.6 ms
Би трябвало също да имате връзка от единия сегмент до другия през моста.
linux01:/# ping -c 1 -n 10.1.9.5
PING 10.1.9.5 (10.1.9.5) 56(84) bytes of data.
64 bytes from 10.1.9.5: icmp_seq=1 ttl=64 time=20.6 ms
По-важното е, че трябва да се вижда като трафик между две усторйства в един мрежов сегмент. Това може да се провери по следния начин. Пускаме tcpdump на една машина и пращаме ICMP от втора машина към трета. Първата машина е в единия сегмент а другите две са в другия сегмент.
linux03:/# tcpdump -n -i eth0 icmp
linux01:/# ping -n 10.1.9.3
PING 10.1.9.3 (10.1.9.3) 56(84) bytes of data.
64 bytes from 10.1.9.3: icmp_seq=1 ttl=64 time=20.6 ms
Ако мостът работи правилно машината, на която сме пуснали tcpdump, не трябва да вижда трафика между другите две, въпреки че се намират в един и същ логическа мрежа.
От друга страна ако пратим ICMP пакет на broadcast адреса на мрежата, моста трябва да до предаде и във другия сегмент.
linux01:/# ping -c 1 -b 10.1.9.255
WARNING: pinging broadcast address
PING 10.1.9.255 (10.1.9.255) 56(84) bytes of data.
64 bytes from 10.1.9.2: icmp_seq=1 ttl=64 time=0.251 ms
linux03:/# tcpdump -n -i eth0 icmp
tcpdump: listening on eth0
19:39:48.273806 10.1.9.2 > 10.1.9.255: icmp: echo request (DF)
19:39:48.273965 10.1.9.4 > 10.1.9.2: icmp: echo reply
19:39:48.274582 10.1.9.5 > 10.1.9.2: icmp: echo reply
Важно е да се спомене, че ако не бяхме дали мрежов адрес на моста, той пак щеше да работи, но нямаше да може да участва в комуникацията от по-високо ниво от layer 2.
С командата ‘showmacs’ можем да видим MAC адресите на устройствата в мрежата и на кой порт са свързани.
bridge01:/# brctl showmacs br0
port no mac addr is local? ageing timer
2 10:00:01:02:24:04 no 0.49
1 10:00:01:02:95:35 no 0.98
1 10:00:01:02:34:56 no 3.84
2 10:00:01:03:26:02 no 9.19
1 10:00:01:03:73:03 yes 0.00
2 10:00:01:04:71:06 yes 0.00
Този списък показва MAC адресите на шест устройства свързани в мрежата. Периода откакто мостът е видял пакет от определен MAC адрес се нарича Ageing Time. След определено време мостът ще премахне адреса от своя списък. Това осигурява актуална таблица ако има устройства, които се местят от един порт на друг.
Времето, което мостът да държи записа за адреса в таблицата си, може да се конфигурира с ‘setageingtime’ командата:
# brctl setageingtime br0 40
Това ще накара мостът да премахва адреси от таблицата си след 40 секунди.
Премахване на мостови портове и мостови интерфейси
Ако ви се налага да пременете порт от моста, можете да го направите така :
# brctl delif br0 eth1
Ако искате да премахнете мостът изцяло трябва да използвате ‘delbr’, но трябва да свалите интерфейса преди да направите това.
# ifconfig br0 down
# brctl delbr br0
Spanning Tree протоколът
Spanning Tree Protocol (STP) се използва от суичове, когато в мрежата между тях има повече от един път. По принцип ако суича или моста, които направихме по-горе може да представлява сериозна проблем за нашата мрежа. Например, ако има повреда в устройството, двете части на сегмента няма да могат да комуникират помежду си. Това може коригира когато се добави втори мост. STP позволява тези два моста да комуникират и да се „разберат“, кой да е активен и кок пасивен. Активния мост пренасочва всички пакети, докато пасивния не прави нищо докато няма проблем с активния.
STP е доста сложен протокол и не може да бъде покрит в такава статия затова ще разгледаме само основите на протокола.
Както се уверихме по-рано всеки мост има уникален осем битов номер. Първите два байта представляват приоритета на моста, които могат да се променят ръчно, а следващите шест са MAC адреса на моста. Под Линукс приоритета по подразбиране е 32768. MAC адреса на моста се избира да е този с най-малка стойност от всички MAC адреси на машината. Например 8000.100001037303 е номера на моста с приоритет 32768 (8000 hex) и MAC адрес 10:00:01:03:73:03.
В мрежа с много мостове мостът с най-малък номер се избира да бъде главен(root bridge). Главния мост определя приоритета за всеки дублиращ се път в мрежата. Когато се получат зацикяния между мостове с дублиращи се връзки, някои от портовете трябва да преминато в „blocking“ режим. Това означава, че тези портове няма да предават повече пакети.
По принцип под линукс STP протоколът е изключен по подразбиране. Може да проверите дали е включен или изключен с командата „brctl show br0″, а режима може да се сменя така :
# brctl stp br0 on
или
# brctl stp br0 off
За да получите повече информация за настройките на STP на моста може да ползвате командата „showstp“:
bridge01# brctl showstp br0
br0
bridge id 8000.100001037303
designated root 8000.100001037303
root port 0 path cost 0
max age 20.00 bridge max age 20.00
hello time 2.00 bridge hello time 2.00
forward delay 15.00 bridge forward delay 15.00
ageing time 300.00
hello timer 0.17 tcn timer 0.00
topology change timer 0.00 gc timer 0.00
flags
eth0 (1)
port id 8001 state forwarding
designated root 8000.100001037303 path cost 100
designated bridge 8000.100001037303 message age timer 0.00
designated port 8001 forward delay timer 0.00
designated cost 0 hold timer 0.00
flags
eth1 (2)
port id 8002 state forwarding
designated root 8000.100001037303 path cost 100
designated bridge 8000.100001037303 message age timer 0.00
designated port 8002 forward delay timer 0.00
designated cost 0 hold timer 0.00
flags
Това, което виждаме е че моста е главен мост за мрежата(погледнете „bridge id“ и „designated root“) и освен това и двата му интерфейса предават пакети. Ако пуснем същата команда на втория мост, ще видим някой различия:
bridge02# brctl showstp br0
br0
bridge id 8000.100001087423
designated root 8000.100001037303
root port 1 path cost 100
max age 20.00 bridge max age 20.00
hello time 2.00 bridge hello time 2.00
forward delay 15.00 bridge forward delay 15.00
ageing time 300.00
hello timer 0.00 tcn timer 0.00
topology change timer 0.00 gc timer 238.59
flags
eth1 (1)
port id 8001 state forwarding
designated root 8000.100001037303 path cost 100
designated bridge 8000.100001037303 message age timer 18.63
designated port 8001 forward delay timer 0.00
designated cost 0 hold timer 0.00
flags
eth2 (2)
port id 8002 state blocking
designated root 8000.100001037303 path cost 100
designated bridge 8000.100001037303 message age timer 18.63
designated port 8002 forward delay timer 0.00
designated cost 0 hold timer 0.00
flags
Моста има номер 8000.100001087423, но полето designated root показва номера на другия мост. Това е така понеже само един мост може да бъде главен в една мрежа. Освен това виждаме, че единия от портовете му не предава пакети. Това е смисъла на STP протокола. Той предпазва мрежата от зацикляне на пакети междъ мостове. Ако мостът получи пакети, които трябва да бъдат предадени на друд мрежов сегмент, той ще ги игнорира понеже дргуя мост ще ги обработи.
Ако, по някаква причина, искате да смените приоритета на мост, можете да го направите с ‘setbridgeprio’ командатаcommand. Тук сменяме приоритета на 4096 (1000 hex).
# brctl setbridgeprio br0 4096
Сега можем да се уверим, че номера на моста се е сменил.
# brctl show
bridge name bridge id STP enabled interfaces
br0 1000.100001047106 yes eth0
eth1
Възможно е да се слага приоритет и на порт. Това може да е нужно, когато по-бавния порт е избран за главен вместо по-бързия и искате да промените това.
# brctl setportprio br0 eth1 50
В зависимост от топологията на мрежата някой мостови портове може да си сменят режима от „forwarding“ в „blocking“. Това се случва когато чсто от мрежата е недостижима, но би трябвало бързо да се стабилизира.
За повече информация относно Spanning Tree протоколът: IEEE 802.1D specification.
Заключение
След като сте прочели тази статия може да експериментирате с по-слжни конфигурации. Това може да ви е полезно ако имате много виртуални машини и трябва да свържите мрежите, в които се намират те с мостове. Така можете да направите сравнително сложни топологии.
Possibly Related Posts: