Агрегация каналов (Port Bonding) в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь реализовывать агрегацию каналов (Link Aggregation), также известную как объединение портов (port bonding), в среде Linux. Эта мощная техника позволяет объединить несколько физических сетевых интерфейсов в один логический интерфейс, что может увеличить пропускную способность сети и обеспечить отказоустойчивость. Вы получите практический опыт работы с основными командами Linux для настройки и управления объединенным соединением.

Следуя пошаговому процессу, вы сначала определите доступные сетевые интерфейсы в вашей системе с помощью команды ip a. Для безопасной и практической демонстрации мы создадим два виртуальных "фиктивных" интерфейса, dummy1 и dummy2, чтобы имитировать среду с несколькими интерфейсами. Затем вы создадите новый виртуальный интерфейс bond, bond0, и подключите к нему два этих фиктивных интерфейса. Впоследствии вы назначите статический IP-адрес вновь созданному интерфейсу bond0 для обеспечения связи. Наконец, вы проверите всю конфигурацию и состояние активного канала (bond), чтобы убедиться в его корректной работе.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 90%. Он получил 100% положительных отзывов от учащихся.

Идентификация доступных сетевых интерфейсов с помощью ip a

На этом шаге вы начнете с определения сетевых интерфейсов, доступных в вашей виртуальной машине LabEx. Прежде чем вы сможете объединить несколько сетевых интерфейсов в один объединенный канал (bonded link), вам нужно узнать их имена. Современной и предпочтительной командой для этой задачи в Linux является ip a (сокращение от ip addr show).

Эта команда отображает все сетевые интерфейсы в системе, а также их IP-адреса, MAC-адреса и их рабочее состояние.

Сначала откройте терминал. Он должен быть уже открыт и находиться в каталоге ~/project. Теперь выполните команду ip a, чтобы вывести список всех сетевых интерфейсов:

ip a

Вы увидите вывод, содержащий список нескольких интерфейсов. Вам следует обратить внимание на несколько ключевых деталей:

  • lo: Это интерфейс обратной связи (loopback interface), виртуальный интерфейс для самокоммуникации системы. Вы будете игнорировать его при агрегации каналов.
  • eth0: Это основной интерфейс Ethernet. Мы не будем использовать его, чтобы обеспечить стабильность нашего соединения с лабораторной средой.
  • docker0: Это виртуальный мост, созданный Docker. В настоящее время он находится в состоянии DOWN и не подходит для этой лабораторной работы.
  • dummy1, dummy2: Это два фиктивных виртуальных интерфейса, которые мы добавили для имитации двух дополнительных сетевых карт для этой лабораторной работы. Именно эти интерфейсы мы будем объединять.
  • state UP: Это указывает на то, что интерфейс активен.

Ваш вывод будет выглядеть примерно так. Обратите внимание на имена ваших фиктивных интерфейсов, dummy1 и dummy2, так как они понадобятся вам на следующих шагах.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:00:20:a3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.188/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159680sec preferred_lft 1892159680sec
    inet6 fe80::216:3eff:fe00:20a3/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:2c:eb:c9:91 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 2a:47:04:07:1a:ea brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5caf:4ff:fe97:69bd/64 scope link
       valid_lft forever preferred_lft forever
5: dummy2: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 2e:5f:12:08:3a:eb brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5caf:4ff:fe97:69be/64 scope link
       valid_lft forever preferred_lft forever

Из приведенного выше вывода мы определили два подходящих интерфейса для нашей конфигурации агрегации каналов: dummy1 и dummy2. На следующих шагах вы будете использовать эти имена интерфейсов для создания нового объединенного интерфейса.

Создание и активация интерфейса Bond 'bond0'

На этом шаге вы создадите логический интерфейс "bond", который будет служить мастером для ваших сетевых карт. Это требует двух основных действий: загрузки необходимого модуля ядра Linux для агрегации каналов и последующего создания и активации самого интерфейса.

Сначала вам нужно убедиться, что модуль ядра bonding загружен. Этот модуль содержит код, который позволяет ядру управлять объединенными интерфейсами. Вы можете загрузить его с помощью команды modprobe.

sudo modprobe bonding

Чтобы убедиться, что модуль успешно загружен, вы можете использовать команду lsmod, которая выводит список всех загруженных модулей ядра, и grep для фильтрации по "bonding".

