Отказоустойчивость доступа к сети в Linux

24/11/2020

linux net

Те, кто занимается сетевыми технологиями, наверняка знает множество различных способов обеспечения отказоустойчивости компьютерных сетей. При этом есть как общеиспользуемые стандартизированные решения на L2 или L3 уровнях, так и узкие специализированные наработки. Сервера Linux также обладают всем необходимым функционалом, чтобы обеспечить выживаемость сервера в случае выхода из строя сетевой карты или отдельного коммутатора. Для этого используется функционал бондинга (bonding), который позволяет объединять в один общий виртуальный линк несколько физических интерфейсов. Данная возможность присутствует в различных дистрибутивах операционной системы Linux и может отличаться небольшой спецификой в настройке. Разные дистрибутивы используют свои конкретные механизмы настройки сети. Однако, непосредственные технические возможности по обеспечению сетевой отказоустойчивости остаются идентичными.

С помощью бондинга мы можем объединять несколько Ethernet интерфейсов в один виртуальный линк. При этом с противоположной стороны могут находиться как несколько различных коммутаторов, так и одно сетевое устройство. Так в случае использования протокола LACP мы можем объединить и одновременно использовать неисколько интерфейсов одновременно. Это позволяет обеспечить не только отказоустойчивость, но и повысить скорость доступа к сети в случае такой необходимости. Но для этого мы должны подключать все интерфейсы в один коммутатор, который поддерживает протокол LACP. Если же мы подключаем сетевые интерфейсы к различным коммутаторам, то можем использовать режим бондинга active-backup, который использует только один активный линк в данное конкретное время, но позволяет переключаться на резервные в случае выхода из строя основного.

Настройка bonding в Debian

Давайте посмотрим, как настроить бондинг в текущей актуальной версии Debian 10 Buster. Предположим, что у нас есть 2 сетевых Ethernet интерфейса, определяемых в ОС как eno1 и eno2. Данные сетевые интерфейсы подключены к 2 разным коммутаторам, которые находятся в одном broadcast домене. Мы хотим обеспечить отказоустойчивоть сетевого подключения на случай выхода из строя одного из сетевых адаптеров, либо сетевого кабеля или коммутатора. Для этого используем bonding с типом active-backup. В первую очередь установим в систему пакет ifenslave, без которого бондинг не будет работать.

# sudo apt-get install ifenslave

Теперь нужно провести перенастройку файла /etc/network/interfaces, в котором содержится информация о конфигурации сетевых интерфейсов. Простейший пример с 2 ethernet интерфейсами в системе приведен ниже.

auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet static
        address 192.168.1.254
        netmask 255.255.255.0
        gateway 192.168.1.1
        slaves eno1 eno2
        bond-mode active-backup
        bond-miimon 100
        bond-primary eno1 eno2

После того, как необходимые нам коррективы в файле будут завершены проводим перезагрузку сети с помощью команды в Debian Linux:

# service networking restart

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

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

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eno1 (primary_reselect always)
Currently Active Slave: eno1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0

Slave Interface: eno1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:22:22:01:01:01
Slave queue ID: 0

Slave Interface: eno2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:22:22:01:01:02
Slave queue ID: 0

Настройка bonding в Ubuntu

В последней версии Ubunut 20.04 Focal Fossa настройка сетевых подключений и бондинга в том числе производится через конфигурационные файлы YAML в директории /etc/netplan. Настройка бондинга в Ubuntu функционально анологичного тому, который мы показали выше в Debian, представлена ниже. Для этого используем любой файл с расширением .yaml в директории /etc/netplan. Пример такого файла представлен далее.

network:
  bonds:
    bond0:
      addresses:
      - 192.168.1.254/24
      gateway4: 192.168.1.1
      interfaces:
      - eno1
      - eno2
      parameters:
        mode: active-backup
        mii-monitor-interval: 100
  ethernets:
    eno1: {}
    eno2: {}
  version: 2

После завершения правки конфигурационного файла, для того чтобы они вступили в силу, выполняем команду netplan.

# netplan apply

Данная команда применит все настройки в сетевой подсистеме, и мы получим работающий bond интерфейс. Получение информации о статусе bond интерфейсов такое же, как и в операционной системе Debian — с помощью файлов из директории /proc/net/bonding.

Интересное практическое замечание касательно настройки и запуска в работу бондинг интерфейсов в операционной системе Ubunut 20.04. После настройки нужных сетевых параметров и примерения их с помощью команды netplan бондинг появляется и работает в системе. Однако в режиме active-backup смена активного интерфейса не происходит при падении сети на основном линке. Необходимо полностью перезагрузить операционную систему, чтобы весь нужный нам функционал заработал. Надеюсь в следующих релизах данного дистрибутива, эта проблема будет устранена.

Заключение

Netowrk Bonding — нужная фишка в операционной системе Linux, которая пригодится в работе при использовании физических серверов. В последнее время, когда большая часть серверов виртуализирована, возможно, не так часто и приходится использовать bonding в реальной жизни. Но все равно бывают случаи, когда операционные системы приходится устанавливать непосредственно на железо. В таких случаях для обеспечения сетевой отказоустойчивости операционной системы Linux бондинг будет для вас незаменимым инструментом.

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

Ваш адрес email не будет опубликован.