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 +