Поиск по сайту:

NMState: инструмент декларативной настройки сети


Экосистема Linux предоставляет множество способов настройки сети, включая популярный демон Network Manager и инструменты командной строки, такие как утилита nmcli и nmtui GUI. В этом руководстве представлен еще один инструмент настройки сети, известный как NMState.

NMState — декларативный сетевой менеджер для настройки сети на хостах Linux. Это библиотека, предоставляющая инструмент командной строки, который управляет настройками сети хоста. Он управляет сетью хостов через декларативный API северного направления. На момент написания этого руководства демон NetworkManager был единственным поставщиком, поддерживаемым NMState.

В этом руководстве мы рассмотрим некоторые примеры использования инструмента NMState. В этом руководстве мы продемонстрируем это с помощью Fedora Linux.

Императивные и декларативные подходы

Управление сетью может осуществляться двумя способами: императивным и декларативным. При императивном подходе вы явно определяете сетевое состояние интерфейса, выполняя команды на терминале. Основное внимание уделяется тому, «как».

Например, чтобы отключить сеть с использованием императивного подхода, выполните команду:

sudo ifconfig enp0s3 down

С другой стороны, декларативный подход использует файл YAML для применения изменений к конфигурации. Большинство инструментов оркестрации DevOps, таких как Kubernetes, используют этот подход для развертывания приложений модулей с помощью файла YAML.

Этот подход обеспечивает то, что в кругах DevOps обычно называют инфраструктурой как кодом (IaC). Это повышает автоматизацию настройки сети на хосте и обеспечивает быстрый и более надежный способ внесения многочисленных изменений в сетевой интерфейс с минимальными ошибками.

Теперь давайте переключимся и посмотрим, как можно использовать инструмент настройки NMState для настройки сетевых интерфейсов в Linux.

Шаг 1. Установите инструмент настройки сети NMState.

Мы начнем работу, установив Nmstate. Сначала проверьте доступность пакета в репозиториях Fedora следующим образом:

sudo dnf search nmstate

Из вывода мы видим, что сетевой менеджер доступен в официальных репозиториях.

Затем установите NMstate следующим образом. Это работает в Fedora 31 и более поздних версиях.

sudo dnf install nmstate

Эта команда устанавливает API сетевого менеджера NMState вместе с другими зависимостями Python.

После завершения установки убедитесь, что пакет nmstate установлен следующим образом.

rpm -qi nmstate

Для Linux на базе RHEL сначала включите репозиторий copr.

sudo dnf copr enable nmstate/nmstate-stable

Затем установите NMstate следующим образом.

sudo dnf install nmstate

Ознакомьтесь с дополнительными инструкциями по установке NMState из исходного кода.

После установки вы можете проверить установленную версию NMstate следующим образом.

nmstatectl version

1.0.2

Использование инструмента настройки NMState в Linux

Установив NMstate, давайте перейдем к тонкостям того, как максимально эффективно использовать API сетевого менеджера.

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

nmstatectl show enp0s3

Вывод разделен на 4 отдельных раздела:

  • dns-resolver: этот раздел содержит конфигурацию сервера имен для конкретного интерфейса.
  • route-rules: определяет правила маршрутизации.
  • маршруты: сюда входят как динамические, так и статические маршруты.
  • Интерфейсы. В этом разделе указаны настройки ipv4 и ipv6.

Изменение конфигурации сети в Linux

Вы можете использовать инструмент настройки NMState для настройки хостов в желаемое состояние, используя интерактивный или файловый режимы.

  • Интерактивный: редактирует сетевой интерфейс с помощью команды nmstatectl edit. Эта команда открывает текстовый редактор, который определяется переменной среды EDITOR. После сохранения изменений NMState немедленно применяет новую конфигурацию, если не были обнаружены синтаксические ошибки.
  • На основе файла. В файловом режиме конфигурация интерфейса применяется с использованием файла YAML или JSON с помощью команды nmstatectl apply.

Давайте теперь запачкаем руки и посмотрим, как можно изменить конфигурацию сети с помощью NMState.

