Linux bridge что это

Обновлено: 07.07.2024

Термины коммутатор, мост и бридж могут использоваться на данной странице как взаимознаменяемые.

Код bridge в Linux является частичной реализацией стандарта ANSI/IEEE 802.1d. Впервые бриджинг в Linux появился в 2.2, затем код был переписан Леннертом Буйтенхеком (Lennert Buytenhek). Код bridge интегрирован в ядра серий 2.4 и 2.6.

Коммутация и фильтрация

Linux-мосты более мощные чем простые аппаратные мосты и коммутаторы, поскольку они могут ещё фильтровать и регулировать трафик. Комбинация коммутатора и брандмауэра выполняется с помощью родственного проекта ebtables.

Состояние

Возможные будущие усовершенствования:

  • Описать фильтрацию STP
  • Использовать Netlink interface для управление бриджами (прототип в 2.6.18)
  • Добавить поддержку в user space
  • Сделать поддержку RSTP и других расширений 802.1d STP

Скачивание

Поддержка бриджинга есть в текущих ядрах 2.4 и 2.6 всех основных дистрибутивов Linux. Требуемый комплект утилит для администрирования bridge-utils есть практически во всех дистрибутивах.

Инсталляция утилит выполняется стандартным для дистрибутива способом. Например, в Debian GNU/Linux:

Перед тем как вы приступите к настройке коммутатора, убедитесь, что сетевые карты работают нормально. Не устанавливайте на них IP-адресов, и не позволяйте начальным скриптам выполнять DHCP-запрос с них. IP-адреса должны устанавливаться уже после того как бридж сконфигурирован.

Команда ifconfig должна показывать обе (или больше, если их больше) сетевые карты, и они должны быть выключены, т.е. находиться в состоянии DOWN.

В большинстве случаев код коммутатора оформляется в виде модуля. Если модуль сконфигурирован и установлен корректно, он автоматически загружается при первом вызове команды brctl.

Если ваши утилиты bridge-utilities корректно установлены, и ядро и его модуль bridge в порядке, вызовом команды brctl можно будет просмотреть маленькую сводку о синтаксисе команды:

Создание и удаление коммутатора

brctl addbr "bridgename"

создаёт экземпляр логического коммутатора с именем bridgename. Для того чтобы выполнять коммутацию пакетов, нужно создать хотя бы один коммутатор . Можно воспринимать логический бридж как контейнер интерфейсов, принимающих участие в коммутации. Каждый экземпляр коммутатора представлен новым сетевым интерфейсом.

Соответствующая команда для удаления коммутатора:

brctl delbr bridgename

Включение устройства в коммутатор

brctl addif bridgename device

Соответствующая команда для выключения устройства из коммутатора:

brctl delif bridgename device

Просмотр устройств

Команда brctl show показывает состояние всех работающих коммутаторов:

Если установить время в ноль, запись становится постоянной.

Spanning Tree Protocol

Если используется несколько коммутаторов, для того чтобы избежать петель коммутации, нужно включить поддержку протокола Spanning Tree Protocol (Протокол остовного дерева).

Посмотреть параметры STP можно так:

Настройка STP

Конфигурироваться может несколько параметров, имеющих отношение к Spanning Tree Protocol. Код автоматически определяет скорость соединения и другие параметры, поэтому, как правило, вручную их менять не нужно.

Приоритет коммутатора

У каждого коммутатора есть относительный приоритет (priority) и стоимость (cost). Каждый интерфейс коммутатора ассоциируется с номером порта в коде STP. У каждого есть приоритет и стоимость, на основе которых принимается решение о том, какой путь для передчи пакета является кратчайшим. Всегда используется путь с наимеьшей стоимостью (за исключением случая, когда этот путь разорван). Если у вас несколько коммутаторов и интерфейсов, может понадобиться отрегулировать приоритеты, чтобы достичь максимальной производительности.

Бридж с наименьшим приоритетом избирается как корневой. Корневой бридж является центром остовного дерева (spanning tree) коммутационных связей.

Приоритет и стоимость

У каждого интерфейса моста может быть своя собственная скорость, и её значение используется при выборе какое соединение должно использоваться. У более быстрых интерфейсов должна быть более низкая стоимость.

Для разных портов, имеющих одинаковую стоимость существует ещё приоритет.

Задержка передачи (Forwarding delay)

Задержка передачи (forwarding delay) это время в течение которого порт находится в состояниях Listening и Learning, прежде чем перейти в состояние Forwarding. Это время нужно для того чтобы мост, когда он включается в сеть, сначала должен ознакомиться с трафиком, прежде чем включаться в работу.

Время Hello

Время от времени корневой мост (Root Bridge) и выделенные мосты (Designated Bridges) отправляют пакет hello. Пакеты hello нужны для обмена информацией о топологии все коммутироемой локальной сети.

Если другой коммутатор в дереве spanning tree не отправляет пакет hello в течение долгого времени, считается, что он не в порядке (dead). Таймаут устанавливается командой:

Пример настройки

Базовая настройка моста выполняется так:

Если вы хотите чтобы мост автоматически получал IP-адрес у ADSL-модема по DHCP (или в другой похожей ситуации), сделайте так:

Если делать это много раз, процессов dhclient может расплодиться великое множество. Или безжалостно убейте их, или почитайте об omshell.

