Когда-то впервые увидев, что в одной конторе вместо аппаратных сетевых устройств использовалось все на програмном исполнении, а именно обычный комп, сервера, а уже на него взгромоздили Ubuntu систему которая выступает, как шлюз, почтовый сервер, сервер телефонии и таких систем великое множество, а для объединения их друг с другом использовалось объединение двух и более сетевых карт (канальный уровень) в bridge, при этом пакеты передаются на основе Ethernet-адресов, а не IP (как в маршрутизации), что в последствии давало управление безопасностью на более низком уровне чем ранее. Также к этому применялось использование канального протокола связующего дерева (STP – Spanning Tree Protocol) посредством которого устранялось образованием петель в сети. Задачу STP выполнял полностью – автоматическое блокирование соединений, которые в текущий момент являются излишними. Если каким-либо образом в сети появится “петля” – то сеть оказывается парализованной повторяющимися пакетами, хотя и может работать на отдельных участках, но вот полезная нагрузка очень мала, и выглядит это как полный отказ, к примеру был у меня случай, некоторые отделы подключенные к аппаратный switchaм не видели другие отделы.

Вывод: использование протокола STP – это использование для нахождения кратчайшего пути между двумя ethernet-сетями и для удаления колец из топологий сетей ethernet

Данная заметка покажет, как использовать bridge в системе Ubuntu 12.04.5 Server:

ekzorchik@srv-mon:~$ sudo apt-get update && sudo apt-get upgrade -y

Выводим какие сетевые карты сейчас определены системой и их MAC-адреса:

ekzorchik@srv-mon:~$ ifconfig -a | grep -r 'eth[0-1]'

eth0 Link encap:Ethernet HWaddr 08:00:27:7a:16:e5

eth1 Link encap:Ethernet HWaddr 08:00:27:ce:63:2c

Далее устанавливаем в систему пакет ответственный за использование bridge:

ekzorchik@srv-mon:~$ sudo apt-get install bridge-utils -y

После создаем bridge воспользовавшись командой brctl с аргументом addbr:

ekzorchik@srv-mon:~$ sudo brctl addbr br0

С целью предотвращения появления в сети “петель” включаю протокол связующего дерева STP:

ekzorchik@srv-mon:~$ sudo brctl stp br0 on

Чтобы определить мост для текущий сетевых интерфейсов в системе их нужно освободить от выданных адресов и выключить на время добавления в мост (данные действия нужно проводить подключившись к системе локально либо с использование средств удаленного администрирования (iLo,ipmi,KVM), либо в системе имеется еще одна сетевая карта)

ekzorchik@srv-mon:~$ sudo ifconfig eth0 0.0.0.0 down

ekzorchik@srv-mon:~$ sudo ifconfig eth1 0.0.0.0 down

Теперь создаем мост для выключенных сетевых интерейсов, после чего он заработает полностью через совсем малый промежуток времени, в течение которого будет происходит изучение трафика проходящего через него)

ekzorchik@srv-mon:~$ sudo brctl addif br0 eth0

ekzorchik@srv-mon:~$ sudo brctl addif br0 eth1

Вот теперь уже можно включить сетевые интерфейсы (eth0 & eth1) и конечно же наш мост (br0)

ekzorchik@srv-mon:~$ sudo ifconfig eth0 up

ekzorchik@srv-mon:~$ sudo ifconfig eth1 up

ekzorchik@srv-mon:~$ sudo ifconfig br0 up

В моем случаем после включения моста ему не присвоился сетевой адрес от DHCP сервера автоматически, потребовалось вручную запросить:

ekzorchik@srv-mon:~$ sudo dhclient br0

ekzorchik@srv-mon:~$ ifconfig br0

br0 Link encap:Ethernet HWaddr 08:00:27:7a:16:e5

inet addr:10.7.8.154 Bcast:10.7.8.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:1266 errors:0 dropped:6 overruns:0 frame:0

TX packets:31 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:89888 (89.8 KB) TX bytes:4910 (4.9 KB)

Дальнейшие действия настройки к примеру статики и динамики также сводятся к правке конфигурационного файла: ekzorchik@srv-mon:~$ sudo nano /etc/network/interfaces

#для ручного указания IP адреса

auto eth0

iface eth0 inet static

address 0.0.0.0

auto eth1

iface eth1 inet static

address 0.0.0.0

auto br0

iface br0 inet static

