Здравствуйте, уважаемые читатели!
Сегодня я бы хотел рассказать о проблеме работы сетевой подсистемы в Astra Linux, с которой я впервые столкнулся в 2019 году.
Общая характеристика следующая — после перезагрузки периодически не работает сеть (статус интерфейса DOWN).
С подобной проблемой ко мне обратились уже дважды за этот год, причём во втором случае коллеги (из другого филиала) воспринимали происходящее, как данность. Именно поэтому я решил рассказать, как выявить и исправить подобную ошибку.
Но вернёмся в 2019 год (для ленивого читателя рекомендую сразу перейти к концу заметки, где изложено решение проблемы).
Я настроил сеть (для этого я использую systemd-networkd), всё проверил — система функционировала, как и было задумано.
Спустя неделю меня позвали мои коллеги, которые не смогли отправить почту — не было соединения с почтовым сервером.
Разумеется, диагностику я начал с утилиты ping — как я и думал, сервер был недоступен.
До этого у нас был ряд физических проблем, поэтому я начал с них — проверка целостности кабеля показала, что кабель исправен, а перезагрузка коммутатора результата не принесла.
Я перезагрузил систему на проблемном компьютере и сеть появилась. До этого, на Astra Linux SE 1.5, я сталкивался с некорректной работой сетевых карт, которая решалась сборкой актуальных модулей ядра, поэтому подумал, что причина могла повториться.
Так как свободного времени в тот момент не было, я решил дождаться повторного сбоя.
Я почти забыл о проблеме — следующий сбой произошёл через пару недель, причём мои коллеги заметили, что обычно (но не всегда) помогает перезагрузка, а если компьютер не выключать — то проблемы с сетью вообще не возникали.
Примерно тогда же появился ещё один компьютер с такой же конфигурацией, что и проблемный. И у него было всё то же самое — проблему нужно было решать.
Я выделил время и приступил к поиску неполадки — начал (и закончил) с лога /var/log/messages.
При внимательном изучении, я заметил, что используемому сетевому интерфейсу периодически присваивается имя eth0, когда как сетевые настройки я задавал для eth1. И наоборот, встроенный в материнскую плату сетевой интерфейс вместо eth0 иногда становился eth1.
Картина окончательно сложилась – иногда ядро инициализировало сетевые интерфейсы в случайном порядке, тем самым демон настройки сети корректно отработав, настраивал не активный сетевой интерфейс (банально не тот).
На моей памяти это был первый подобный случай — я задумался «А возможно настроить сетевой интерфейс не по имени?».
Разумеется можно! Как обычно всё было придумано до нас.
Systemd-networkd умеет настраивать сетевые интерфейсы не только по имени, но и десятком других способов (например по MAC адресу или наименованию драйвера).
Так как рабочий сетевой интерфейс в моём случае использовал модуль ядра via-rhine, а нерабочий e1000 я решил использовать имя модуля, как отправную точку для его последующей настройки.
Сейчас я в общих чертах отражу алгоритм настройки сети с использованием systemd-networkd, чтобы Вы смогли решить указанную проблему, если она возникнет.
Отключим демоны настройки сети использующиеся по-умолчанию:
systemctl disable NetworkManager networking
systemctl stop NetworkManager networking
systemctl mask NetworkManager
Узнаем, какой модуль использует интересующая нас сетевая карта:
lspci –k
Создадим файл конфигурации systemd-networkd:
mcedit /etc/systemd/network/net.network
[Match]
Driver=via-rhine
[Network]
Address=192.168.0.22/24
Gateway=192.168.0.1
Сохраним файл (разумеется, параметры для настройки сети и модуль ядра — укажите свои).
Запустим демон systemd-networkd:
systemctl enable --now systemd-networkd
Вот и всё. Проблема решена и теперь система будет ориентироваться не на имена сетевых интерфейсов, а на модуль ядра, используемый при инициализации данного интерфейса.
Ещё один вариант решения проблемы – просто отключить неиспользуемый сетевой интерфейс в настройках BIOS.
На этом прощаюсь, всем хорошего дня!
А я решал этот вопрос через /etc/udev.d/70_persistent_net_rules
Эту фишку я еще по Debian 4 помню.
Вариантов решения на самом деле несколько, Ваш ничем не хуже)