Linux bonding: настройка active-backup и LACP 802.3ad
Москва, Щёлковское шоссе, д. 92, корп. 7 · Пн–Пт 9:00–19:00 · +7 903 729-62-41

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): агрегация с коммутатором
Режим active-backup для отказоустойчивости

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-интерфейсов

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 автоматически.

Bridge поверх bond: гипервизор Proxmox и KVM

На гипервизоре bond почти никогда не получает IP-адрес сам. Я делаю его портом Linux-моста, а адрес управления и сети виртуальных машин вешаю уже на мост. Так отказоустойчивость получают сразу и хост, и все гости: при обрыве одного кабеля ВМ даже не замечают переключения.

В Proxmox VE конфигурация живёт в /etc/network/interfaces, и документация Proxmox приводит именно такую схему:

auto bond0
iface bond0 inet manual
      bond-slaves eno1 eno2
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

Строки bridge-vlan-aware yes и bridge-vids 2-4094 делают мост VLAN-aware: тег VLAN я задаю прямо в настройках сетевой карты ВМ, а не создаю отдельные мосты под каждую подсеть. Адрес хоста в служебном VLAN оформляется интерфейсом вида vmbr0.5.

Два ограничения, о которых прямо пишет Proxmox:

  • режимы balance-tlb и balance-alb не подходят для моста с гостевыми машинами — они подменяют MAC-адреса в ARP-ответах и рассчитаны на то, что хосту известны все локальные адреса;
  • для сети кластера Corosync bond не нужен: Corosync сам переключается между несколькими сетями (link0, link1), а некоторые режимы bonding для него проблемны. Я отдаю Corosync два отдельных линка без агрегации.

Если коммутатор LACP не умеет, на гипервизоре ставлю bond-mode active-backup — остальная схема с мостом не меняется.

Параметры, которые я проверяю в каждом bond

Большинство проблем с bonding, которые я разбираю, — это не баг драйвера, а значение по умолчанию, о котором забыли. Сверяю по документации ядра (Documentation/networking/bonding) и man systemd.netdev:

  • Мониторинг линка. У модуля ядра miimon по умолчанию 100 мс, если не задан arp_interval. А у systemd-networkd MIIMonitorSec= по умолчанию 0, то есть мониторинг выключен. Без мониторинга драйвер считает все линки живыми и продолжает слать трафик в оборванный кабель. Поэтому MIIMonitorSec=100ms пишу всегда явно.
  • updelay/downdelay. По умолчанию 0. Значение должно быть кратно miimon, иначе ядро округлит его вниз до ближайшего кратного.
  • Хеш-политика. xmit_hash_policy по умолчанию layer2: весь трафик к одному соседу (например, к шлюзу) идёт через один интерфейс. layer2+3 добавляет IP-адреса, layer3+4 — порты. Но даже с layer3+4 одно TCP-соединение не разложится на несколько линков, а сама политика по документации ядра не полностью совместима с 802.3ad.
  • Скорость LACPDU. lacp_rate по умолчанию slow — партнёр шлёт LACPDU раз в 30 секунд; fast — раз в секунду.
  • MinLinks. По умолчанию 0: bond в режиме 802.3ad держит carrier, пока жив хотя бы один агрегатор. Если сервису нужно минимум два линка, задаю MinLinks=2.
  • MAC при переключении. fail_over_mac по умолчанию none — все slave-интерфейсы получают один MAC. Значения active и follow нужны для карт, которые не умеют менять свой MAC-адрес.

Отдельно проверяю ожидания заказчика. Агрегация двух линков по 1 Гбит не превращает копирование одного файла в 2 Гбит/с: документация ядра прямо говорит, что во всех режимах, кроме balance-rr, одно соединение не использует больше полосы одного интерфейса. Выигрыш виден, когда к серверу одновременно ходит много клиентов.

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

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 ✈ Telegram @ITfresh_Boss

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

📄
Скачайте подробный разбор в PDF Кейсы, статистика, типовые ошибки и чек-лист самопроверки — 12 страниц
Скачать PDF

Источники

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

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

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

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