Конфигурирование через /etc/net

После этого описывается мост:

После этого можно поднять бридж командой ifup mybridge. Устройства port0 и port1 поднимутся автоматически.

FAQ

Что делает мост/коммутатор?
Мост прозрачно пересылает трафик между несколькими сетевыми интерфейсами. На простом языке это означает, что коммутатор соединяет два или более интерфейсов Ethernet между собой, для того чтобы получилась большая Ethernet-сеть.

Это как-то зависит от используемых протоколов?
Нет. Коммутатор ничего не знает о протоколах высокого уровня, он только видит кадры Ethernet. Поэтому функциональность моста является протоколонезависимой и проблем с передачей протоколов таких как IPX, NetBEUI, IP, IPv6 и других быть не должно.

Чем этот код лучше чем аппаратный коммутатор?
Пожалуйста, имейте в виду, что этот код не писался с целью заменить Linux-боксами выделенное сетевое оборудование. Не надо воспринимать Linux с этим кодом как замену аппаратным коммутаторам. Это скорее расширение сетевых возможностей Linux. Как бывает, что Linux-маршрутизатор лучше чем аппаратный маршрутизатор (и наоборот), есть ситуации, когда Linux-мост лучше чем выделенный мост (и наоборот).

Работает ли бриджинг на ядре 2.2?
Изначально разработка велась на 2.2, есть патчи для этого ядра. Но сейчас эти патчи уже не поддерживаются и не развиваются.

Есть ли в планах поддержка RSTP (802.1w)?
Да. Ведётся работа по включению поддержки RSTP в будущий релиз для ядра 2.6. Код делался для ядра 2.4 и нуждается в доработке, тестировании и обновлении.

Что можно соединять с помощью моста?

Ограничения, которые накладываются на соединяемые устройства:

  • У всех должен быть одинаковый максимальный размер пакета (MTU). Мост не выполняет фрагментирование пакетов.
  • Устройства должны выглядеть как Ethernet, т.е. у них должны быть 6-байтные адреса отправителя и получателя.
  • Должен поддерживаться неразборчивый (promiscuous) режим. Мост должен получать не только трафик, адресованный ему, но и весь сетевой трафик.
  • Должен быть разрешён спуфинг адресов. У моста должна быть возможность отправлять данные по сети, как если бы они пришли от другого хоста.

Можно ли выполнять коммутацию в сочетании с netfilter/iptables?
Да. Соответствующий код включен в большинство ядер. Смотрите проект ebtables.

Работает ли он с Token Ring, FDDI и Firewire?
Нет. У этих протоколов отличается адресация и размер кадра.

Список вещей, которые можно сделать:

Оно не работает с моей обычной ethernet-карточкой!
К сожалению, у некоторых сетевых карт глючные драйверы, которые сбоят во время загрузки. Ситуация улучшается, поэтому может помочь установка текущего ядра и сетевых драйверов. Ещё можно попробовать устройства другого производителя.

Оно не работает с моей wireless-карточкой!
Это известная проблема, и она не связана с кодом моста. Большое количество wireless-карт не позволяет делать подмену (spoofing) адреса источника. В некоторых чипсетах это ограничение на уровне прошивки (firmware). Дополнительная информация может быть найдена в архивах списков рассылки.

Удалось ли кому-нибудь обойти проблему связанную с тем, что Wavelan не позволяет использовать никакие MAC-адреса за исключением своего собственного?

(Отвечает Michael Renzmann, mrenzmann at compulan.de)

И всё же я не понимаю!!
Полноценный мост для беспроводных сетей (802.11) требует поддержки WDS. В текущей реализации её нет.
Можно сделать ограниченную функциональность с некоторыми драйверами. Для этого обязательно чтобы устройство поддерживало разные адреса отправителя и получателя. Что и обеспечивает WDS. Есть способы добиться чтобы оно заработало, но они достаточно запутанные, и их сложно понять без досконального знания 802.11, режимов его работы и формата загловка кадра.

Работает ли DHCP через/поверх моста?

Мост передаёт DHCP-трафик (широковещательный) и ответы на него. Также можно использовать DHCP для установки локального IP-адреса на псевдо-интерфейс моста. Одна из распространённых ошибок при использовании DHCP является установка задержки передачи (forwarding delay) на порту коммутатора равной 30 секунд. При такой задержке интерфейс когда он подключился к мосту не может посылать через него данные в течении первых 30 секунд. Причина в том, что при использовании моста в сложной топологии он должен сначала обнаружить остальные мосты дабы не создавать петель. Проблема была одной из причин создания протокола Rapid Spanning Tree Protocol (RSTP).

Этот пост November 9, 2007 at 8:14 pm опубликовал molse в категории Linux. Желающие могут оформить RSS подписку на комменты. Оставьте комментарий(последний комментарий отображается первым) или оставьте трэкбэк. Ccылка на трэкбэк.


Бридж (англ. bridge, мост) — это способ соединения двух сегментов Ethernet на канальном уровне, т.е. без использования протоколов более высокого уровня, таких как IP. Пакеты передаются на основе Ethernet-адресов, а не IP-адресов (как в маршрутизаторе). Поскольку передача выполняется на канальном уровне (уровень 2 модели OSI), все протоколы более высокого уровня прозрачно проходят через мост.

