Ubuntu потрясающая операционная система, давно не работал с Ubuntu server а обновлять свой Desktop со стабильной версии не было смысла. И вот не давно пришлось столкнутся со свеженьким релизом Ubuntu server 18.04, моему удивлению не было предела, когда я понял что я бесконечно отстал от жизни и не могу настроить сеть т.к старая добрая система настройки сетевых интерфейсов по средствам редактирования файла /etc/network/interfaces канула в лепту. А что же пришло ей на смену? что то ужасное и на первый взгляд совершенно не понятное, встречайте «Netplan».

Признаться честно, сначала я не мог понять в чем дело и ''зачем это нужно, ведь все было так удобно", но получив немного практики понял что в нем есть свой шарм. И так хватит лирики продолжим, что же такое Netplan это новая утилита для настройки сети в Ubuntu, по крайне мере «в других дистрибутивах я не встречал подобного». Существенной отличие Netplan является то что конфигурация пишется на языке YAML, да да вы не ослышались YAML, разработчики решили идти в ногу со временем (и как бы много не расхваливали его я все-таки считаю его ужасным языком). Основной минус этого языка в том что он очень чувствителен к пробелам, давайте же рассмотрим конфиг на примере.

Файлы конфигурации находятся по пути /etc/netplan/имяфайла.yaml, между каждым блоком когда должно быть + 2 пробела.

1) Стандартная шапка выглядит так:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0f0:
      dhcp4:no

Давайте рассмотрим что мы сейчас сделали:

  • network: — это блок начало конфигурации.
  • renderer: networkd — здесь мы указываем сетевой менеджер который будем использовать, это либо networkd либо NetworkManager
  • version: 2 — тут как я понял версия YAML.
  • ethernets: — этот блок говорит о том что будем конфигурировать ethernet протокол.
  • enps0f0: — указываем какой сетевой адаптер будем конфигурировать.
  • dhcp4:no — отключаем DHCP v4, для 6 v6 dhcp6 соответственно

2) Попробуем назначить ip адреса:

    enp3s0f0:
      dhcp4:no
      macaddress: bb:11:13:ab:ff:32
      addresses: [10.10.10.2/24, 10.10.10.3/24]
      gateway4: 10.10.10.1
      nameservers:
        addresses: 8.8.8.8

Здесь мы задали мак, ipv4, шлюз и dns сервер. Замет те что если нам нужно больше одного ip адреса то мы пишем их через запятую с обязательным пробелом после.

3)А что если нам нужен bonding?

  bonds:
    bond0:
      dhcp4: no
      interfaces: [enp3s0f0, enp3s0f1]
      parameters: 
        mode: 802.3ad
        mii-monitor-interval: 1

  • bonds: — блок поясняющий что мы будем настраивать bonding.
  • bond0: — произвольное имя интерфейса.
  • interfaces: — набор интерфейсов собираемых в bond-динг, ''как оговаривалось ранее если параметров несколько описываем их в квадратных скобках".
  • parameters: — описываем блок настройки параметров
  • mode: — указываем мод по которому будет работать bonding.
  • mii-monitor-interval: — задаем интервал мониторинга 1 сек.

Внутри блока с именем bond-а также можно конфигурировать такие параметры как addresses,gateway4,routes итд.

Мы добавили резервирование для нашей сети, теперь осталось только повесить vlan и настройку можно считать оконченной.

vlans: 
    vlan10:
      id: 10
      link: bond0
      dhcp4: no
      addresses: [10.10.10.2/24]
      gateway: 10.10.10.1
      routes:
        - to: 10.10.10.2/24
          via: 10.10.10.1
          on-link: true

  • vlans: — объявляем блок настройки vlan.
  • vlan10: — произвольное имя vlan интерфейса.
  • id: — тег нашего vlan.
  • link: — интерфейс через который vlan будет доступен.
  • routes: — объявляем блок описания маршрутов.
  • — to: — задаем адрес/подсеть до которой необходим маршрут.
  • via: — указываем шлюз через которой будет доступна наша подсеть.
  • on-link: — указываем что прописывать маршруты всегда при поднятии линка.

Обратите внимание на то как я расставляю пробелы, в языке YAML это очень важно.

Вот мы описали сетевые интерфейсы, создали bonding, и даже добавили vlan-ы. Давайте применим наш конфиг, команда netplan apply проверит наш конфиг на наличие ошибок и применит его в случае успеха.Далее конфиг будет сам подниматься при перезагрузке системы.

Собрав все предыдущие блоки кода, вот что у нас получилось:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0f0:
      dhcp4: no
    ensp3s0f1:
      dhcp4: no
  bonds:
    bond0:
      dhcp4: no
      interfaces: [enp3s0f0, enp3s0f1]
      parameters: 
        mode: 802.3ad
        mii-monitor-interval: 1
  vlan10:
      id: 10
      link: bond0
      dhcp4: no
      addresses: [10.10.10.2/24]
      routes:
        - to: 10.10.10.2/24
          via: 10.10.10.1
          on-link: true
  vlan20:
    id: 20
    link: bond0
    dhcp4: no
    addresses: [10.10.11.2/24]
    gateway: 10.10.11.1
    nameserver:
      addresses: [8.8.8.8]
    