Наша система Fedora имеет два активных сетевых интерфейса со следующей конфигурацией:

ip -br -4 a
Пример вывода
lo               UNKNOWN        127.0.0.1/8 
enp0s3           UP             192.168.2.104/24 
enp0s8           UP             192.168.2.103/24 

Пример режима интерактивной конфигурации

Мы будем использовать интерактивный режим для изменения MTU (Максимальная единица передачи) сетевого интерфейса enp0s3. По умолчанию установлено значение 1500, как показано.

ifconfig

Мы изменим это значение на 4000. Мы сделаем это с помощью команды nmstatectl edit следующим образом.

sudo nmstatectl edit enp0s3

Откроется конфигурация в текстовом редакторе. В нашем случае он открывается в редакторе vim. Затем прокрутите вниз до конца и найдите параметр mtu. Мы изменим значение на 4000, как если бы мы редактировали файл в vim. Затем сохраним изменения.

Когда вы сохраните файл и закроете его, вы увидите на терминале зашифрованный вывод, поскольку NMstate сохраняет изменения. Никакого вмешательства не требуется, просто сидите спокойно.

Теперь подтвердим, что изменение было внесено.

ifconfig

Из вывода терминала мы видим, что мы успешно изменили MTU на 4000 со значения по умолчанию 1500.

Пример режима файловой конфигурации

Давайте теперь изменим конфигурацию, используя файловый режим. В этом примере мы собираемся отключить IPv6 для сетевого интерфейса enp0s8. Первым шагом является создание файла YAML, в котором будет указано желаемое состояние сетевого интерфейса enp0s8.

sudo nmstatectl show enp0s8 > enp0s8.yml

Далее мы отредактируем файл YAML следующим образом.

sudo vim enp0s8.yml

Прокрутите вниз до раздела ipv6. Чтобы отключить IPv6, установите для параметра Enabled значение false и удалите зачеркнутые строки.

Сохраните конфигурацию и примените новое состояние, используя файл YAML, следующим образом.

sudo nmstatectl apply enp0s8.yml

Теперь запустите показанную команду, чтобы убедиться, что IPv6 отключен. Отображаемые выходные данные показывают, что IPv6 для сетевого интерфейса enp0s8 пуст, что означает, что мы успешно отключили IPv6 на этом интерфейсе.

ip -br a 

Временное применение сетевых изменений

Еще одна действительно удобная функция, которую предоставляет NMstate, — это возможность временно настроить желаемое состояние сети. Если вы удовлетворены настройкой, вы можете продолжить и сделать изменения постоянными. В противном случае внесенные изменения вернутся к исходным настройкам по истечении таймаута. Тайм-аут по умолчанию составляет 60 секунд.

Чтобы продемонстрировать это, мы временно установим статический IP-адрес на интерфейсе enp0s3 и отключим DHCP. Еще раз откройте файл с помощью текстового редактора.

sudo vim enp0s3.yml

Прокрутите страницу до раздела ipv4. Укажите статический IP — в нашем случае 192.168.2.150 и удалите зачеркнутые строки. Кроме того, обязательно установите для параметра dhcp значение false.

Сохраните файл и временно зафиксируйте изменения следующим образом.

sudo nmstatectl apply --no-commit --timeout 20 enp0s3.yml

Опция --no-commit временно применяет изменения в течение периода, определенного опцией --timeout, который в этом примере составляет 20 секунд.

Чтобы проверить временное применение изменений, мы проверим конфигурацию IP через интервал времени 20 секунд.

ip -br a 

Из выходных данных видно, что конфигурация IP интерфейса вернулась к DHCP через 20 секунд. IP-адрес вернулся к 192.168.2.104 с ранее статически настроенного IP-адреса, который был 192.168.2.150.

Следует признать, что инструмент NMState — удобный инструмент для настройки сетевых интерфейсов. Это декларативный инструмент, который применяет желаемое состояние конфигурации интерфейса хоста с помощью API NetworkManager.

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