Термины коммутатор, мост и бридж могут использоваться на данной странице как взаимозаменяемые.

Код bridge в Linux является частичной реализацией стандарта ANSI/IEEE 802.1d [2]. Впервые бриджинг в Linux появился в 2.2, затем код был переписан Леннертом Буйтенхеком (Lennert Buytenhek). Код bridge интегрирован в ядра серий 2.4 и 2.6.

Содержание

Linux-мосты более мощные чем простые аппаратные мосты и коммутаторы, поскольку они могут ещё фильтровать и регулировать трафик. Комбинация коммутатора и брандмауэра выполняется с помощью родственного проекта ebtables.

Возможные будущие усовершенствования:

  • Описать фильтрацию STP
  • Использовать Netlink interface для управление бриджами (прототип в 2.6.18)
  • Добавить поддержку в user space
  • Сделать поддержку RSTP и других расширений 802.1d STP

Поддержка бриджинга есть в текущих ядрах 2.4 и 2.6 всех основных дистрибутивов Linux. Администрирование осуществляется утилитой brctl из пакета bridge-utils который есть практически во всех дистрибутивах,или в соверменных дистрибутивах утилитами ip и bridge из пакета iproute.

Инсталляция утилит выполняется стандартным для дистрибутива способом.

Например, в Debian GNU/Linux:

Исходный код последнего релиза утилит можно получить со страницы Download.

Перед тем как вы приступите к настройке коммутатора, убедитесь, что сетевые карты работают нормально. Не устанавливайте на них IP-адресов, и не позволяйте начальным скриптам выполнять DHCP-запрос с них. IP-адреса должны устанавливаться уже после того, как бридж сконфигурирован.

Команда ifconfig должна показывать обе (или больше, если их больше) сетевые карты, и они должны быть выключены, т.е. находиться в состоянии DOWN (это на момент начала настройки, дальше они будут переведены в UP).

В большинстве случаев код коммутатора оформляется в виде модуля. Если модуль сконфигурирован и установлен корректно, он автоматически загружается при первом вызове команды brctl.

Если ваши утилиты bridge-utilities корректно установлены, и ядро и его модуль bridge в порядке, вызовом команды brctl можно будет просмотреть маленькую сводку о синтаксисе команды:

создаёт экземпляр логического коммутатора с именем bridgename. Для того чтобы выполнять коммутацию пакетов, нужно создать хотя бы один коммутатор. Можно воспринимать логический бридж как контейнер интерфейсов, принимающих участие в коммутации. Каждый экземпляр коммутатора представлен новым сетевым интерфейсом.

Соответствующая команда для удаления коммутатора:

включает сетевое устройство device в коммутатор с именем "bridgename." Все устройства, включенные в один мост, работают как одна большая сеть. Нельзя добавить устройство в несколько бриджей одновременно, поскольку это не имеет никакого смысла. Коммутатору потребуется небольшое время после того как устройство подключено, для того чтобы узнать его Ethernet-адрес, а затем он начинает передачу (forward).

Соответствующая команда для выключения устройства из коммутатора:

Команда brctl show показывает состояние всех работающих коммутаторов:

Если выполнить команду brctl showmacs, будет показана информация о сетевых адресах источников трафика, прошедшего через коммутатор (и самого коммутатора тоже):

Время жизни (ageing time) - это количество секунд, которое MAC-адрес будет находиться в таблице forwarding database после получения пакета с этим адресом. Записи в таблице периодически удаляются по тайм-ауту, для того чтобы не получилось, что они будут находиться там вечно. В нормальной ситуации, не понадобится менять данные параметры, но это сделать можно (время указывается в секундах)

Если установить время в ноль, запись становится постоянной.

Если используется несколько коммутаторов, для того чтобы избежать петель коммутации, нужно включить поддержку протокола Spanning Tree Protocol (Протокол остовного дерева).

Посмотреть параметры STP можно так:

Конфигурироваться может несколько параметров, имеющих отношение к Spanning Tree Protocol. Код автоматически определяет скорость соединения и другие параметры, поэтому, как правило, вручную их менять не нужно.

У каждого коммутатора есть относительный приоритет (priority) и стоимость (cost). Каждый интерфейс коммутатора ассоциируется с номером порта в коде STP. У каждого есть приоритет и стоимость, на основе которых принимается решение о том, какой путь для передачи пакета является кратчайшим. Всегда используется путь с наименьшей стоимостью (за исключением случая, когда этот путь разорван). Если коммутаторов и интерфейсов несколько, может понадобиться отрегулировать приоритеты, чтобы достичь максимальной производительности.

Бридж с наименьшим приоритетом избирается как корневой. Корневой бридж является центром остовного дерева (spanning tree) коммутационных связей.

У каждого интерфейса моста может быть своя собственная скорость, и её величина учитывается при принятии решения о том, какое соединение должно использоваться. У более быстрых интерфейсов должна быть более низкая стоимость.

Для выбора между разными портами, имеющими одинаковую стоимость, существует ещё приоритет.

Задержка передачи (forwarding delay) это время в течение которого порт находится в состояниях Listening и Learning, прежде чем перейти в состояние Forwarding. Это время нужно для того чтобы мост, когда он включается в сеть, прежде чем включаться в работу, сначала ознакомился с трафиком:

Время от времени корневой мост (Root Bridge) и выделенные мосты (Designated Bridges) отправляют пакет hello. Пакеты hello нужны для обмена информацией о топологии всей коммутируемой локальной сети.

Если другой коммутатор в дереве spanning tree не отправляет пакет hello в течение долгого времени, считается, что он не в порядке (dead). Таймаут устанавливается командой:

Базовая настройка моста выполняется так:

Хост настраивается как обычный мост. У него самого нет IP-адреса, поэтому к нему нельзя получить доступ (или взломать) удалённо по TCP/IP.

Опционально можно настроить виртуальный интерфейс mybridge на доступ по локальной сети. Он будет работать как обычный интерфейс - как сетевая карта. Процесс настройки полностью совпадает с вышеописанным, за тем исключением, что нужно заменить последнюю команду на такую:

Если вы хотите чтобы мост автоматически получал IP-адрес у ADSL-модема по DHCP (или в другой похожей ситуации), сделайте так:

Если делать это много раз, процессов dhclient может расплодиться великое множество. Или безжалостно убейте их, или почитайте об omshell.

Сначала в /etc/net настраиваются два ethernet-устройства port0 и port1:

После этого описывается мост:

После этого можно поднять бридж командой ifup mybridge. Устройства port0 и port1 поднимутся автоматически.

В файл /etc/network/interfaces мост прописывается в виде:

Мост прозрачно пересылает трафик между несколькими сетевыми интерфейсами. На простом языке это означает, что коммутатор соединяет два или более интерфейсов Ethernet между собой, для того чтобы получилась большая Ethernet-сеть.

Нет. Коммутатор ничего не знает о протоколах высокого уровня, он только видит кадры Ethernet. Поэтому функциональность моста является протоколонезависимой, и проблем с передачей протоколов таких как IPX, NetBEUI, IP, IPv6 и других быть не должно.

Пожалуйста, имейте в виду, что этот код не писался с целью заменить Linux-боксами выделенное сетевое оборудование. Не надо воспринимать Linux с этим кодом как замену аппаратным коммутаторам. Это скорее расширение сетевых возможностей Linux. Как бывает, что Linux-маршрутизатор лучше чем аппаратный маршрутизатор (и наоборот), есть ситуации, когда Linux-мост лучше чем выделенный мост (и наоборот).

Основная сила кода моста Linux это его гибкость. И так есть уже огромнейшее количество всяких интересных вещей, которые можно делать с Linux (см. например, Linux Advanced Routing and Traffic Control), и мосты — ещё одно добавление к этой гремучей смеси.

Одним из главных преимуществ решения, базирующегося на Linux, в сравнении с выделенным коммутатором являются разнообразные возможности по фильтрации трафика. Можно использовать всю функциональность netfilter (iptables) в комбинации с мостами, что даёт больший функционал, чем проприетарные решения.

Для того чтобы работать в качестве моста, устройство должно быть переведено в неразборчивый (promiscuous) режим, в котором оно получает весь трафик, приходящий на интерфейс. В действительно загруженных сетях это может занять значительную часть процессора, замедляя работу системы. Выход — или использовать выделенную Linux-систему в качестве моста, или использовать аппаратный коммутатор.

Производительность ограничивается используемыми сетевыми картами и процессором. Джеймс Ю (James Yu) из университета DePaul провёл исследование, в котором выполнил сравнение Linux моста и коммутатора Catalyst Yu-Linux-TSM2004.pdf

И не должно быть видно. Работа моста является полностью прозрачной для сети (по крайней мере должна); сети, которые мост соединяет между собой, должны видеться как одна большая сеть. Именно поэтому мост и не виден в traceroute; пакеты и не думают о том, что они пересекают границы подсети.

Дополнительная информация об этом в книгах по сетям TCP/IP.

Когда я пытаюсь добавить мост, система говорит: "br_add_bridge: bad address"!

Или ваше ядро слишком старое (2.2 или более ранее), или вы забыли включить поддержку бриджей в ядро.

Изначально разработка велась на 2.2, есть патчи для этого ядра. Но сейчас эти патчи уже не поддерживаются и не развиваются.

Да. Ведётся работа по включению поддержки RSTP в будущий релиз для ядра 2.6. Код делался для ядра 2.4 и нуждается в доработке, тестировании и обновлении.

Мосты Linux очень гибкие; можно соединять как традиционные ethernet-устройства, так и псевдоустройства такие как PPP, VPN или VLANы.

Ограничения, которые накладываются на соединяемые устройства:

  • У всех должен быть одинаковый максимальный размер пакета (MTU). Мост не выполняет фрагментирование пакетов.
  • Устройства должны выглядеть как Ethernet, т.е. у них должны быть 6-байтные адреса отправителя и получателя.
  • Должен поддерживаться неразборчивый (promiscuous) режим. Мост должен получать не только трафик, адресованный ему, но и весь сетевой трафик.
  • Должен быть разрешён спуфинг адресов. У моста должна быть возможность отправлять данные по сети, как если бы они пришли от другого хоста.

Да. Соответствующий код включен в большинство ядер. Смотрите проект ebtables.

Нет. У этих протоколов отличается адресация и размер кадра.

В каждой коммутируемой сети есть один "главный коммутатор", который также называется корневым (root). Какой именно мост является корневым, можно узнать с помощью brctl.

