Linux Bonding: сетевая избыточность и агрегация каналов — АйТи Фреш

Linux Bonding: сетевая избыточность и агрегация каналов

Linux Bonding: сетевая избыточность и агрегация каналов

Что такое bonding и когда он нужен

Linux bonding — это объединение нескольких физических сетевых интерфейсов в один логический. Зачем? Две причины: отказоустойчивость и увеличение пропускной способности. Сервер с двумя интерфейсами по 1 Гбит может иметь либо 2 Гбит суммарно, либо автоматическое переключение при обрыве кабеля — в зависимости от выбранного режима.

В нашей практике bonding появляется на всех серверах, которые нельзя перезагружать по ночам ради замены сетевой карты. Dell PowerEdge R640 с двумя портами 10G — стандартная конфигурация для клиентских серверов. Без bonding потеря одного порта = даунтайм. С bonding — замена карты в рабочее время без остановки сервисов.

Основные режимы Linux bonding:

  • mode=0 (balance-rr) — round-robin по всем интерфейсам, увеличивает пропускную способность
  • mode=1 (active-backup) — один активен, остальные в резерве, классическое резервирование
  • mode=2 (balance-xor) — балансировка по XOR MAC-адресов
  • mode=4 (802.3ad / LACP) — стандартная агрегация каналов, требует поддержки коммутатора
  • mode=5 (balance-tlb) — адаптивная балансировка исходящего трафика
  • mode=6 (balance-alb) — адаптивная балансировка входящего и исходящего

Настройка active-backup: резервирование без коммутатора

Mode=1 — самый простой и надёжный вариант. Не требует настройки коммутатора. Работает даже с разными коммутаторами на разных интерфейсах.

Настройка через systemd-networkd

На современных серверах с Ubuntu 20.04+ используем systemd-networkd:

# Создаём bonding-интерфейс
# /etc/systemd/network/10-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
MIIMonitorSec=100ms
UpDelaySec=200ms
DownDelaySec=200ms

# Привязываем физические интерфейсы
# /etc/systemd/network/20-eth0-bond.network
[Match]
Name=ens3

[Network]
Bond=bond0

# /etc/systemd/network/20-eth1-bond.network
[Match]
Name=ens4

[Network]
Bond=bond0

# Настраиваем IP для bond-интерфейса
# /etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=8.8.8.8

# Применяем
systemctl restart systemd-networkd
networkctl status bond0

Настройка через ifupdown (Debian classic)

На старых системах или если systemd-networkd не используется — через /etc/network/interfaces:

# Установка утилит bonding
apt install ifenslave -y

# /etc/network/interfaces
auto bond0
iface bond0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8
    bond-slaves ens3 ens4
    bond-mode active-backup
    bond-miimon 100
    bond-updelay 200
    bond-downdelay 200
    bond-primary ens3

auto ens3
iface ens3 inet manual
    bond-master bond0

auto ens4
iface ens4 inet manual
    bond-master bond0

# Применяем
ifdown bond0 && ifup bond0

Параметр bond-primary ens3 — после восстановления ens3 трафик автоматически вернётся на него. Полезно, когда первый интерфейс подключён к более надёжному коммутатору.

LACP (802.3ad): агрегация с коммутатором

LACP (802.3ad): агрегация с коммутатором

Mode=4 даёт настоящую агрегацию — трафик распределяется по всем активным интерфейсам. Два 10G порта = 20 Гбит суммарной полосы. Но нужна поддержка со стороны коммутатора.

Linux-сторона LACP

Настройка LACP на Linux:

# /etc/systemd/network/10-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=802.3ad
MIIMonitorSec=100ms
LACPTransmitRate=fast
TransmitHashPolicy=layer3+4

# TransmitHashPolicy=layer3+4 — балансировка по IP+порт
# Это важно: при layer2 все соединения одного хоста идут через один интерфейс

# Применяем и проверяем
systemctl restart systemd-networkd
cat /proc/net/bonding/bond0

Настройка коммутатора Cisco для LACP

Пример настройки port-channel на Cisco Catalyst 9300:

! Создаём port-channel
interface Port-channel1
 description bond0 on Linux server
 switchport mode access
 switchport access vlan 10

! Привязываем физические порты
interface GigabitEthernet1/0/1
 description ens3 on server
 switchport mode access
 switchport access vlan 10
 channel-protocol lacp
 channel-group 1 mode active

interface GigabitEthernet1/0/2
 description ens4 on server
 switchport mode access
 switchport access vlan 10
 channel-protocol lacp
 channel-group 1 mode active

