Вопрос или проблема
Фон: более 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
, которые мы используем в процессе подготовки этих систем:
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
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, который создает 01netplan
после создания образа. Порты переключились после 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
), что вызывает проблемы с подключением и доступом к сети.
Причины такой проблемы могут включать:
- Изменения в порядке обнаружения устройства: Ядро может по-разному обнаруживать устройства в разные моменты времени, особенно если изменения произошли в оборудовании или конфигурации.
- Недетерминированные драйверы: Некоторые версии драйверов могут вести себя по-разному в зависимости от различных факторов (порядка загрузки, физического состояния портов и т.д.).
- Конфигурация
netplan
иNetworkManager
: Некорректная конфигурация может привести к тому, что сетевые настройки не соответствуют физическим интерфейсам. - Отсутствие жесткого связывания с аппаратными особенностями: Если конфигурации сетевых интерфейсов не привязаны к MAC-адресам или другим устойчивым идентификаторам, порядок обнаружения может меняться.
Пример
На практике это может проявляться следующим образом. Вы устанавливаете станции через PXE с использованием конфигурации 00-installer-config.yaml
, где оба интерфейса настроены на DHCP. Затем вы обновляете эту конфигурацию с помощью файла 01-network-manager-all.yaml
, в котором eth0
имеет статический IP. После нескольких перезагрузок MAC-адреса словно "меняются местами", и конфигурация сети становится непредсказуемой.
Применение
-
Привязка интерфейсов к MAC-адресам: Одним из вариантов решения проблемы является использование параметра
match
сmacaddress
в файле конфигурации netplan. Это позволит закрепить настройки сети за определенным физическим интерфейсом, независимо от того, каким образом он будет обозначен в системе (eth0
илиeth1
). Пример:network: ethernets: eth0: match: macaddress: c4:00:ad:87:be:20 addresses: [172.31.252.51/24] ...
-
Использование предсказуемых имен интерфейсов: Вместо традиционных
eth0
,eth1
возможно использование предсказуемых имен интерфейсов, например,enp1s0
, которые часто устойчивы к изменениям порядка обнаружения. -
Проверка конфигурации ядра и драйверов: Обновление ядра и сетевых драйверов может в некоторых случаях стабилизировать порядок обнаружения устройств.
-
Определение и управление привязкой конфигураций через PXE: Как было отмечено из вашего ответа, создание имен для портов в процессе PXE оказалось эффективным способом решения. Это опирается на установку имен интерфейсов на этапе инициализации системы, что минимизирует возможность ротаций интерфейсов за счет более точных привязок.
Заключение
Проблемы с ротацией сетевых интерфейсов часто встречаются в больших сетях и могут оказывать серьезное влияние на работоспособность. Ключевым аспектом решения является привязка сетевых конфигураций через MAC-адреса и использование предсказуемых имен для интерфейсов, а также мониторинг и настройка ПО, чтобы оно соответствовало обновлениям оборудования и инфраструктуры. Решая такие вопросы, всегда полезно начинать с малого тестирования изменений на нескольких станциях, прежде чем разворачивать на все 1500+.