Проблема с клиентами с двумя сетевыми интерфейсами и netplan, меняющим местами интерфейсы Ethernet.

Вопрос или проблема

Фон: более 1500 станций под управлением Ubuntu Server + ubuntu-desktop-minimal, большинство все еще используют версию 20.04, новые станции разворачиваются с версией 22.04 (с флагом ubuntu-desktop-minimal --no-install-recommends для 22.04). Пользователи должны иметь возможность взаимодействовать с GUI настроек сети, поэтому мы используем NetworkManager, настроенный с помощью netplan, для управления сетевыми настройками.

Мы столкнулись с интересной проблемой на Ubuntu Server 22.04, когда после запуска netplan для установки статических IP/DHCP настроек на 2 портах NIC на клиенте, через некоторое количество перезагрузок MAC-адрес, который был на eth0, появляется как MAC-адрес для eth1. Физическая смена кабеля на eth1 восстановит соединение с первоначально назначенным статическим IP для eth0. После очередной перезагрузки порты возвращаются в исходное состояние (потребуется еще одна смена кабеля, если он был также поменян в процессе). По нашему опыту, смена больше не происходила.

У нас есть 2 плейбука netplan, которые мы используем в процессе подготовки этих систем:

  1. 00-installer-config.yaml – устанавливается и применяется во время процесса установки PXE, устанавливает оба интерфейса для работы с DHCP
cat /etc/netplan/00-installer-config.yaml
# Это сетевые настройки, созданные 'subiquity'
network:
  ethernets:
    eth0:
      dhcp-identifier: mac
      dhcp4: true
    eth1:
      dhcp-identifier: mac
      dhcp4: true
  version: 2
  1. 01-network-manager-all.yaml – Плейбук запускается в процессе настройки станции, вскоре после создания образа. Первоначально мы думали, что проблема с “переключением” началась после выполнения этого плейбука; дальнейшее тестирование показало, что это не так.
cat /etc/netplan/01-network-manager-all.yaml
# НАЧАЛО БЛОКА, УПРАВЛЯЕМОГО ANSIBLE
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 172.31.252.51/24
      routes:
        - to: default
          via: 172.31.252.254
      nameservers:
        addresses: [172.16.103.251,172.16.103.252]
    eth1:
      dhcp4: no
# КОНЕЦ БЛОКА, УПРАВЛЯЕМОГО ANSIBLE

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

Кто-нибудь видел или даже слышал об ошибке подобного рода? У меня есть еще куча информации, я хотел сохранить вступительный пост разумным, рад предоставить дополнительные детали.

Попытки исправления:

  • Обновление версии ядра до 6.0, 6.1 и 6.4 в процессе установки PXE
  • удаление всех сервисов systemd-networkd после создания образа, чтобы все было принудительно переключено на NetworkManager
  • Добавление переменной match с совпадением name и driver. netplan успешно применен, перезагружен 5 раз без проблем, порты переключились на 6-й раз.
  • Стали ближе. Совпали по macaddress в Ansible, который создает 01 netplan после создания образа. Порты переключились после 4 перезагрузок, но странным образом сохранили соединение, несмотря на то, что ip addr показывал перевернутые IP-адреса.
- name: Копирование сетевой конфигурации в 01-network-manager-all.yaml
  blockinfile:
    path: /etc/netplan/01-network-manager-all.yaml
    block: |
      network:
        version: 2
        renderer: NetworkManager
        ethernets:
          eth0:
            match:
              macaddress: {{ansible_eth0.macaddress}}
            dhcp4: no
            addresses:
              - {{ ansible_host }}/24
            routes:
              - to: default
                via: {{ ansible_host.split('.')[0:3] | join('.') }}.254
            nameservers:
              addresses: {{ default_dns }}
          eth1:
            match:
              macaddress: {{ansible_eth1.macaddress}}
            dhcp4: no

Результирующий netplan:

cat /etc/netplan/01-network-manager-all.yaml
# НАЧАЛО БЛОКА, УПРАВЛЯЕМОГО ANSIBLE
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      match:
        macaddress: c4:00:ad:87:be:20
      dhcp4: no
      addresses:
        - 172.31.252.51/24
      routes:
        - to: default
          via: 172.31.252.254
      nameservers:
        addresses: [172.16.103.251,172.16.103.252]
    eth1:
      match:
        macaddress: c4:00:ad:87:be:1f
      dhcp4: no
