Сетевое агрегирование (Channel Bonding / NIC Teaming) в Linux.

В современном мире IT, где доступность и производительность сетевых сервисов критически важны, системные администраторы постоянно ищут способы сделать сетевую инфраструктуру более устойчивой к сбоям и способной обрабатывать растущие объемы данных. Отказоустойчивость и масштабирование пропускной способности сетевых подключений серверов это ключевые задачи.

Решением, которое уже давно стало стандартом де-факто, является сетевое агрегирование, также известное как Channel Bonding или NIC Teaming. Эта технология позволяет объединить несколько физических сетевых интерфейсов (NIC) вашего сервера в один логический (виртуальный) интерфейс. Преимущества очевидны: даже если один из физических сетевых адаптеров или соединительных кабелей выйдет из строя, сетевое подключение сервера останется работоспособным за счет других адаптеров в группе. Кроме того, в зависимости от выбранного режима работы, можно добиться увеличения суммарной пропускной способности по сравнению с одним интерфейсом.

В основе сетевого агрегирования в Linux лежит специальный драйвер ядра – bonding driver. Он создает виртуальный сетевой интерфейс (например, bond0), через который проходит весь сетевой трафик, а сам драйвер распределяет этот трафик между физическими сетевыми картами, входящими в группу.

Концепция объединения



Основные режимы работы драйвера объединения

Драйвер bonding поддерживает несколько режимов работы, каждый из которых оптимизирован под определенные задачи. Рассмотрим два наиболее часто используемых, которые были упомянуты в исходной статье:

Режим 0: Balance Round-Robin (Балансировка нагрузки, «карусель»)

Режим Round-Robin

Режим 1: Active-Backup (Активный-резервный)

Режим Active-Backup

Универсальная настройка сетевого агрегирования в Linux

Конфигурация сетевых интерфейсов в Linux может отличаться в зависимости от используемого дистрибутива и выбранной системы управления сетью (например, network-scripts, ifupdown, NetworkManager, Netplan, systemd-networkd). Однако общая идея и параметры драйвера bonding остаются одинаковыми.

Общие шаги для всех дистрибутивов:

Загрузить модуль ядра bonding.

Убедитесь, что модуль bonding загружен. Обычно это происходит автоматически при активации bond-интерфейса. Можно проверить командой:

Bash
lsmod | grep bonding

Если его нет, загрузите вручную:

Bash
sudo modprobe bonding

Чтобы он загружался при старте, добавьте его в соответствующий файл конфигурации модуля вашего дистрибутива (например, /etc/modules-load.d/bonding.conf или /etc/modules).

Создать логический интерфейс bond0.

Определить виртуальный интерфейс bond0 и его параметры (IP-адрес, маска, шлюз). В этом же месте или в отдельном файле указываются опции драйвера bonding (режим, miimon и т.д.).

Назначить физические интерфейсы подчиненными.

Настроить физические интерфейсы (eth1, eth2) так, чтобы они были включены при загрузке и стали подчиненными (SLAVE) для bond0 (MASTER). IP-адреса на подчиненных интерфейсах не настраиваются.

Применить конфигурацию.

Перезапустить сетевую службу или активировать новые конфигурации в соответствии с правилами вашего дистрибутива.

Проверить статус.

Убедиться, что bond0 активен и подчиненные интерфейсы включены, а также проверить статус драйвера bonding через /proc.

Примеры конфигурации для разных стилей

Рассмотрим, как шаги 2 и 3 выглядят в двух распространенных стилях конфигурации:

Скрипты network-scripts (используется в RHEL/CentOS/Fedora/AlmaLinux/Rocky Linux и т.п.)

Файлы конфигурации находятся в /etc/sysconfig/network-scripts/.

/etc/sysconfig/network-scripts/ifcfg-eth1:

INI
DEVICE="eth1"
TYPE=Ethernet
ONBOOT="yes"
BOOTPROTO="none" # Или "none", если не используете NetworkManager
MASTER=bond0
SLAVE=yes
# UUID="..." # Присутствует в автоматических конфигах, можно оставить
# HWADDR="..." # MAC-адрес, если требуется привязать к конкретному железу

/etc/sysconfig/network-scripts/ifcfg-eth2:

INI
DEVICE="eth2"
TYPE=Ethernet
ONBOOT="yes"
BOOTPROTO="none"
MASTER=bond0
SLAVE=yes
# UUID="..."
# HWADDR="..."

/etc/sysconfig/network-scripts/ifcfg-bond0 (для режима 0 — Round-Robin):

INI
DEVICE=bond0
TYPE=Bond
ONBOOT=yes
BOOTPROTO=static # Или none, если IP статический
IPADDR=192.168.56.12 # Ваш IP
NETMASK=255.255.255.0  # Ваша маска
# GATEWAY=192.168.56.1 # Ваш шлюз
BONDING_OPTS="mode=0 miimon=100"
BONDING_MASTER=yes

/etc/sysconfig/network-scripts/ifcfg-bond0 (для режима 1 — Active-Backup):

INI
DEVICE=bond0
TYPE=Bond
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.56.12 # Ваш IP
NETMASK=255.255.255.0  # Ваша маска
# GATEWAY=192.168.56.1 # Ваш шлюз
BONDING_OPTS="mode=1 miimon=100"
BONDING_MASTER=yes

Для применения настроек используйте следующую команду:

Bash
sudo systemctl restart NetworkManager

Стиль 2: /etc/network/interfaces (используется в Debian/Ubuntu и их производных, часто в старых версиях или при ручной настройке)

Вся конфигурация обычно находится в одном файле /etc/network/interfaces.

/etc/network/interfaces (для режима 0 — Round-Robin):

INI
# Конфигурация loopback и других интерфейсов может быть выше

# Автоматически поднимать bond0 при старте
auto bond0
# Определение bond0 как статического интерфейса
iface bond0 inet static
    address 192.168.246.130 # Ваш IP
    netmask 255.255.255.0   # Ваша маска
    gateway 192.168.246.1   # Ваш шлюз (если требуется)
    # Указываем подчиненные интерфейсы
    bond-slaves eth1 eth2
    # Указываем режим объединения
    bond-mode 0
    # Указываем интервал проверки линка
    bond-miimon 100
    # Указываем, что slave должны подниматься автоматически (опционально, но рекомендуется)
    bond-primary eth1 eth2 # Или только один, если хотите установить приоритет

# Определение подчиненных интерфейсов (не поднимаются отдельно)
auto eth1
iface eth1 inet manual
    bond-master bond0

auto eth2
iface eth2 inet manual
    bond-master bond0

/etc/network/interfaces (для режима 1 — Active-Backup):

INI
# Конфигурация loopback и других интерфейсов может быть выше

auto bond0
iface bond0 inet static
    address 192.168.246.130 # Ваш IP
    netmask 255.255.255.0   # Ваша маска
    gateway 192.168.246.1   # Ваш шлюз (если требуется)
    bond-slaves eth1 eth2
    bond-mode 1             # Изменено на режим 1
    bond-miimon 100
    # Можно указать основной slave, который будет активен первым
    bond-primary eth1

auto eth1
iface eth1 inet manual
    bond-master bond0

auto eth2
iface eth2 inet manual
    bond-master bond0

Для применения настроек используйте следующую команду:

Bash
sudo systemctl restart networking

Важное примечание: В современных дистрибутивах могут использоваться другие системы, такие как NetworkManager (часто через утилиту nmcli или графические инструменты) или Netplan (в свежих версиях Ubuntu). Принцип настройки bonding через них тот же (указать bond как главный, назначить slaves, выбрать режим), но синтаксис конфигурационных файлов будет отличаться. Обращайтесь к документации вашего дистрибутива или используемой системы управления сетью.


Проверка статуса

После применения конфигурации всегда проверяйте статус.

Список интерфейсов: Используйте ip a

Bash
ip -br a

Вы должны увидеть bond0 с настроенным IP-адресом и статусом UP, а первый и второй сетевой интерфейс со статусом UP, но без IP-адресов (они управляются драйвером bonding).

Статус bonding driver: Самая важная информация находится в псевдо-файле /proc/net/bonding/bond0.

Bash
cat /proc/net/bonding/bond0

Этот вывод покажет:

  • Версию драйвера.
  • Bonding Mode: Текущий активный режим (load balancing (round-robin) или fault-tolerance (active-backup)).
  • MII Status: Общий статус линка объединения (должен быть up).
  • MII Polling Interval (ms): Интервал проверки линка.
  • Список подчиненных интерфейсов (Slave Interface).
  • Для каждого slave: его MII Status, Speed, Duplex, Link Failure Count, Permanent HW addr.
  • В режиме Active-Backup: строка Currently Active Slave, показывающая текущий рабочий интерфейс.
Вывод /proc/net/bonding/bond0

Для непрерывного мониторинга можно использовать watch:

Bash
watch -n 1 cat /proc/net/bonding/bond0

Эта команда будет обновлять информацию о статусе каждую секунду, что очень удобно при тестировании.


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

Чтобы убедиться, что переключение при сбое работает, имитируйте отказ интерфейса, физически отключая кабель или программно отключая интерфейс:

Bash
sudo ip link set dev eth1 down

Наблюдайте за выводом watch -n 1 cat /proc/net/bonding/bond0. В режиме Active-Backup вы должны увидеть, как Currently Active Slave изменится на eth2.

Затем снова включите интерфейс:

Bash
sudo ip link set dev eth1 up

Через некоторое время (Up Delay и Down Delay в настройках bonding, по умолчанию 0) интерфейс eth1 вернется в состояние UP, и в режиме Active-Backup, если eth1 был назначен основным (bond-primary) или был первым в списке, он может снова стать активным.


Заключение

Сетевое агрегирование — это мощный и гибкий инструмент в арсенале администратора Linux, позволяющий значительно повысить надежность и производительность сетевой инфраструктуры. Понимая принципы работы драйвера bonding и особенности различных режимов, вы можете эффективно использовать имеющиеся сетевые ресурсы, минимизируя риск простоев, связанных с сетевым оборудованием.

Несмотря на различия в синтаксисе конфигурационных файлов между дистрибутивами, базовая логика настройки подчиненных и главных интерфейсов, а также ключевые параметры драйвера bonding остаются неизменными. Всегда обращайтесь к официальной документации вашего конкретного дистрибутива и man-странице bonding driver (man 8 bonding) для наиболее точной и полной информации.

Надеемся, это руководство поможет вам уверенно настроить сетевое агрегирование на ваших серверах Linux!

Was this helpful?

0 / 0

Добавить комментарий 0