Список вещей, которые можно сделать:

  • Найти, какой коммутатор является корневым, где он находится и под управлением какого программного обеспечения работает. Пожалуйста, сообщите о таком коммутаторе в список рассылки, чтобы можно было его добавить в blacklist.
  • Заставить Linux-мост быть корневым. Найдите какой приоритет у коммутатора, который сейчас является корневым, и с помощью команды brctl 'setbridgeprio' установите приоритет линуксового моста на 1 меньше (Мост с наименьшим приоритетом всегда становится корневым).
  • Вообще отключите STP на Linux-мосте. Только смотрите чтобы не появилось петель коммутации! Если у вас есть петли, и не работает STP, пакеты зациклятся и будут гулять по сети вечно, что сделает её нерабочей.

К сожалению, у некоторых сетевых карт глючные драйверы, которые сбоят во время загрузки. Ситуация улучшается, поэтому может помочь установка текущего ядра и сетевых драйверов. Ещё можно попробовать устройства другого производителя.

Это известная проблема, и она не связана с кодом моста. Большое количество wireless-карт не позволяет делать подмену (spoofing) адреса источника. В некоторых чипсетах это ограничение на уровне прошивки (firmware). Дополнительная информация может быть найдена в архивах списков рассылки.

Удалось ли кому-нибудь обойти проблему связанную с тем, что Wavelan не позволяет использовать никакие MAC-адреса за исключением своего собственного?

(Отвечает Michael Renzmann, mrenzmann at compulan.de)

99% пользователей никогда не смогут избавиться от этой проблемы. Для такой функции нужна специальная прошивка. Её нужно загрузить в память WaveLAN-карточки и тогда карточка сможет выполнять бриджинг. Но нет общедоступной документации интерфейса. Единственный выход - иметь полную версию библиотеки hcf, которая контролирует все действия карты, и в частности, доступ к памяти карты. Для получения этой библиотеки нужно убедить компанию Lucent, что это ей будет выгодно и, кроме всего прочего, подписать NDA. Поэтому, скорее всего, пока Lucent не передумает, вам не удастся получить доступ к коду (а в том, что Lucent передумает, есть большие сомнения).

Полноценный мост для беспроводных сетей (802.11) требует поддержки WDS. В текущей реализации её нет.

Можно сделать ограниченную функциональность с некоторыми драйверами. Для этого обязательно чтобы устройство поддерживало разные адреса отправителя и получателя. Что и обеспечивает WDS.

Есть способы добиться чтобы оно заработало, но они достаточно запутанные, и их сложно понять без досконального знания 802.11, режимов его работы и формата заголовка кадра.

Это связано с тем, что сетевая карта теряет пакеты. Можно попробовать несколько вещей. Во-первых, собрать драйвер с поддержкой NAPI (если он по умолчанию, не включен). NAPI делает так чтобы получал управление по программному прерыванию, не по прерыванию низкого уровня.

Если драйвер не поддерживает NAPI, можно попробовать увеличить объём работы, который драйвер может делать в течение обработки прерывания. Для 3c59x это делается с помощью опции max_interrupt_work (поэтому нужно добавить опцию 'options 3c59x max_interrupt_work=10000' в файл /etc/modules.conf). У других сетевых карт похожие опции.

Мост передаёт DHCP-трафик (широковещательный) и ответы на него. Также можно использовать DHCP для установки локального IP-адреса на псевдо-интерфейс моста.

Одна из распространённых ошибок при использовании DHCP является установка задержки передачи (forwarding delay) на порту коммутатора равной 30 секунд. При такой задержке интерфейс когда он подключился к мосту не может посылать через него данные в течении первых 30 секунд. Причина в том, что при использовании моста в сложной топологии он должен сначала обнаружить остальные мосты дабы не создавать петель. Проблема была одной из причин создания протокола Rapid Spanning Tree Protocol (RSTP).

Если мост используется в одиночку (т.е. поблизости нет мостов) можно спокойно отключить задержку передачи (установить её равной 0) перед тем как подключать интерфейс к мосту. После этого сразу же можно вызывать dhclient:

Для того чтобы виртуальные мосты работали более приближенно к простому железу, нужно отключить применение правил iptables на самом мосту.


Бридж (англ. bridge, мост) — это способ соединения двух сегментов Ethernet на канальном уровне, т.е. без использования протоколов более высокого уровня, таких как IP. Пакеты передаются на основе Ethernet-адресов, а не IP-адресов (как в маршрутизаторе). Поскольку передача выполняется на канальном уровне (уровень 2 модели OSI), все протоколы более высокого уровня прозрачно проходят через мост.

Термины коммутатор, мост и бридж могут использоваться на данной странице как взаимозаменяемые.

Код bridge в Linux является частичной реализацией стандарта ANSI/IEEE 802.1d [2]. Впервые бриджинг в Linux появился в 2.2, затем код был переписан Леннертом Буйтенхеком (Lennert Buytenhek). Код bridge интегрирован в ядра серий 2.4 и 2.6.

Содержание

Linux-мосты более мощные чем простые аппаратные мосты и коммутаторы, поскольку они могут ещё фильтровать и регулировать трафик. Комбинация коммутатора и брандмауэра выполняется с помощью родственного проекта ebtables.