Вот наша сеть и готова к эксплуатации, все оказалось не так страшно как показалось вначале и код получился очень красивый и читабельный. P.C спасибо что по netplan есть отличный мануал по ссылке https://netplan.io/.

Комментарии (19)


  1. achekalin
    17.04.2019 07:37
    +1

    Так в чем шарм-то, и чем оно лучше, чем старое доброе понятное и точно, железобетонно работающее?


    1. mkpankov
      17.04.2019 11:32

      Декларативный язык "сделай мне вот так, мне всё равно как" и интеграция в networkd.


      1. achekalin
        17.04.2019 11:37

        А чем /etc/network/interfaces в этом смысле (кроме своего более понятного синтаксиса) не угодили?

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


        1. mkpankov
          17.04.2019 12:17

          Не могу сказать что мне они чем-то не угодили, просто из коробки в той же Ubuntu они сейчас не работают, и при отключении NetworkManager выбирая между откатом назад на них, и переходом вперед на netplan + networkd я выбрал второе. Я в целом думаю что systemd это довольно правильно, и интегрировать туда управление сетями тоже выглядит разумно.
          Со стороны старых interfaces — а они поддерживают, для примера, продвинутые настройки Wi-Fi (WPA2 Enterprise)?


  1. alexyr
    17.04.2019 09:02

    Стоит Ubuntu server 18.04.2 LTS
    Все настройки в /etc/network/interfaces
    Что-то я упустил, видимо…


    1. Naves
      17.04.2019 09:25

      Ага, вам кто-то незаметно сделал apt-get install ifupdown


      1. alexyr
        17.04.2019 10:43

        Вполне может быть, что это был именно я. Хотя, если подумать, оно могло остаться после do-release-upgrade с прошлого LTS.


    1. A1EF
      17.04.2019 10:54

      При обновлении (do-release-upgrade) netplan не ставится.


  1. Temmokan
    17.04.2019 09:29

    Я дико извиняюсь за придирки — вы специально оставили такую прорву грамматических ошибок?


  1. TonyLorencio
    17.04.2019 09:46

    Основной минус этого языка в том что он очень чувствителен к пробелам

    Валидный JSON (не очень чувствительный к пробелам) также является валидным YAML


  1. Next
    17.04.2019 10:17

    Все хорошо, но количество ошибок режет глаза) Пропускайте текст через проверку типа такой


    1. Alkop
      17.04.2019 10:36

      У автора даже в «User Info — Специализация» написано с ошибками :) проверку надо встраивать в Хабр :) Хотя она и в браузере есть…


  1. mkpankov
    17.04.2019 11:36

    Неплохая штука, но сырая.
    На днях начал пытаться подключиться к копроративному Wi-Fi с WPA2 Enterprise и токеном — требуется много совсем неочевидных настроек, которые даже не поддерживаются в версии netplan из Ubuntu 18.04. Пришлось поставить из исходников отсюда — конфигурация распарсилась, но что-то развалилось дальше. Понять что, почему и как починить опять сложно.


    1. scg
      17.04.2019 14:09

      А я дня три потратил, чтобы впилить автоматический запуск hostapd в netplan. Фишка была в том, что hostapd требует, чтобы интерфейс wlan был поднят, а netplan отказывается этот интерфейс поднимать, если у него статус NO CARRIER. А статус его не изменется, пока не запустится hostapd и так по кругу. Пришлось вкорячивать напрямую в Systemd.


      1. mkpankov
        17.04.2019 14:18

        Вот этого я вообще не понимаю.
        Ну no-carrier и что? Интерфейс-то остался и когда carrier появится всё продолжит работать. Это вообще от меня не зависит, удалённый конец питание потерял.


        1. scg
          17.04.2019 21:40

          Я понимаю, что они попытались заменить не очень красаиый и запутанный interfaces на более простой и понятный конфиг YAML, но при этом не учли, что вся эта сложность складывалась из кучи мелочей. Когда они начнут эти мелочи доделывать, то у них получится тот же interfaces.


  1. bibliary
    17.04.2019 18:56

    Cтранная штука. Я пару раз столкнулся со свежими бубунтами — хорошо так материл что теперь нельзя табуляцию и это никто особо не выделял. Потом правда начались проблемы с описанием раутов, они то нормально кушались при чеке конфигов, то не кушались. Плюнул и вернул старый добый способ через interfaces.


  1. d-stream
    18.04.2019 00:41

    После того когда «все повалилось» после перетасовки нескольких ip адресов на одном интерфейсе… матюкнулся «наркоманы, блин»… пожалился ярому линуксоиду, а он мне ссылку www.linux.org.ru/forum/general/14382640 )

    p.s. сам не совсем чтобы линуксоид, так балуюсь еще со времен книжки со стрелками


  1. Pinkerton42
    18.04.2019 08:17

    Так и не смог заставить работать netplan в случае автоматического получения адреса, но ручной установки шлюза по умолчанию.