xg-scale
diff bridge.tex @ 0:4730a0d07d88
Исходники курса после первого прочтения.
Правки (которых должно быть много),
ещё пока не вносились.
Правки (которых должно быть много),
ещё пока не вносились.
author | Igor Chubin <igor@chub.in> |
---|---|
date | Tue Jul 01 16:16:44 2008 +0300 (2008-07-01) |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/bridge.tex Tue Jul 01 16:16:44 2008 +0300 1.3 @@ -0,0 +1,563 @@ 1.4 +\section{Программный мост в Linux} 1.5 + 1.6 +\textbf{Бридж} (англ. \textit{bridge}, мост) — это способ соединения двух сегментов Ethernet на канальном уровне, т.е. без использования протоколов более высокого уровня, таких как IP. Пакеты передаются на основе Ethernet-адресов, а не IP-адресов (как в маршрутизаторе). Поскольку передача выполняется на канальном уровне (уровень 2 модели OSI), все протоколы более высокого уровня прозрачно проходят через мост. 1.7 + 1.8 +Термины коммутатор, мост и бридж могут использоваться на данной странице как взаимознаменяемые. 1.9 + 1.10 +Код bridge в Linux является частичной реализацией стандарта \htmladdnormallinkfoot{ANSI/IEEE 802.1d}{http://standards.ieee.org/getieee802/}. 1.11 +Впервые бриджинг в Linux появился в 2.2, затем код был переписан 1.12 +Леннертом Буйтенхеком (Lennert Buytenhek). 1.13 +Код bridge интегрирован в ядра серий 2.4 и 2.6. 1.14 + 1.15 +\subsection{Коммутация и фильтрация} 1.16 +Linux-мосты более мощные чем простые аппаратные мосты и коммутаторы, 1.17 +поскольку они могут ещё фильтровать и регулировать трафик. 1.18 +Комбинация коммутатора и брандмауэра выполняется с помощью 1.19 +родственного проекта 1.20 +ebtables. 1.21 + 1.22 +\subsection{Состояние} 1.23 +Код обновляется как часть ядра Linux 2.4 и 2.6, доступного на kernel.org. 1.24 + 1.25 +Возможные будущие усовершенствования: 1.26 +\begin{itemize} 1.27 +\item Описать фильтрацию STP 1.28 +\item Использовать Netlink interface для управление бриджами (прототип в 2.6.18) 1.29 +\item Добавить поддержку в user space 1.30 +\item Сделать поддержку RSTP и других расширений 802.1d STP 1.31 +\end{itemize} 1.32 + 1.33 +\subsection{Скачивание} 1.34 +Поддержка бриджинга есть в текущих ядрах 2.4 и 2.6 1.35 +всех основных дистрибутивов Linux. Требуемый комплект утилит для администрирования 1.36 +\textit{bridge-utils} есть практически во всех дистрибутивах. 1.37 + 1.38 +Инсталляция утилит выполняется стандартным для дистрибутива способом. 1.39 +Например, в Debian GNU/Linux: 1.40 +\begin{verbatim} 1.41 + # apt-get install bridge-utils 1.42 +\end{verbatim} 1.43 + 1.44 +Исходный код последнего релиза утилит можно получить со \htmladdnormallinkfoot{этой}{http://sourceforge.net/project/showfiles.php?group\_id=26089} страницы. 1.45 + 1.46 +Как вариант можно сделать свою самую последнюю сборку кода 1.47 +с kernel.org 1.48 +и собрать утилиты bridge-utils из GIT-репозитория. 1.49 + 1.50 +\begin{verbatim} 1.51 + $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/bridge-utils.git 1.52 + $ cd bridge-utils 1.53 + $ autoconf 1.54 + $ ./configure 1.55 +\end{verbatim} 1.56 + 1.57 +\subsection{Ручная конфигурация} 1.58 +\subsubsection{Сетевые карты} 1.59 +Перед тем как вы приступите к настройке коммутатора, убедитесь, 1.60 +что сетевые карты работают нормально. 1.61 +Не устанавливайте на них IP-адресов, и не позволяйте начальным скриптам 1.62 +выполнять DHCP-запрос с них. 1.63 +IP-адреса должны устанавливаться уже после того как бридж сконфигурирован. 1.64 + 1.65 +Команда ifconfig должна показывать обе (или больше, если их больше) сетевые карты, и они должны быть выключены, т.е. находиться в состоянии DOWN 1.66 +(это на момент начала настройки, дальше они будут переведены в UP). 1.67 + 1.68 +\subsubsection{Загрузка модуля} 1.69 +В большинстве случаев код коммутатора оформляется в виде модуля. 1.70 +Если модуль сконфигурирован и установлен корректно, 1.71 +он автоматически загружается при первом вызове команды \textbf{brctl}. 1.72 + 1.73 +Если ваши утилиты bridge-utilities корректно установлены, 1.74 +и ядро и его модуль bridge в порядке, вызовом команды \textbf{brctl} 1.75 +можно будет просмотреть маленькую сводку о синтаксисе команды: 1.76 +\begin{verbatim} 1.77 +# brctl 1.78 +# commands: 1.79 + addbr <bridge> add bridge 1.80 + delbr <bridge> delete bridge 1.81 + addif <bridge> <device> add interface to bridge 1.82 + delif <bridge> <device> delete interface from bridge 1.83 + setageing <bridge> <time> set ageing time 1.84 + setbridgeprio <bridge> <prio> set bridge priority 1.85 + setfd <bridge> <time> set bridge forward delay 1.86 + sethello <bridge> <time> set hello time 1.87 + setmaxage <bridge> <time> set max message age 1.88 + setpathcost <bridge> <port> <cost> set path cost 1.89 + setportprio <bridge> <port> <prio> set port priority 1.90 + show show a list of bridges 1.91 + showmacs <bridge> show a list of mac addrs 1.92 + showstp <bridge> show bridge stp info 1.93 + stp <bridge> <state> turn stp on/off 1.94 +\end{verbatim} 1.95 + 1.96 +\subsubsection{Создание и удаление коммутатора} 1.97 +Команда 1.98 +\begin{verbatim} 1.99 + brctl addbr bridgename 1.100 +\end{verbatim} 1.101 + 1.102 +создаёт экземпляр логического коммутатора с именем \textit{bridgename}. 1.103 +Для того чтобы выполнять коммутацию пакетов, нужно создать хотя бы один коммутатор . 1.104 +Можно воспринимать логический бридж как контейнер интерфейсов, 1.105 +принимающих участие в коммутации. 1.106 +Каждый экземпляр коммутатора представлен новым сетевым интерфейсом. 1.107 + 1.108 +Соответствующая команда для удаления коммутатора: 1.109 +\begin{verbatim} 1.110 + brctl delbr bridgename 1.111 +\end{verbatim} 1.112 + 1.113 +\subsubsection{Включение устройства в коммутатор} 1.114 +Команда 1.115 +\begin{verbatim} 1.116 + brctl addif bridgename device 1.117 +\end{verbatim} 1.118 +\noindent включает сетевое устройство \textit{device} 1.119 +в коммутатор с именем \textit{bridgename}. 1.120 +Все устройства, включенные в один бридж работают как одна большая сеть. 1.121 +Нельзя добавить устройство в несколько бриджей одновременно, 1.122 +поскольку это не имеет никакого смысла. 1.123 +Коммутатору потребуется небольшое время после того как устройство 1.124 +подключено, для того чтобы узнать его Ethernet-адрес, а затем 1.125 +он начинает делать перенаправление (forward). 1.126 + 1.127 +Соответствующая команда для выключения устройства из коммутатора: 1.128 +\begin{verbatim} 1.129 + brctl delif bridgename device 1.130 +\end{verbatim} 1.131 + 1.132 +\subsubsection{Просмотр устройств} 1.133 +Команда \textbf{brctl} \verb|show| показывает состояние всех работающих коммутаторов: 1.134 +\begin{verbatim} 1.135 + # brctl addbr br549 1.136 + # brctl addif br549 eth0 1.137 + # brctl addif br549 eth1 1.138 + # brctl show 1.139 + bridge name bridge id STP enabled interfaces 1.140 + br549 8000.00004c9f0bd2 no eth0 1.141 + eth1 1.142 +\end{verbatim} 1.143 +Если выполнить команду \textbf{brctl} \verb|showmacs|, 1.144 +будет показана информация о сетевых адресах 1.145 +источников трафика, прошедшего через коммутатор 1.146 +(и самого коммутатора тоже): 1.147 + 1.148 +\begin{verbatim} 1.149 + # brctl showmacs br549 1.150 + port no mac addr is local? ageing timer 1.151 + 1 00:00:4c:9f:0b:ae no 17.84 1.152 + 1 00:00:4c:9f:0b:d2 yes 0.00 1.153 + 2 00:00:4c:9f:0b:d3 yes 0.00 1.154 + 1 00:02:55:1a:35:09 no 53.84 1.155 + 1 00:02:55:1a:82:87 no 11.53 1.156 + ... 1.157 +\end{verbatim} 1.158 + 1.159 +Время жизни (aging time) -- это количество секунд, которое 1.160 +MAC-адрес будет находится в таблице forwarding database 1.161 +после получения пакета с этим адресом. 1.162 +Записи в таблице периодически удаляются по тайм-ауту, 1.163 +для того чтобы не получилось, что они будут находиться там вечно. 1.164 +В нормальной ситуации, не понадобится менять данные параметры, 1.165 +но это сделать можно (время указывается в секундах) 1.166 + 1.167 +\begin{verbatim} 1.168 + # brctl setageing ''bridgename'' ''time'' 1.169 +\end{verbatim} 1.170 + 1.171 +Если установить время в ноль, запись становится постоянной. 1.172 + 1.173 +\subsubsection{Spanning Tree Protocol} 1.174 +Если используется несколько коммутаторов, для того чтобы избежать петель коммутации, нужно включить поддержку протокола 1.175 +Spanning Tree Protocol (Протокол остовного дерева). 1.176 + 1.177 +\begin{verbatim} 1.178 + # brctl stp br549 on 1.179 +\end{verbatim} 1.180 + 1.181 +Посмотреть параметры STP можно так: 1.182 + 1.183 +\begin{verbatim} 1.184 + # brctl showstp br549 1.185 + br549 1.186 + bridge id 8000.00004c9f0bd2 1.187 + designated root 0000.000480295a00 1.188 + root port 1 path cost 104 1.189 + max age 20.00 bridge max age 200.00 1.190 + hello time 2.00 bridge hello time 20.00 1.191 + forward delay 150.00 bridge forward delay 15.00 1.192 + ageing time 300.00 gc interval 0.00 1.193 + hello timer 0.00 tcn timer 0.00 1.194 + topology change timer 0.00 gc timer 0.33 1.195 + flags 1.196 + 1.197 + eth0 (1) 1.198 + port id 8001 state forwarding 1.199 + designated root 0000.000480295a00 path cost 100 1.200 + designated bridge 001e.00048026b901 message age timer 17.84 1.201 + designated port 80c1 forward delay timer 0.00 1.202 + designated cost 4 hold timer 0.00 1.203 + flags 1.204 + 1.205 + eth1 (2) 1.206 + port id 8002 state disabled 1.207 + designated root 8000.00004c9f0bd2 path cost 100 1.208 + designated bridge 8000.00004c9f0bd2 message age timer 0.00 1.209 + designated port 8002 forward delay timer 0.00 1.210 + designated cost 0 hold timer 0.00 1.211 + flags 1.212 +\end{verbatim} 1.213 + 1.214 +\paragraph{Настройка STP} 1.215 +Конфигурироваться может несколько параметров, имеющих отношение к Spanning Tree Protocol. 1.216 +Код автоматически определяет скорость соединения и другие параметры, 1.217 +поэтому, как правило, вручную их менять не нужно. 1.218 + 1.219 +\paragraph{Приоритет коммутатора} 1.220 +У каждого коммутатора есть относительный приоритет (priority) и стоимость (cost). 1.221 +Каждый интерфейс коммутатора ассоциируется с номером порта в коде STP. У каждого есть приоритет и стоимость, на основе которых принимается решение о том, какой путь для передчи пакета является кратчайшим. Всегда используется путь с наимеьшей стоимостью (за исключением случая, когда этот путь разорван). 1.222 +Если у вас несколько коммутаторов и интерфейсов, 1.223 +может понадобиться отрегулировать приоритеты, чтобы достичь максимальной 1.224 +производительности. 1.225 + 1.226 +\begin{verbatim} 1.227 + # brctl setbridgeprio ''bridgename'' ''priority'' 1.228 +\end{verbatim} 1.229 + 1.230 +Бридж с наименьшим приоритетом избирается как \textit{корневой}. 1.231 +Корневой бридж является центром остовного дерева (spanning tree) 1.232 +коммутационных связей. 1.233 + 1.234 +\paragraph{Приоритет и стоимость} 1.235 +У каждого интерфейса моста может быть своя собственная скорость, и её значение 1.236 +используется при выборе какое соединение должно использоваться. 1.237 +У более быстрых интерфейсов должна быть более низкая стоимость. 1.238 + 1.239 +\begin{verbatim} 1.240 + # brctl ''setpathcost bridge port cost'' 1.241 +\end{verbatim} 1.242 + 1.243 +Для разных портов, имеющих одинаковую стоимость 1.244 +существует ещё \textit{приоритет}. 1.245 + 1.246 +\paragraph{Задержка передачи (Forwarding delay)} 1.247 +Задержка передачи (forwarding delay) это время 1.248 +в течение которого порт находится в состояниях 1.249 +Listening и Learning, прежде чем перейти в состояние Forwarding. 1.250 +Это время нужно для того чтобы мост, когда он включается в 1.251 +сеть, сначала должен ознакомиться с трафиком, прежде чем включаться 1.252 +в работу. 1.253 + 1.254 +\begin{verbatim} 1.255 + # brctl setfd ''bridgename'' ''time'' 1.256 +\end{verbatim} 1.257 + 1.258 +\paragraph{Время Hello} 1.259 +Время от времени 1.260 +корневой мост (Root Bridge) 1.261 +и выделенные мосты (Designated Bridges) 1.262 +отправляют пакет \textit{hello}. 1.263 +Пакеты hello нужны для обмена информацией 1.264 +о топологии все коммутироемой локальной сети. 1.265 + 1.266 +\begin{verbatim} 1.267 + # brctl sethello ''bridgename'' ''time'' 1.268 +\end{verbatim} 1.269 + 1.270 +\paragraph{max age -- таймаут hello} 1.271 +Если другой коммутатор в дереве spanning tree не отправляет пакет hello 1.272 +в течение долгого времени, считается, что он не в порядке (dead). 1.273 +Таймаут устанавливается командой: 1.274 +\begin{verbatim} 1.275 + # brctl maxage ''bridgename'' ''time'' 1.276 +\end{verbatim} 1.277 + 1.278 +\subsubsection{Пример настройки} 1.279 +Базовая настройка моста выполняется так: 1.280 + 1.281 +\begin{verbatim} 1.282 + # ifconfig eth0 0.0.0.0 1.283 + # ifconfig eth1 0.0.0.0 1.284 + # brctl addbr mybridge 1.285 + # brctl addif mybridge eth0 1.286 + # brctl addif mybridge eth1 1.287 + # ifconfig mybridge up 1.288 +\end{verbatim} 1.289 + 1.290 +Хост настраивается как обычный мост. 1.291 +У него самого нет IP-адреса, поэтому к нему 1.292 +нельзя получить доступ (или взломать) удалённо 1.293 +по TCP/IP. 1.294 + 1.295 +Опционально можно настроить виртуальный интерфейс \textit{mybridge} 1.296 +на доступ по локальной сети. 1.297 +Он будет работать как обычный интерфейс -- как сетевая карта. 1.298 +Процесс настройки полностью совпадает с вышеописанным, 1.299 +за тем исключением, что нужно заменить 1.300 +последнюю команду на такую: 1.301 + 1.302 +\begin{verbatim} 1.303 + # ifconfig mybridge 192.168.100.5 netmask 255.255.255.0 1.304 +\end{verbatim} 1.305 + 1.306 +Если вы хотите чтобы мост автоматически получал IP-адрес 1.307 +у ADSL-модема по DHCP (или в другой похожей ситуации), 1.308 +сделайте так: 1.309 + 1.310 +\begin{verbatim} 1.311 + # ifconfig eth0 0.0.0.0 1.312 + # ifconfig eth1 0.0.0.0 1.313 + # brctl addbr mybridge 1.314 + # brctl addif mybridge eth0 1.315 + # brctl addif mybridge eth1 1.316 + # dhclient mybridge 1.317 +\end{verbatim} 1.318 + 1.319 +Если делать это много раз, процессов \textbf{dhclient} может расплодиться великое множество. Или безжалостно убейте их, или почитайте об \textbf{omshell}. 1.320 + 1.321 +\subsection{Конфигурирование через /etc/net} 1.322 +Сначала в \texttt{/etc/net} настраиваются два ethernet-устройства port0 и port1: 1.323 +\begin{verbatim} 1.324 + # cat >> /etc/net/iftab 1.325 + port0 mac 00:13:46:66:01:5e 1.326 + port1 mac 00:13:46:66:01:5f 1.327 + ^D 1.328 + # mkdir /etc/net/ifaces/port0 1.329 + # cat > /etc/net/ifaces/port0/options 1.330 + TYPE=eth 1.331 + MODULE=via-rhine 1.332 + # mkdir /etc/net/ifaces/port1 1.333 + # cat > /etc/net/ifaces/port1/options 1.334 + TYPE=eth 1.335 + MODULE=via-rhine 1.336 + ^D 1.337 +\end{verbatim} 1.338 +После этого описывается мост: 1.339 +\begin{verbatim} 1.340 + # mkdir /etc/net/ifaces/mybridge 1.341 + # cat > /etc/net/ifaces/mybridge/options 1.342 + TYPE=bri 1.343 + HOST='port0 port1' 1.344 + ^D 1.345 + # cat > /etc/net/ifaces/mybridge/brctl 1.346 + stp AUTO on 1.347 + ^D 1.348 +\end{verbatim} 1.349 +После этого можно поднять бридж командой \textbf{ifup} \texttt{mybridge}. Устройства port0 и port1 поднимутся автоматически. 1.350 + 1.351 +\subsection{FAQ} 1.352 +\subsubsection{Что делает мост/коммутатор?} 1.353 +Мост прозрачно пересылает трафик между несколькими сетевыми интерфейсами. 1.354 +На простом языке это означает, что коммутатор соединяет два или более интерфейсов Ethernet между собой, для того чтобы получилась большая Ethernet-сеть. 1.355 + 1.356 +\subsubsection{Это как-то зависит от используемых протоколов?} 1.357 +Нет. Коммутатор ничего не знает о протоколах высокого уровня, он только видит кадры Ethernet. Поэтому функциональность моста является протоколонезависимой и проблем с передачей протоколов таких как IPX, NetBEUI, IP, IPv6 и других быть не должно. 1.358 + 1.359 +\subsubsection{Чем этот код лучше чем аппаратный коммутатор?} 1.360 +Пожалуйста, имейте в виду, что этот код не писался 1.361 +с целью заменить Linux-боксами выделенное сетевое оборудование. 1.362 +Не надо воспринимать Linux с этим кодом как замену аппаратным коммутаторам. 1.363 +Это скорее расширение сетевых возможностей Linux. Как бывает, что Linux-маршрутизатор лучше чем аппаратный маршрутизатор (и наоборот), 1.364 +есть ситуации, когда Linux-мост лучше чем выделенный мост (и наоборот). 1.365 + 1.366 +Основная сила кода моста Linux это его гибкость. 1.367 +И так есть уже огромнейшее количество всяких интересных 1.368 +вещей, которые можно делать с Linux (см. например, Linux Advanced Routing and Traffic Control), и мосты -- ещё одно добавление к этой гремучей смеси. 1.369 + 1.370 +Одним из главных преимуществ решения, базирующегося на Linux, 1.371 +в сравнении с выделенным коммутатором 1.372 +являются разнообразные возможности по фильтрации трафика. 1.373 +Можно использовать всю функциональность netfilter (iptables) в комбинации 1.374 +с мостами, что даёт больший функционал, чем проприетарные решения. 1.375 + 1.376 +\subsubsection{Чем этот код хуже чем аппаратный коммутатор?} 1.377 +Для того чтобы работать в качестве моста, 1.378 +устройство должно быть переведено в неразборчивый (promiscuous) 1.379 +режим, в котором оно получает весь трафик, приходящий на интерфейс. 1.380 +В действительно загруженных сетях, это может занять значительную часть 1.381 +процессора, замедляя работу системы. 1.382 +Выход -- или использовать выделенную Linux-систему в качестве моста 1.383 +или использовать аппаратный коммутатор. 1.384 + 1.385 +\subsubsection{Какова производительность моста?} 1.386 +Производительность ограничивается используеммыми сетевыми картами и процессором. 1.387 +Джеймс Ю (James Yu) из университета DePaul провёл исследование, 1.388 +в котором выполнил сравнение Linux моста и коммутатора Catalyst 1.389 +Yu-Linux-TSM2004.pdf 1.390 + 1.391 +\subsubsection{Моего моста не видно в трассе traceroute\rq{}а!} 1.392 +И не должно быть видно. 1.393 +Работа моста является полностью прозрачной для сети (по крайней мере должна); 1.394 +сети, которые мост соединяет между собой должны видеться как одна большая сеть. 1.395 +Именно поэтому мост и не виден в traceroute; пакеты и не думают о том, что они пересекают границы подсети. 1.396 + 1.397 +Дополнительная информация об этом в книгах по сетям TCP/IP. 1.398 + 1.399 +\subsubsection{Ничего не работает!} 1.400 +Когда я пытаюсь добавить мост, система говорит: \dq{}br\_add\_bridge: bad address\dq{}! 1.401 + 1.402 +Или ваше ядро слишком старое (2.2 или более ранее), или вы забыли включить поддержку бриджей в ядро. 1.403 + 1.404 +\subsubsection{Работает ли бриджинг на ядре 2.2?} 1.405 +Изначально разработка велась на 2.2, есть патчи для этого ядра. 1.406 +Но сейчас эти патчи уже не поддерживаются и не развиваются. 1.407 + 1.408 +\subsubsection{Есть ли в планах поддержка RSTP (802.1w)?} 1.409 +Да. Ведётся работа по включению поддержки RSTP в будущий релиз для ядра 2.6. Код делался для ядра 2.4 и нуждается в доработке, тестировании и обновлении. 1.410 + 1.411 +\subsubsection{Что можно соединять с помощью моста?} 1.412 +Мосты Linux очень гибкие; можно соединять 1.413 +как традиционные ethernet-устройства, так и псевдоустройства такие 1.414 +как PPP, VPN или VLAN\rq{}ы. 1.415 + 1.416 +Ограничения, которые накладываются на соединяемые устройства: 1.417 +\begin{itemize} 1.418 +\item У всех должен быть одинаковый максимальный размер пакета (MTU). Мост не выполняет фрагментирование пакетов. 1.419 +\item Устройства должны выглядеть как Ethernet, т.е. у них должны быть 6-байтные адреса отправителя и получателя. 1.420 +\item Должен поддерживаться неразборчивый (promiscuous) режим. Мост должен получать не только трафик, адресованный ему, но и весь сетевой трафик. 1.421 +\item Должен быть разрешён спуфинг адресов. У моста должна быть возможность отправлять данные по сети, как если бы они пришли от другого хоста. 1.422 +\end{itemize} 1.423 + 1.424 +\subsubsection{Можно ли выполнять коммутацию в сочетании с netfilter/iptables?} 1.425 +Да. Соответствующий код включен в большинство ядер. Смотрите проект ebtables. 1.426 + 1.427 +\subsubsection{Работает ли он с Token Ring, FDDI и Firewire?} 1.428 +Нет. У этих протоколов отличается адресация и размер кадра. 1.429 + 1.430 +\subsubsection{Я продолжаю получать сообщение \dq{}retransmitting tcn bpdu\dq{}!} 1.431 +Это означает, что ваш Linux-мост ретранслирует сообщение 1.432 +Topology Change Notification Bridge Protocol Data Unit 1.433 +Это означает что где-то есть коммутатор (или другой Linux-мост), 1.434 +который не согласен с правилами STP. 1.435 + 1.436 +В каждой коммутируемой сети есть один \dq{}главный коммутатор\dq{}, 1.437 +который также называется \textit{корневым} (root). 1.438 +Какой именно мост является корневым можно узнать с помощью \textbf{brctl}. 1.439 + 1.440 +Когда топология коммутируемой сети меняется (например, кто-то выдернул 1.441 +кабель между коммутаторами), коммутатор, который это обнаружил, 1.442 +отправляет сообщение корневому коммутатору. 1.443 +Корневой коммутатор устанавливает бит \rq{}topology changed\rq{} 1.444 +в пакеты hello, которые будут отправляеться в течение следующих X секунд 1.445 +(обычно X равно 30). В результате все мосты узнают об изменении топологии, 1.446 +и они могут работать с учётом этого -- например удалить устаревшие MAC-записи. 1.447 + 1.448 +После того как коммутатор отправляет сообщение об изменении топологии, 1.449 +он ждёт что в hello-сообщении будет установлени бит \rq{}\dq{}topology changed\dq{}. 1.450 +Если его нет (бит в данном случае играет роль подтверждения получения информации 1.451 +о смене топологии), коммутатор решает, что сообщение было потеряно. 1.452 +Поэтому пересылает сообщение повторно. 1.453 +Однако, в некоторых коммутаторах реализациия 1.454 +STP немного недоделанная, и они не отправляют подтверждение 1.455 +получения сообщения об изменении топологии. 1.456 +Если один из таких коммутаторов у вас корневой, 1.457 +все остальные коммутаторы будут постоянно повторно пересылать 1.458 +информацию об изменении топологии. 1.459 +В результате чего и будут появляеться такие сообщения. 1.460 + 1.461 +Список вещей, которые можно сделать: 1.462 +\begin{itemize} 1.463 +\item Найти какой коммутатор является корневым, где он находится и под управлением какого программного обеспечения работает. Пожалуйста, сообщите о таком коммутаторе в список рассылки, чтобы можно было его добавить в blacklist. 1.464 +\item Заставить Linux-мост быть корневым. Найдите какой приоритет у коммутатора, который сейчас является корневым, и с помощью команды \textbf{brctl} \verb|setbridgeprio| установите приоритет линуксового моста на 1 меньше (Мост с наименьшим приоритеом всегда становится корневым). 1.465 +\item Вообще отключите STP на Linux-мосте. Только смотрите чтобы не появилось петель коммутации! Если у вас есть петли, и не работает STP, пакеты зациклятся и будут гулять по сети вечно, что сделает её нерабочей. 1.466 +\end{itemize} 1.467 + 1.468 +\subsubsection{Оно не работает с моей обычной ethernet-карточкой!} 1.469 +К сожалению, у некоторых сетевых карт глючные драйверы, 1.470 +которые сбоят во время загрузки. 1.471 +Ситуация улучшается, поэтому может помочь установка текущего ядра и сетевых драйверов. Ещё можно попробовать устройства другого производителя. 1.472 + 1.473 +Пожалуйста, сообщайте обо всех проблемах 1.474 +в список рассылки \dq{}Bridge mailing list\dq{}: bridge@osdl.org. 1.475 +Если ваша сетевая карта не работает даже без бриджинга, 1.476 +попробуйте обратиться в список рассылки 1.477 +\dq{}Linux networking mailing list\dq{} linux-net@vger.kernel.org. 1.478 + 1.479 +\subsubsection{Оно не работает с моей wireless-карточкой!} 1.480 +Это известная проблема, и она не связана с кодом моста. 1.481 +Большое количество wireless-карт не позволяет делать подмену (spoofing) 1.482 +адреса источника. В некоторых чипсетах это ограничение на уровне прошивки (firmware). 1.483 +Дополнительная информация может быть найдена в архивах списков рассылки. 1.484 + 1.485 +Удалось ли кому-нибудь обойти проблему связанную с тем, 1.486 +что Wavelan не позволяет использовать никакие MAC-адреса за исключением 1.487 +своего собственного? 1.488 + 1.489 +\textit{(Отвечает Michael Renzmann, mrenzmann at compulan.de)} 1.490 + 1.491 +99\% пользователей никогда не смогут избавиться от этой проблемы. 1.492 +Для такой функции нужна специальная прошивка. Её нужно загрузить 1.493 +в память WaveLAN-карточки и тогда карточка сможет выполнять бриджинг. 1.494 +Но нет общедоступной документации интерфейса. 1.495 +Единственный выход -- иметь полную версию библиотеки hcf, 1.496 +которая контролирует все действия карты, и в частности, 1.497 +доступ к памяти карты. 1.498 +Для получения этой библиотеки нужно убедить компанию Lucent, 1.499 +что это ей будет выгодно и помимо этого подписать NDA. 1.500 +Поэтому, скорее всего, пока Lucent не передумает, 1.501 +вам не удастся получить доступ к коду (а в том, что Lucent передумает 1.502 +есть большие сомнения). 1.503 + 1.504 +Если вам срочно нужна wireless-карта которая может работать в мосте, 1.505 +нужно использовать те, что построены на базе чипсета \textit{prism} 1.506 +(изготавливает Harris Intersil). 1.507 +Драйверы для этой карты есть на www.linux-wlan.com 1.508 +(веб-сайт от Absoval), и в одном из сообщений говорится, 1.509 +что общедоступна необходимая прошивка и программа для загрузки для Linux. 1.510 +Если вам нужны какие-то дополнительные возможности, нужно разговаривать 1.511 +с Absoval. 1.512 + 1.513 +\subsubsection{И всё же я не понимаю!!} 1.514 +Полноценный мост для беспроводных сетей (802.11) требует поддержки WDS. 1.515 +В текущей реализации её нет. 1.516 + 1.517 +Можно сделать ограниченную функциональность с некоторыми драйверами. 1.518 +Для этого обязательно чтобы устройство поддерживало 1.519 +разные адреса отправителя и получателя. Что и обеспечивает WDS. 1.520 + 1.521 +Есть способы добиться чтобы оно заработало, но они достаточно запутанные, 1.522 +и их сложно понять без досконального знания 802.11, режимов его работы и формата загловка кадра. 1.523 + 1.524 +\subsubsection{Я получаю ошибку \rq{}too much work in interrupt\rq{}} 1.525 +Это связано с тем, что сетевая карта теряет пакеты. 1.526 +Можно попробовать несколько вещей. Во-первых, собрать 1.527 +драйвер с поддержкой NAPI (если он по умолчанию, не включен). 1.528 +NAPI делает так чтобы получал управление по программному прерыванию, 1.529 +не по прерыванию низкого уровня. 1.530 + 1.531 +Если драйвер не поддерживает NAPI, можно попробовать 1.532 +увеличить объём работы, который драйвер может делать 1.533 +в течение обработки прерывания. 1.534 +Для 3c59x это делается с помощью опции \verb|max_interrupt_work| (поэтому нужно добавить опцию \verb|options 3c59x max_interrupt_work=10000| в файл \texttt{/etc/modules.conf}). 1.535 +У других сетевых карт похожие опции. 1.536 + 1.537 +\subsubsection{Работает ли DHCP через/поверх моста?} 1.538 +Мост передаёт DHCP-трафик (широковещательный) и ответы на него. 1.539 +Также можно использовать DHCP для установки локального IP-адреса на псевдо-интерфейс моста. 1.540 + 1.541 +Одна из распространённых ошибок при использовании DHCP является установка задержки передачи (forwarding delay) на порту коммутатора равной 30 секунд. 1.542 +При такой задержке интерфейс когда он подключился к мосту не может посылать 1.543 +через него данные в течении первых 30 секунд. Причина в том, что при использовании моста в сложной топологии он должен сначала обнаружить остальные мосты дабы не создавать петель. Проблема была одной из причин создания протокола 1.544 +Rapid Spanning Tree Protocol (RSTP). 1.545 + 1.546 +Если мост используется в одиночку (т.е. поблизости нет мостов) 1.547 +можно спокойно отключить задержку передачи (установить её равной 0) 1.548 +перед тем как подключать интерфейс к мосту. 1.549 +После этого сразу же можно вызывать dhclient: 1.550 + 1.551 +\begin{verbatim} 1.552 + # brctl setfd br0 0 1.553 + # brctl addif br0 eth0 1.554 + # dhclient eth0 1.555 +\end{verbatim} 1.556 + 1.557 +\subsection{Дополнительная информация} 1.558 +\begin{itemize} 1.559 +\item \htmladdnormallinkfoot{Linux Bridge}{http://xgu.ru/wiki/Linux\_Bridge} (рус.) 1.560 +\item \htmladdnormallinkfoot{Ethernet VPN bridging}{http://openvpn.sourceforge.net/bridge.html} 1.561 +\item \htmladdnormallinkfoot{Ebtables firewalling}{http://ebtables.sourceforge.net} 1.562 +\item \htmladdnormallinkfoot{Ethernet-bridge + netfilter HOWTO}{http://www.tldp.org/HOWTO/Ethernet-Bridge-netfilter-HOWTO.html} 1.563 +\item \htmladdnormallinkfoot{Linux-bridge STP HOWTO}{http://www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/index.html} 1.564 +\item \htmladdnormallinkfoot{Spanning Tree Protocol}{http://en.wikipedia.org/wiki/Spanning\_tree\_protocol} на Wikipedia 1.565 +\end{itemize} 1.566 +