На коммутаторах 40G Mellanox SN2100, которые стоят в нашем дата-центре МТС, аналогичная настройка через MLAG для cross-switch bonding — это отдельная тема для статьи.

Мониторинг и диагностика bonding

Настроить bonding — половина дела. Важно знать, как убедиться, что он работает, и как диагностировать проблемы.

Основные команды диагностики

Всё, что нужно знать о состоянии bonding в реальном времени:

# Подробный статус bond-интерфейса
cat /proc/net/bonding/bond0
# Показывает: режим, активный slave, статус каждого интерфейса,
# MAC-адреса, количество переключений (MII Status, Link Failure Count)

# Текущий активный интерфейс
cat /sys/class/net/bond0/bonding/active_slave

# Статистика через ip
ip -s link show bond0
ip -s link show ens3
ip -s link show ens4

# Мониторинг в реальном времени
watch -n1 'cat /proc/net/bonding/bond0 | grep -E "Slave|Active|Status"'

# Принудительное переключение active slave (для тестирования)
echo ens4 > /sys/class/net/bond0/bonding/active_slave

# Добавить/убрать slave вручную
ip link set ens4 master bond0
ip link set ens4 nomaster

Тест отказоустойчивости

Всегда проверяем bonding в режиме active-backup перед сдачей сервера клиенту:

# Запускаем непрерывный ping с другой машины
ping -i 0.2 192.168.1.10

# На сервере: принудительно гасим активный интерфейс
ip link set ens3 down

# В выводе ping — максимум 1-2 потери пакетов, потом восстановление
# Проверяем, что активный сменился
cat /sys/class/net/bond0/bonding/active_slave
# ens4

# Возвращаем первый
ip link set ens3 up
# Через несколько секунд (bond-updelay=200ms) он снова становится активным

На всех наших клиентских серверах Dell PowerEdge R640 с dual 10G этот тест проходим обязательно после настройки. 200 мс updelay — защита от флаппинга при нестабильном линке.

Bonding с VLAN и bridge

Bonding с VLAN и bridge

В реальной инфраструктуре bonding редко стоит один. Обычно поверх bond0 создаются VLAN-интерфейсы для разных подсетей, или bridge для виртуальных машин.

VLAN поверх bonding

Типичная конфигурация: один bond-интерфейс, несколько VLAN:

# /etc/systemd/network/40-bond0-vlan10.netdev
[NetDev]
Name=bond0.10
Kind=vlan

[VLAN]
Id=10

# /etc/systemd/network/40-bond0-vlan20.netdev
[NetDev]
Name=bond0.20
Kind=vlan

[VLAN]
Id=20

# Настраиваем VLAN-интерфейсы
# /etc/systemd/network/50-bond0-vlan10.network
[Match]
Name=bond0.10

[Network]
Address=10.10.10.1/24

# /etc/systemd/network/50-bond0-vlan20.network
[Match]
Name=bond0.20

[Network]
Address=10.20.20.1/24

В bond0.network добавьте строки VLAN=bond0.10 и VLAN=bond0.20, чтобы systemd-networkd создал VLAN автоматически.

Часто задаваемые вопросы

active-backup (mode=1) — единственный режим, не требующий настройки коммутатора. Один интерфейс активен, второй в резерве. При обрыве линка переключение за 0-200 мс. Идеально для серверов, подключённых к разным коммутаторам.

Bonding — классический модуль ядра, существует с Linux 2.0, стабилен и предсказуем. Teaming — более новый userspace-демон (teamd), гибче настраивается, но требует дополнительного ПО. Для большинства задач мы используем bonding — проще и надёжнее.

Несколько пакетов теряются в момент переключения — обычно 0-5 пакетов за 100-300 мс. TCP-соединения восстанавливаются автоматически. UDP-потоки могут прерваться. Параметр miimon=100 задаёт интервал проверки линка в 100 мс.

Да, для mode=4 (802.3ad LACP) коммутатор должен поддерживать и иметь настроенный LACP port-channel. Без настройки коммутатора LACP не заработает — используйте mode=1 (active-backup).

Читайте /proc/net/bonding/bond0 — там текущий активный интерфейс, статус каждого slave, количество переключений. Тест отказоустойчивости: выдерните кабель или отключите физический порт — потерь быть не должно (или минимум при переключении).

#linux bonding #LACP linux #active-backup #network redundancy

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 💬 MAX: +7 903 729-62-41 ✈️ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.