bridge_ports eth0 eth1

bridge_stp on

address 10.7.8.154

netmask 255.255.255.0

gateway 10.7.8.1

#для автоматического получения IP адреса от DHCP сервера

auto eth0

iface eth0 inet dhcp

auto eth1

iface eth1 inet dhcp

auto br0

iface br0 inet dhcp

bridge_ports eth0 eth1

bridge_stp on

После изменения настроек перезапускаем сетевую часть:

ekzorchik@srv-mon:~$ sudo /etc/init.d/networking restart

если в процессе Вы видите сообщение:

Waiting for br0 to get ready (MAXWAIT is 32 seconds)

то это значит что очень долго поднимается мост, чтобы этого избежать можно в файл /etc/network/interfaces добавить следующую строку:

ekzorchik@srv-mon:~$ sudo nano /etc/network/interfaces

auto br0

iface br0 inet static

bridge_ports eth0 eth1

bridge_stp on

bridge_maxwait 0

address 10.7.8.154

netmask 255.255.255.0

gateway 10.7.8.1

Следом после сохранения снова перезапустить сетевую подсистему и проблема будет решена.

Получить информацию о bridge можно так:

ekzorchik@srv-mon:~$ sudo brctl show

bridge name bridge id STP enabled interfaces

br0 8000.0800277a16e5 yes eth0

eth1

Получить информацию о STP:

ekzorchik@srv-mon:~$ sudo brctl showstp br0

br0

bridge id 8000.0800277a16e5

designated root 8000.0800277a16e5

root port 0 path cost 0

max age 20.00 bridge max age 20.00

hello time 2.00 bridge hello time 2.00

forward delay 15.00 bridge forward delay 15.00

ageing time 300.00

hello timer 1.74 tcn timer 0.00

topology change timer 0.00 gc timer 67.99

flags

eth0 (1)

port id 8001 state forwarding

designated root 8000.0800277a16e5 path cost 4

designated bridge 8000.0800277a16e5 message age timer 0.00

designated port 8001 forward delay timer 0.00

designated cost 0 hold timer 0.74

flags

eth1 (2)

port id 8002 state blocking

designated root 8000.0800277a16e5 path cost 4

designated bridge 8000.0800277a16e5 message age timer 19.80

designated port 8001 forward delay timer 0.00

designated cost 0 hold timer 0.00

flags

В процессе Вам также может понадобиться расширенная справка по использование утилиты brctl

Программа brctl предназначена для создания, сопровождения и просмотра конфигурации модуля Ethernet-моста bridge в ядре Linux.

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

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

Экземпляры

Команда brctl addbr <name> создаёт новый экземпляр ethernet-моста. Сетевой интерфейс, соответствующий этому мосту, будет называться name.

Команда brctl delbr <name> удаляет экземпляр моста, который называется name. Сетевой интерфейс, соответствующий мосту, нужно сначала выключить, прежде чем удалять этот мост.

Команда brctl show показывает все экземпляры ethernet-мостов.

Порты

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

Команда brctl addif <brname> <ifname> делает сетевой интерфейс <ifname> портом моста <brname>. Это означает, что все кадры, полученные через интерфейс <ifname> будут обрабатываться, как если они пришли на этот мост. И наоборот, когда кадр приходит на мост <brname>, интерфейс <ifname> рассматривается как потенциальный порт для отправки трафика.

Команда brctl delif <brname> <ifname> отключает интерфейс <ifname> от бриджа <brname>.

Команда brctl show <brname> показывает информацию про мост подключённые к нему порты.

Время жизни

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

Местоположение ethernet это не статические данные. Машины могут переходить на другие порты, сетевые карты могут меняться (и соответственно, будут меняться MAC-адреса) и т.д.

brctl showmacs <brname> показывает список изученных (learned) MAC-адресов для этого моста.

brctl setageingtime <brname> <time> задаёт время жизни (ageing time) MAC-адреса, в секундах. Если в течение времени <time> секунд мост не видит кадров с определённого адреса, этот адрес удаляется из базы данных Forwarding DataBase (fdb).

brctl setgcint <brname> <time> задаёт период сбора мусора (garbage collection interval) для моста <brname> равным <time> секунд. Это значит, что bridge будет проверять forwarding database на наличие устаревших записей каждые <time> секунд.

Spanning Tree Protocol (Протокол основного дерева)