lsmod | grep bonding

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

bonding               196608  0

Теперь, когда ядро готово, вы можете создать новый логический интерфейс. Мы назовем его bond0. Используйте команду ip link для добавления новой виртуальной связи типа bond.

sudo ip link add bond0 type bond

Эта команда создает интерфейс, но по умолчанию он находится в состоянии "down". Вам нужно перевести его в состояние "up" (активное), аналогично включению физической сетевой карты.

sudo ip link set dev bond0 up

Теперь вы можете проверить, существует ли ваш новый интерфейс bond0 и активен ли он, снова используя команду ip a, но на этот раз указав имя интерфейса.

ip a show bond0

Вывод покажет интерфейс bond0 с состоянием DOWN и без назначенного IP-адреса. Он будет настроен на следующем шаге.

6: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

Теперь вы успешно создали и активировали мастер-интерфейс bond0. Следующим шагом будет добавление ваших фиктивных интерфейсов к нему в качестве подчиненных (slaves).

Добавление интерфейсов в качестве подчиненных к 'bond0'

На этом шаге вы подчините виртуальные интерфейсы, которые вы определили ранее (dummy1 и dummy2), мастер-интерфейсу bond0. "Подчинение" интерфейса означает, что вы ставите его под контроль объединенного интерфейса. После подчинения физическому интерфейсу больше не нужен собственный IP-адрес; весь трафик будет управляться через bond0.

Этот подход с использованием фиктивных интерфейсов абсолютно безопасен и позволяет вам изучить процесс агрегации каналов без какого-либо риска потери сетевого подключения.

Сначала добавьте интерфейс dummy1 к bond. Вам нужно отключить его перед добавлением в качестве подчиненного.

sudo ip link set dev dummy1 down
sudo ip link set dev dummy1 master bond0

Затем сделайте то же самое для интерфейса dummy2.

sudo ip link set dev dummy2 down
sudo ip link set dev dummy2 master bond0

Теперь давайте активируем интерфейс bond и назначим ему IP-адрес. Мы будем использовать другую подсеть, чтобы избежать конфликтов с существующей конфигурацией eth0:

sudo ip addr add 192.168.100.10/24 dev bond0
sudo ip link set dev bond0 up

Давайте проверим, что оба интерфейса dummy1 и dummy2 теперь подчинены bond0:

ip a

Посмотрите на записи для dummy1, dummy2 и bond0 в выводе. Вы увидите оба интерфейса dummy1 и dummy2, перечисленные с master bond0 в их описаниях, что подтверждает их успешное подчинение. Также обратите внимание, что интерфейс bond0 теперь находится в состоянии UP и имеет назначенный нами IP-адрес.

4: dummy1: <BROADCAST,NOARP,SLAVE,UP,LOWER_UP> mtu 1500 qdisc noqueue master bond0 state UP group default qlen 1000
    link/ether 2a:47:04:07:1a:ea brd ff:ff:ff:ff:ff:ff
5: dummy2: <BROADCAST,NOARP,SLAVE,UP,LOWER_UP> mtu 1500 qdisc noqueue master bond0 state UP group default qlen 1000
    link/ether 2e:5f:12:08:3a:eb brd ff:ff:ff:ff:ff:ff
6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 2a:47:04:07:1a:ea brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.10/24 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::2847:4ff:fe07:1aea/64 scope link
       valid_lft forever preferred_lft forever

Поскольку интерфейсы теперь действуют как подчиненные, следующим шагом будет настройка сетевых параметров самого интерфейса bond0.

Тестирование подключения интерфейса Bond

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

Сначала давайте убедимся, что интерфейс bond активен и имеет правильный IP-адрес:

ip a show bond0

Вы должны увидеть интерфейс bond0 с назначенным нами IP-адресом (192.168.100.10/24), а состояние интерфейса должно отображаться как UP:

6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 2a:47:04:07:1a:ea brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.10/24 scope global bond0
       valid_lft forever preferred_lft forever

Теперь давайте протестируем интерфейс bond, отправив ping на его собственный IP-адрес, чтобы убедиться, что интерфейс отвечает:

ping -c 3 192.168.100.10

Вы должны увидеть успешные ответы ping, подтверждающие, что интерфейс bond функционирует.

Давайте также проверим, что наши подчиненные интерфейсы правильно присоединены к bond:

ip a | grep "master bond0"

Эта команда покажет вам интерфейсы, которые подчинены bond0. Вы должны увидеть оба интерфейса dummy1 и dummy2:

4: dummy1: <BROADCAST,NOARP,SLAVE,UP,LOWER_UP> mtu 1500 qdisc noqueue master bond0 state UP group default qlen 1000
5: dummy2: <BROADCAST,NOARP,SLAVE,UP,LOWER_UP> mtu 1500 qdisc noqueue master bond0 state UP group default qlen 1000

Для дополнительной проверки давайте посмотрим, отображается ли интерфейс bond в таблице маршрутизации:

ip route | grep bond0

Вы должны увидеть записи маршрутизации для сети 192.168.100.0/24 через интерфейс bond0.

Образовательная заметка: Эта настройка прекрасно демонстрирует основные концепции агрегации каналов (bonding). В производственной среде с несколькими физическими интерфейсами вы увидите реальное распределение нагрузки трафика и резервирование в зависимости от выбранного режима bonding.

Проверка статуса Bond с помощью cat /proc/net/bonding/bond0

На этом заключительном шаге вы выполните наиболее детальную проверку, изучив файл статуса bond напрямую. Ядро Linux предоставляет информацию в реальном времени о каждом объединенном интерфейсе через специальный файл в файловой системе /proc. Для интерфейса с именем bond0 этот файл находится по пути /proc/net/bonding/bond0.

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

В вашем терминале выполните следующую команду:

cat /proc/net/bonding/bond0

Это отобразит подробный отчет. Вывод будет похож на следующий, показывая два подчиненных интерфейса:

Ethernet Channel Bonding Driver: vX.X.X (Month Day, Year)

Bonding Mode: load balancing (round-robin)
Primary Slave: None
Currently Active Slave: dummy1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0

Slave Interface: dummy1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 2a:47:04:07:1a:ea
Slave queue ID: 0

Slave Interface: dummy2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 2e:5f:12:08:3a:eb
Slave queue ID: 0

Разберем ключевую информацию в этом выводе:

  • Bonding Mode: Здесь показана политика, используемая для распределения трафика. Поскольку мы ее не указывали, по умолчанию используется load balancing (round-robin), который передает пакеты поочередно через доступные подчиненные интерфейсы.
  • MII Status: Здесь отображается общий статус объединенного канала. up означает, что он активен.
  • Slave Interface: Вы можете увидеть раздел для обоих интерфейсов, dummy1 и dummy2. Оба показывают MII Status как up, подтверждая, что они активны и являются частью bond. Обратите внимание, что Speed и Duplex могут отображаться как Unknown или значение по умолчанию для фиктивных интерфейсов.

Поздравляем! Вы успешно настроили объединенный сетевой интерфейс (bonded network interface) в Linux, объединив два фиктивных интерфейса в один логический.

Резюме

В этой лабораторной работе вы изучили основные концепции реализации агрегации каналов (port bonding) в среде Linux. Процедура началась с идентификации доступных сетевых интерфейсов, включая два предварительно настроенных виртуальных интерфейса, dummy1 и dummy2, с помощью команды ip a. После идентификации вы создали новый виртуальный интерфейс bond с именем bond0, активировали его, а затем добавили оба фиктивных интерфейса в качестве подчиненных (slaves), чтобы продемонстрировать полный процесс агрегации.

Этот подход предоставил полностью безопасный и эффективный способ изучения концепций bonding в удаленной среде без риска потери подключения.

Ключевые моменты обучения включали:

  • Создание двух фиктивных интерфейсов для имитации среды с несколькими интерфейсами.
  • Загрузку модуля ядра bonding.
  • Понимание взаимоотношений "мастер-подчиненный" (master-slave) при агрегации сетевых каналов.
  • Присоединение нескольких интерфейсов к одному мастеру bond.
  • Безопасное назначение IP-адресов интерфейсам bond.
  • Проверку окончательной конфигурации и статуса bond.

Лабораторная работа завершилась изучением подробного статуса bond с использованием команды cat /proc/net/bonding/bond0, которая предоставляет исчерпывающую информацию о конфигурации bond, его режиме и статусе всех подчиненных интерфейсов. Этот шаг проверки является важным в реальных сценариях для подтверждения того, что настройка агрегации работает должным образом.