# КОНЕЦ БЛОКА, УПРАВЛЯЕМОГО ANSIBLE

Перевернутые порты (которые все еще позволяют ssh к 172.31.252.51, без перемещения кабеля):

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether c4:00:ad:87:be:1f brd ff:ff:ff:ff:ff:ff
    altname enp0s31f6
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether c4:00:ad:87:be:20 brd ff:ff:ff:ff:ff:ff
    altname enp1s0
    inet 172.31.252.51/24 brd 172.31.252.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever

Мы в итоге пошли по пути, схожему с предложением Дэниела Т, и назвали порты в процессе PXE, что решило проблему.

Ответ или решение

Ситуация, связанная с тем, что при использовании Ubuntu Server 22.04 на системах с двойными сетевыми картами (NIC) происходит случайное "переключение" интерфейсов, действительно может быть вызвана несколькими факторами. Давайте подробно рассмотрим этот вопрос с учетом приведенных в вопросе данных.

Теория

Переключение сетевых интерфейсов — это явление, когда после перезагрузки операционной системы или оборудования системный идентификатор сетевого интерфейса, такой как eth0 или eth1, может "меняться местами". Это приводит к тому, что настройки, привязанные к определенному интерфейсу (например, eth0), будут применяться к другому интерфейсу (например, eth1), что вызывает проблемы с подключением и доступом к сети.

Причины такой проблемы могут включать:

  1. Изменения в порядке обнаружения устройства: Ядро может по-разному обнаруживать устройства в разные моменты времени, особенно если изменения произошли в оборудовании или конфигурации.
  2. Недетерминированные драйверы: Некоторые версии драйверов могут вести себя по-разному в зависимости от различных факторов (порядка загрузки, физического состояния портов и т.д.).
  3. Конфигурация netplan и NetworkManager: Некорректная конфигурация может привести к тому, что сетевые настройки не соответствуют физическим интерфейсам.
  4. Отсутствие жесткого связывания с аппаратными особенностями: Если конфигурации сетевых интерфейсов не привязаны к MAC-адресам или другим устойчивым идентификаторам, порядок обнаружения может меняться.

Пример

На практике это может проявляться следующим образом. Вы устанавливаете станции через PXE с использованием конфигурации 00-installer-config.yaml, где оба интерфейса настроены на DHCP. Затем вы обновляете эту конфигурацию с помощью файла 01-network-manager-all.yaml, в котором eth0 имеет статический IP. После нескольких перезагрузок MAC-адреса словно "меняются местами", и конфигурация сети становится непредсказуемой.

Применение

  1. Привязка интерфейсов к MAC-адресам: Одним из вариантов решения проблемы является использование параметра match с macaddress в файле конфигурации netplan. Это позволит закрепить настройки сети за определенным физическим интерфейсом, независимо от того, каким образом он будет обозначен в системе (eth0 или eth1). Пример:

    network:
     ethernets:
       eth0:
         match:
           macaddress: c4:00:ad:87:be:20
         addresses: [172.31.252.51/24]
         ...
  2. Использование предсказуемых имен интерфейсов: Вместо традиционных eth0, eth1 возможно использование предсказуемых имен интерфейсов, например, enp1s0, которые часто устойчивы к изменениям порядка обнаружения.

  3. Проверка конфигурации ядра и драйверов: Обновление ядра и сетевых драйверов может в некоторых случаях стабилизировать порядок обнаружения устройств.

  4. Определение и управление привязкой конфигураций через PXE: Как было отмечено из вашего ответа, создание имен для портов в процессе PXE оказалось эффективным способом решения. Это опирается на установку имен интерфейсов на этапе инициализации системы, что минимизирует возможность ротаций интерфейсов за счет более точных привязок.

Заключение

Проблемы с ротацией сетевых интерфейсов часто встречаются в больших сетях и могут оказывать серьезное влияние на работоспособность. Ключевым аспектом решения является привязка сетевых конфигураций через MAC-адреса и использование предсказуемых имен для интерфейсов, а также мониторинг и настройка ПО, чтобы оно соответствовало обновлениям оборудования и инфраструктуры. Решая такие вопросы, всегда полезно начинать с малого тестирования изменений на нескольких станциях, прежде чем разворачивать на все 1500+.

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

Капча загружается...