Несколько ethernet-мостов могут быть соединены друг с другом ethernet-сетями и образовывать ещё большую сеть. В таких сетях обычно работает протокол 802.1d (или аналогичный). Это протокол используется для нахождения кратчайшего пути между двумя ethernet-сетями и для удаления колец из топологий сетей ethernet. Поскольку это стандарт, мосты Linux будут нормально взаимодействовать с мостами третьих производителей. Мосты взаимодействуют друг с другом при помощи отправки BPDU (Bridge Protocol Data Units). Эти BPDU можно узнать по Ethernet-адресу получателя 01:80:c2:00:00:00.

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

Программа brctl может настраивать некоторые параметры протокола spanning tree. Объяснение, что обозначают эти параметры можно найти в спецификации IEEE 802.1d. Настройки по умолчанию должны хорошо работать в большинстве случаев. Если вы не знаете, что означают эти параметры, скорее всего вы и не захотите их менять.

  • brctl stp <bridge> <state> управляет тем, будет ли мост принимать участие в работе протокола spanning tree (STP). Если состояние <state> это “on” или “yes”, STP будет включён; во всех остальных случаях он будет выключен. При выключенной опции мост не будет отправлять или принимать BPDU и не будет никак участвовать в работе протокола spanning tree. Если этот мост не единственный в сети, или если возможны циклы в сетевой топологии, эту опцию выключать не стоит. Опцию нужно отключать, только если точно представляешь, что делаешь.
  • brctl setbridgeprio <bridge> <priority> устанавливает приоритет моста равным <priority>. Параметр priority это 16-битное беззнаковое целое без размерности (число между 0 и 65535). Чем ниже приоритет, тем “лучше”. Мост с наименьшим приоритетом будет выбран как корневой.
  • brctl setfd <bridge> <time> задаёт параметр ‘bridge forward delay’ равным <time> секунд.
  • brctl sethello <bridge> <time> задаёт параметр ‘bridge hello time’ равным <time> секунд.
  • brctl setmaxage <bridge> <time> задаёт параметр ‘maximum message age’ равным <time> секунд.
  • brctl setpathcost <bridge> <port> <cost> задаёт стоимость порта <port> равным <cost>. Это метрика без единиц измерений.
  • brctl setportprio <bridge> <port> <priority> устанавливает приоритет порта <port>’s равным <priority>. Значение priority это беззнаковое 8-битное целое (число между 0 и 255) и без единиц измерения. Эта метрика используется при выборе корневого моста (root bridge) и корневого порта (root port).

Из дополнительной информации по использованию bridge подчерпнул для своего развития, что мосты использующиеся в Ubuntu системе более продвинутей по сравнению с простыми аппаратными мостами и коммутаторами, все дело в том, что они могут отфильтровывать и регулировать трафик. Просто часто в организациях в которых работаешь просто нет финансовой возможности приобретать дорогую железку, если Вы как специалист и объяснили своему руководству, что оно может существенно съекономить для решения поставленной задачи задействовав не аппаратную сторону, а программную. А вы как раз такой специалист который в своей системе (Ubuntu системе) может это сделать, задокумментировать и объяснить коллегам, как он этого добился. На этом заметка завершена, в последствии опираясь на нее я покажу ее использование в дальнейшем, а пока всё, до встречи с уважением автор блога – ekzorchik.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru

2 комментария для “Объединение двух и более сетевых карт в bridge”
  1. Спасибо за описание, всё по полочкам и доступно для начинающих.
    Я хотел бы сделать мост из нотбука подключенного к интернет по WiFi, а сетевой картой подключенного к железному свичу для раздачи через него интернета по проводам.
    Бридж по Вашему описанию без проблем создал, добавил в него сетевую карту с обнулённым IP, задал бриджу свободный IP из диаппазона WiFi и перевел в состояние up.
    Сразу пропала связь с роутером через WiFi, а в таблице маршрутизации появились две строки:
    link-local * 255.255.0.0 U 1000 0 0 br0
    192.168.1.0 * 255.255.255.0 U 0 0 0 br0
    Попробовал добавить к бриджу WiFi-интерфейс (wlc3), но в ответ получил: “can’t add wls3 to bridge br0: Operation not supported”.
    Буду признателен, если подскажете, что нужно сделать.

    С уважением

    1. А у Вас не получится сделать br0 и поместить в него eth0 + wlan0. Вроде так не работает. С такой задачей дело не имел.

Обсуждение закрыто.