Возможные будущие усовершенствования:

  • Описать фильтрацию STP
  • Использовать Netlink interface для управление бриджами (прототип в 2.6.18)
  • Добавить поддержку в user space
  • Сделать поддержку RSTP и других расширений 802.1d STP

Поддержка бриджинга есть в текущих ядрах 2.4 и 2.6 всех основных дистрибутивов Linux. Администрирование осуществляется утилитой brctl из пакета bridge-utils который есть практически во всех дистрибутивах,или в соверменных дистрибутивах утилитами ip и bridge из пакета iproute.

Инсталляция утилит выполняется стандартным для дистрибутива способом.

Например, в Debian GNU/Linux:

Исходный код последнего релиза утилит можно получить со страницы Download.

Перед тем как вы приступите к настройке коммутатора, убедитесь, что сетевые карты работают нормально. Не устанавливайте на них IP-адресов, и не позволяйте начальным скриптам выполнять DHCP-запрос с них. IP-адреса должны устанавливаться уже после того, как бридж сконфигурирован.

Команда ifconfig должна показывать обе (или больше, если их больше) сетевые карты, и они должны быть выключены, т.е. находиться в состоянии DOWN (это на момент начала настройки, дальше они будут переведены в UP).

В большинстве случаев код коммутатора оформляется в виде модуля. Если модуль сконфигурирован и установлен корректно, он автоматически загружается при первом вызове команды brctl.

Если ваши утилиты bridge-utilities корректно установлены, и ядро и его модуль bridge в порядке, вызовом команды brctl можно будет просмотреть маленькую сводку о синтаксисе команды:

создаёт экземпляр логического коммутатора с именем bridgename. Для того чтобы выполнять коммутацию пакетов, нужно создать хотя бы один коммутатор. Можно воспринимать логический бридж как контейнер интерфейсов, принимающих участие в коммутации. Каждый экземпляр коммутатора представлен новым сетевым интерфейсом.

Соответствующая команда для удаления коммутатора:

включает сетевое устройство device в коммутатор с именем "bridgename." Все устройства, включенные в один мост, работают как одна большая сеть. Нельзя добавить устройство в несколько бриджей одновременно, поскольку это не имеет никакого смысла. Коммутатору потребуется небольшое время после того как устройство подключено, для того чтобы узнать его Ethernet-адрес, а затем он начинает передачу (forward).

Соответствующая команда для выключения устройства из коммутатора:

Команда brctl show показывает состояние всех работающих коммутаторов:

Если выполнить команду brctl showmacs, будет показана информация о сетевых адресах источников трафика, прошедшего через коммутатор (и самого коммутатора тоже):

Время жизни (ageing time) - это количество секунд, которое MAC-адрес будет находиться в таблице forwarding database после получения пакета с этим адресом. Записи в таблице периодически удаляются по тайм-ауту, для того чтобы не получилось, что они будут находиться там вечно. В нормальной ситуации, не понадобится менять данные параметры, но это сделать можно (время указывается в секундах)

Если установить время в ноль, запись становится постоянной.

Если используется несколько коммутаторов, для того чтобы избежать петель коммутации, нужно включить поддержку протокола Spanning Tree Protocol (Протокол остовного дерева).

Посмотреть параметры STP можно так:

Конфигурироваться может несколько параметров, имеющих отношение к Spanning Tree Protocol. Код автоматически определяет скорость соединения и другие параметры, поэтому, как правило, вручную их менять не нужно.

У каждого коммутатора есть относительный приоритет (priority) и стоимость (cost). Каждый интерфейс коммутатора ассоциируется с номером порта в коде STP. У каждого есть приоритет и стоимость, на основе которых принимается решение о том, какой путь для передачи пакета является кратчайшим. Всегда используется путь с наименьшей стоимостью (за исключением случая, когда этот путь разорван). Если коммутаторов и интерфейсов несколько, может понадобиться отрегулировать приоритеты, чтобы достичь максимальной производительности.

Бридж с наименьшим приоритетом избирается как корневой. Корневой бридж является центром остовного дерева (spanning tree) коммутационных связей.

У каждого интерфейса моста может быть своя собственная скорость, и её величина учитывается при принятии решения о том, какое соединение должно использоваться. У более быстрых интерфейсов должна быть более низкая стоимость.

Для выбора между разными портами, имеющими одинаковую стоимость, существует ещё приоритет.

Задержка передачи (forwarding delay) это время в течение которого порт находится в состояниях Listening и Learning, прежде чем перейти в состояние Forwarding. Это время нужно для того чтобы мост, когда он включается в сеть, прежде чем включаться в работу, сначала ознакомился с трафиком:

Время от времени корневой мост (Root Bridge) и выделенные мосты (Designated Bridges) отправляют пакет hello. Пакеты hello нужны для обмена информацией о топологии всей коммутируемой локальной сети.

Если другой коммутатор в дереве spanning tree не отправляет пакет hello в течение долгого времени, считается, что он не в порядке (dead). Таймаут устанавливается командой:

Базовая настройка моста выполняется так:

Хост настраивается как обычный мост. У него самого нет IP-адреса, поэтому к нему нельзя получить доступ (или взломать) удалённо по TCP/IP.

Опционально можно настроить виртуальный интерфейс mybridge на доступ по локальной сети. Он будет работать как обычный интерфейс - как сетевая карта. Процесс настройки полностью совпадает с вышеописанным, за тем исключением, что нужно заменить последнюю команду на такую:

Если вы хотите чтобы мост автоматически получал IP-адрес у ADSL-модема по DHCP (или в другой похожей ситуации), сделайте так:

Если делать это много раз, процессов dhclient может расплодиться великое множество. Или безжалостно убейте их, или почитайте об omshell.

Сначала в /etc/net настраиваются два ethernet-устройства port0 и port1:

После этого описывается мост:

После этого можно поднять бридж командой ifup mybridge. Устройства port0 и port1 поднимутся автоматически.

В файл /etc/network/interfaces мост прописывается в виде:

Мост прозрачно пересылает трафик между несколькими сетевыми интерфейсами. На простом языке это означает, что коммутатор соединяет два или более интерфейсов Ethernet между собой, для того чтобы получилась большая Ethernet-сеть.

Нет. Коммутатор ничего не знает о протоколах высокого уровня, он только видит кадры Ethernet. Поэтому функциональность моста является протоколонезависимой, и проблем с передачей протоколов таких как IPX, NetBEUI, IP, IPv6 и других быть не должно.

Пожалуйста, имейте в виду, что этот код не писался с целью заменить Linux-боксами выделенное сетевое оборудование. Не надо воспринимать Linux с этим кодом как замену аппаратным коммутаторам. Это скорее расширение сетевых возможностей Linux. Как бывает, что Linux-маршрутизатор лучше чем аппаратный маршрутизатор (и наоборот), есть ситуации, когда Linux-мост лучше чем выделенный мост (и наоборот).

Основная сила кода моста Linux это его гибкость. И так есть уже огромнейшее количество всяких интересных вещей, которые можно делать с Linux (см. например, Linux Advanced Routing and Traffic Control), и мосты — ещё одно добавление к этой гремучей смеси.

Одним из главных преимуществ решения, базирующегося на Linux, в сравнении с выделенным коммутатором являются разнообразные возможности по фильтрации трафика. Можно использовать всю функциональность netfilter (iptables) в комбинации с мостами, что даёт больший функционал, чем проприетарные решения.

Для того чтобы работать в качестве моста, устройство должно быть переведено в неразборчивый (promiscuous) режим, в котором оно получает весь трафик, приходящий на интерфейс. В действительно загруженных сетях это может занять значительную часть процессора, замедляя работу системы. Выход — или использовать выделенную Linux-систему в качестве моста, или использовать аппаратный коммутатор.

Производительность ограничивается используемыми сетевыми картами и процессором. Джеймс Ю (James Yu) из университета DePaul провёл исследование, в котором выполнил сравнение Linux моста и коммутатора Catalyst Yu-Linux-TSM2004.pdf

И не должно быть видно. Работа моста является полностью прозрачной для сети (по крайней мере должна); сети, которые мост соединяет между собой, должны видеться как одна большая сеть. Именно поэтому мост и не виден в traceroute; пакеты и не думают о том, что они пересекают границы подсети.

Дополнительная информация об этом в книгах по сетям TCP/IP.

Когда я пытаюсь добавить мост, система говорит: "br_add_bridge: bad address"!

Или ваше ядро слишком старое (2.2 или более ранее), или вы забыли включить поддержку бриджей в ядро.

Изначально разработка велась на 2.2, есть патчи для этого ядра. Но сейчас эти патчи уже не поддерживаются и не развиваются.

Да. Ведётся работа по включению поддержки RSTP в будущий релиз для ядра 2.6. Код делался для ядра 2.4 и нуждается в доработке, тестировании и обновлении.

Мосты Linux очень гибкие; можно соединять как традиционные ethernet-устройства, так и псевдоустройства такие как PPP, VPN или VLANы.

Ограничения, которые накладываются на соединяемые устройства:

  • У всех должен быть одинаковый максимальный размер пакета (MTU). Мост не выполняет фрагментирование пакетов.
  • Устройства должны выглядеть как Ethernet, т.е. у них должны быть 6-байтные адреса отправителя и получателя.
  • Должен поддерживаться неразборчивый (promiscuous) режим. Мост должен получать не только трафик, адресованный ему, но и весь сетевой трафик.
  • Должен быть разрешён спуфинг адресов. У моста должна быть возможность отправлять данные по сети, как если бы они пришли от другого хоста.

Да. Соответствующий код включен в большинство ядер. Смотрите проект ebtables.

Нет. У этих протоколов отличается адресация и размер кадра.

В каждой коммутируемой сети есть один "главный коммутатор", который также называется корневым (root). Какой именно мост является корневым, можно узнать с помощью brctl.

Список вещей, которые можно сделать:

  • Найти, какой коммутатор является корневым, где он находится и под управлением какого программного обеспечения работает. Пожалуйста, сообщите о таком коммутаторе в список рассылки, чтобы можно было его добавить в blacklist.
  • Заставить Linux-мост быть корневым. Найдите какой приоритет у коммутатора, который сейчас является корневым, и с помощью команды brctl 'setbridgeprio' установите приоритет линуксового моста на 1 меньше (Мост с наименьшим приоритетом всегда становится корневым).
  • Вообще отключите STP на Linux-мосте. Только смотрите чтобы не появилось петель коммутации! Если у вас есть петли, и не работает STP, пакеты зациклятся и будут гулять по сети вечно, что сделает её нерабочей.

К сожалению, у некоторых сетевых карт глючные драйверы, которые сбоят во время загрузки. Ситуация улучшается, поэтому может помочь установка текущего ядра и сетевых драйверов. Ещё можно попробовать устройства другого производителя.

Это известная проблема, и она не связана с кодом моста. Большое количество wireless-карт не позволяет делать подмену (spoofing) адреса источника. В некоторых чипсетах это ограничение на уровне прошивки (firmware). Дополнительная информация может быть найдена в архивах списков рассылки.

Удалось ли кому-нибудь обойти проблему связанную с тем, что Wavelan не позволяет использовать никакие MAC-адреса за исключением своего собственного?

(Отвечает Michael Renzmann, mrenzmann at compulan.de)

99% пользователей никогда не смогут избавиться от этой проблемы. Для такой функции нужна специальная прошивка. Её нужно загрузить в память WaveLAN-карточки и тогда карточка сможет выполнять бриджинг. Но нет общедоступной документации интерфейса. Единственный выход - иметь полную версию библиотеки hcf, которая контролирует все действия карты, и в частности, доступ к памяти карты. Для получения этой библиотеки нужно убедить компанию Lucent, что это ей будет выгодно и, кроме всего прочего, подписать NDA. Поэтому, скорее всего, пока Lucent не передумает, вам не удастся получить доступ к коду (а в том, что Lucent передумает, есть большие сомнения).

Полноценный мост для беспроводных сетей (802.11) требует поддержки WDS. В текущей реализации её нет.

Можно сделать ограниченную функциональность с некоторыми драйверами. Для этого обязательно чтобы устройство поддерживало разные адреса отправителя и получателя. Что и обеспечивает WDS.

Есть способы добиться чтобы оно заработало, но они достаточно запутанные, и их сложно понять без досконального знания 802.11, режимов его работы и формата заголовка кадра.

Это связано с тем, что сетевая карта теряет пакеты. Можно попробовать несколько вещей. Во-первых, собрать драйвер с поддержкой NAPI (если он по умолчанию, не включен). NAPI делает так чтобы получал управление по программному прерыванию, не по прерыванию низкого уровня.

Если драйвер не поддерживает NAPI, можно попробовать увеличить объём работы, который драйвер может делать в течение обработки прерывания. Для 3c59x это делается с помощью опции max_interrupt_work (поэтому нужно добавить опцию 'options 3c59x max_interrupt_work=10000' в файл /etc/modules.conf). У других сетевых карт похожие опции.

Мост передаёт DHCP-трафик (широковещательный) и ответы на него. Также можно использовать DHCP для установки локального IP-адреса на псевдо-интерфейс моста.

Одна из распространённых ошибок при использовании DHCP является установка задержки передачи (forwarding delay) на порту коммутатора равной 30 секунд. При такой задержке интерфейс когда он подключился к мосту не может посылать через него данные в течении первых 30 секунд. Причина в том, что при использовании моста в сложной топологии он должен сначала обнаружить остальные мосты дабы не создавать петель. Проблема была одной из причин создания протокола Rapid Spanning Tree Protocol (RSTP).

Если мост используется в одиночку (т.е. поблизости нет мостов) можно спокойно отключить задержку передачи (установить её равной 0) перед тем как подключать интерфейс к мосту. После этого сразу же можно вызывать dhclient:

Для того чтобы виртуальные мосты работали более приближенно к простому железу, нужно отключить применение правил iptables на самом мосту.

В данном посте пойдет речь о том, как настроить сетевой мост на сервере с ОС Ubuntu 14.04 LTS или 16.04 LTS.

Сетевой мост — это ничто иное, как простой технический способ соединения с внешней сетью через физический интерфейс. Это полезно при использовании виртуализации LXC/KVM/Xen/Containers и других виртуальных интерфейсов. В этом туториале будет рассказано как можно настроить мост Linux используя bridge-utils (brctl) на сервер с Ubuntu.

Пример сетевого моста:


В этом примере eth0 и eth1 — это физический сетевой интерфейс. eth0 соединяется с LAN и eth1 соединен непосредственно с оборудованием провайдера.

Установка bridge-utils

Введите команду apt-get для установки bridge-utils:


Создаем сетевой мост на сервере с Ubuntu

Редактируем /etc/network/interfaces используя текстовый редактор такой как nano, vi или любой другой любимый Вами редактор, и вводим:

Далее установим eth1 и метим его как br1, вводим:

Устанавливаем eth0 и метим его как br0, вводим:

Заметка про br0 и DHCP

Сохраните и закройте файл.

Перезапускаем сервер или сетевой сервис

Теперь нужно перезагрузить сервер или ввести команду для перезапуска сетевого сервиса:

Если используется Ubuntu 14.04 LTS или более старая версия дистрибутива, введите:

Команда проверки связности

Используем команду ping/ip для того, чтобы убедиться в доступности интерфейсов LAN и WAN:


Теперь можно сконфигурировать XEN/KVM/LXC контейнеры, чтобы использовать br0 и br1 и получить доступ непосредственно к Интернету или внутренней LAN. Таким образом отпадает потребность в установке специальной таблицы маршрутизации или создания iptables, SNAT правил.

Читайте также: