Systemd-networkd

Материал из ALT Linux Wiki

systemd-networkd — системная служба для управления сетевыми настройками. Его задачей является обнаружение и настройка сетевых устройств по мере их появления, а также создание виртуальных сетевых устройств.

systemd/udev автоматически назначает постоянные имена для обнаруженных Ethernet, WLAN и WWAN-интерфейсов. Список интерфейсов можно увидеть, выполнив команду networkctl list.

После изменения файлов конфигурации, чтобы изменения вступили в силу необходимо перезапустить службу systemd-networkd.service или выполнить команду networkctl reload.

Конфигурационные файлы

Конфигурационные файлы сетевых служб systemd хранятся в каталоге /etc/systemd/network.

Существует три типа конфигурационных файлов:

  • .network — описывают параметры сети: IP, маршруты, DNS и другие;
  • .link — описывают физические параметры каждого интерфейса: имя, MAC, MTU и т.д.;
  • .netdev — описывают виртуальные интерфейсы, мосты.
Примечание: systemd понимает значения 1, true, yes, on как логическое true, а 0, false, no, off — как false.

Файл .network

Ниже приведены некоторые параметры основных разделов файла .network. Подробнее см. man systemd.network(5).

Раздел [Match]

Раздел [Match] определяет, может ли данный сетевой файл быть применен к данному устройству.

Параметр Описание Пример
MACAddress= Разделённый пробелами список MAC-адресов (в шестнадцатеричном формате); в качестве внутреннего разделителя в адресах можно использовать двоеточия, дефисы и точки 08:00:27:4c:fc:4a 08-00-27-ae-ad:d5
Type= Разделённый пробелами список типов интерфейсов (как в выводе команды networkctl list) ether wlan
Name= Разделённый пробелами список SSID подключенных беспроводных локальных сетей. Символ ! в начале инвертирует результаты поиска.
SSID= Разделённый пробелами список названий интерфейсов (можно указывать шаблоны с подстановочными символами в стиле командной оболочки). Символ ! в начале инвертирует результаты поиска. enp0s3
Host= Имя хоста или machine ID
Virtualization= Проверка на работу в виртуальном окружении, и, при необходимости, проверка, конкретной реализации виртуального окружения (Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или ВМ) qemu

Раздел [Network]

Раздел [Network] определяет способ настройки устройства.

Параметр Описание Пример
Description= Описание устройства
DHCP= Включает поддержку клиентов DHCPv4 и/или DHCPv6. Принимает значения «yes», «no» (по умолчанию), «ipv4» или «ipv6». Дополнительные настройки DHCP устанавливаются в разделах [DHCPv4] или [DHCPv6] ipv4
DHCPServer= Запуск сервера DHCPv4. Принимает значения «yes», «no» (по умолчанию). Дополнительные настройки DHCP-сервера можно задать в разделе [DHCPServer] true
LinkLocalAddressing= Включает автоконфигурацию локального адреса канала. Принимает значения «yes», «no», «ipv4» или «ipv6». Локальный адрес канала IPv6 настраивается при значениях «yes» или «ipv6». Локальный адрес канала IPv4 настраивается при значениях «yes» или «ipv4» и если автоконфигурация DHCPv4 в течение некоторого времени не удалась. Данный параметр позволяет избежать появления в системе IPv6 адреса.
Address= Статический IPv4 или IPv6 адрес и длина его префикса, разделенные символом «/». Этот параметр можно указать несколько раз. Этот параметр заменяет раздел [Address], если раздел содержит только ключ Address=. Опция обязательна, если не используется DHCP. Если указано значение 0.0.0.0 (для IPv4) или :: (для IPv6), то будет выделен неиспользуемый блок адресов заданного размера. Длина префикса не может быть меньше 8 для IPv4 и 64 для IPv6. 192.168.0.196/24
Gateway= Адрес шлюза. Этот параметр заменяет раздел [Route], если раздел содержит только ключ Gateway=. Параметр можно указать более одного раза. 192.168.0.1
DNS= Адрес DNS-сервера. Параметр можно указать более одного раза. 8.8.8.8
Domains= Разделённый пробелами список доменов, которые должны разрешаться с использованием DNS-сервера. Каждый элемент в списке должен представлять собой доменное имя, возможно, с префиксом тильды («~»).
IPForward= Управляет пересылкой входящих пакетов на другой интерфейс в соответствии с таблицей маршрутизации. Если этот параметр включен, входящие пакеты на любом сетевом интерфейсе будут пересылаться на любые другие интерфейсы в соответствии с таблицей маршрутизации. Принимает логическое значение или значения «ipv4» или «ipv6», которые включают пересылку IP-пакетов только для указанного семейства адресов. false
IPMasquerade= Если опция включена, то при пересылке пакетов IP-адрес источника подменяется адресом локального сетевого интерфейса. Принимает одно из значений «ipv4», «ipv6», «both» или «no». По умолчанию «no». Если этот параметр включен, IPForward= автоматически устанавливается в одно из значений «ipv4», «ipv6» или «yes».
IPv6AcceptRA= Принимает логическое значение. Управляет поддержкой приема объявления маршрутизатора IPv6 (RA) для интерфейса. Если параметр имеет значение «true», RA принимаются; если «false», RA игнорируются. false

Раздел [DHCPV4]

Параметр Описание Пример
UseDomains= Использование полученного от DHCP-сервера домена в качестве адреса для DNS-поиска. Если задано значение route, полученное доменное имя будет использоваться только для маршрутизации DNS-запросов, но не для поиска. true
UseDNS= Объявление DNS-сервера при работе DHCP-сервера. yes
DenyList= Разделённый пробелами список IPv4-адресов. DHCP-предложения от серверов в списке отклоняются. Если настроен AllowList=, то DenyList= игнорируется. 192.168.0.1 192.168.0.128/25
AllowList= Разделённый пробелами список IPv4-адресов. DHCP-предложения от серверов в списке принимаются.

Файл .netdev

В файлах .netdev описывается создание виртуальных сетевых интерфейсов. Ниже приведены некоторые параметры файла .network. Подробнее см. man systemd.netdev(5).

Раздел [Match]

Раздел [Match] определяет, может ли данный сетевой файл быть применен к данному устройству.

Параметр Описание Пример
Host= Имя хоста или machine ID
Virtualization= Проверка на работу в виртуальном окружении, и, при необходимости, проверка, конкретной реализации виртуального окружения (Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или ВМ) qemu

Раздел [Netdev]

Параметр Описание Пример
Description= Описание netdev
Name= Имя интерфейса, используемое при создании файла netdev. Параметр обязателен ipv4
Kind= Вид интерфейса. Например, bridge, bond, vlan, veth, sit и т.д. Параметр обязателен bridge
MTUBytes= Максимальная единица передачи в байтах, которую можно установить для устройства.
MACAddress= Указывает MAC-адрес, который будет использоваться устройством, или принимает специальное значение «none». Если установлено значение «none», systemd-networkd не запрашивает MAC-адрес устройства, и ядро назначит случайный MAC-адрес. Для устройств «tun», «tap» или «l2tp» параметр MACAddress= в разделе [NetDev] не поддерживается и игнорируется (следует указать его в разделе [Link] соответствующего файла systemd.network). Если эта опция не установлена, устройство «vlan» наследует MAC-адрес главного интерфейса. Для других типов сетевых устройств, если эта опция не установлена, MAC-адрес генерируется на основе имени интерфейса и идентификатора машины. none

Раздел [Bond]

Раздел [Bond] применяется только для сетевых устройств типа «bond».

Параметр Описание Пример
Mode= Режим объединения. Возможные значения: «balance-rr» (по умолчанию), «active-backup», «balance-xor», «broadcast», «802.3ad», «balance-tlb» и «balance-alb». active-backup
TransmitHashPolicy= Выбирает политику хеширования передачи, которая будет использоваться для выбора подчиненного устройства в режимах «balance-xor», «802.3ad» и «balance-tlb». Возможные значения: «layer2», «layer3+4», «layer2+3», «encap2+3» и «encap3+4». layer3+4
LACPTransmitRate= Определяет, с каким интервалом управляющие пакеты LACPDU отправляются по каналу LACP: каждую секунду (fast) или каждые 30 секунд (slow). Значение по умолчанию — slow fast
MIIMonitorSec= Устанавливает периодичность MII мониторинга в миллисекундах. Значение 0 (по умолчанию) отключает мониторинг канала MII. Значение округляется до ближайшей миллисекунды.
UpDelaySec= Задает время задержки в миллисекундах, перед тем как поднять линк при обнаружении восстановления канала. значение округляется до кратного MIIMonitorSec=. Значение по умолчанию — 0. 0
DownDelaySec= Задает время задержки в миллисекундах, перед тем как отключить линк при обнаружении отключения канала. значение округляется до кратного MIIMonitorSec=. Значение по умолчанию — 0. 0
AdSelect= Указывает используемую логику выбора агрегата 802.3ad. Возможные значения: «stable», «bandwidth» и «count».
AdActorSystemPriority= Указывает системный приоритет 802.3ad. Принимает число в диапазоне 1…65535.
AdUserPortKey= Указывает определяемую пользователем часть ключа порта 802.3ad. Принимает число в диапазоне 0…1023.

Пример настройки сетевого объединения (файл /etc/systemd/network/25-bond.netdev:

[NetDev]
Name=bond1
Kind=bond

[Bond]
Mode=802.3ad
TransmitHashPolicy=layer3+4
MIIMonitorSec=1s
LACPTransmitRate=fast

Раздел [VLAN]

Раздел [VLAN] применяется только для сетевых устройств типа «vlan».

Параметр Описание Пример
Id= Идентификатор VLAN. Целое число в диапазоне 0…4094. Параметр обязателен 100
Protocol= Протокол, используемый для интерфейса VLAN. Возможные значения: «802.1q» или «802.1ad». По умолчанию не установлено и используется значение по умолчанию ядра. 802.1q

Пример настройки VLAN (файл /etc/systemd/network/30-vlan.netdev:

[Match]
Virtualization=no

[NetDev]
Name=vlan100
Kind=vlan

[VLAN]
Id=100

Файлы link

Файлы .link можно использовать для назначения интерфейсу нового имени вместо редактирования правил udev. Файлы .link выступают в качестве альтернативы пользовательским правилам udev и применяются при обнаружении менеджером нового устройства. Файл состоит из двух разделов, [Match] и [Link]. Ниже приведены основные параметры обоих разделов. Подробнее см. man systemd.link(5).

Раздел [Match]

Раздел [Match] определяет, может ли данный файл .link быть применен к данному устройству.

Параметр Описание Пример
MACAddress= Разделённый пробелами список MAC-адресов (в шестнадцатеричном формате); в качестве внутреннего разделителя в адресах можно использовать двоеточия, дефисы и точки 08:00:27:4c:fc:4a 08-00-27-ae-ad:d5
Type= Разделённый пробелами список типов интерфейсов (как в выводе команды networkctl list) ether wlan
Host= Имя хоста или machine ID
Virtualization= Проверка на работу в виртуальном окружении, и, при необходимости, проверка, конкретной реализации виртуального окружения (Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или ВМ) qemu

Раздел [Link]

Параметр Описание Пример
MACAddressPolicy= Политика, согласно которой должен быть установлен MAC-адрес. Доступные политики: «persistent», «random», «none». none
MACAddress= Использование конкретного адреса. Чтобы этот параметр вступил в силу, MACAddressPolicy= должен быть не установлен, пуст или иметь значение «none».
NamePolicy= Политики выбора и назначения имён интерфейсов, например, kernel, keep и т.д.

Примеры

Переключение с etcnet/NetworkManager на systemd-networkd

Подготовка

  1. Установка пакета systemd-timesyncd, который пригодится сразу после переезда, автоматически тянет за собой собственно systemd-networkd:
    # apt-get install -y systemd-timesyncd
    
  2. Дабы оставить возможность отката, вместо сноса etcnet пока достаточно просто переименовать его каталог:
     # mv -f /etc/net /etc/net.old
    
  3. Создать в каталоге /etc/systemd/network/ пару файлов автонастройки по DHCP для проводных (lan.network) и беспроводных (wifi.network) интерфейсов (предварительно удостоверившись в отсутствии настроенных на статические адреса туннелей, вланов, мостов и т.п.) со следующим содержимым:
    [Match]
    Name = X* # вместо "Х" — "e" для lan.network и "w" для wifi.network
    
    [Network]
    DHCP = ipv4
    

Проводная сеть

Пора переключиться с etcnet/NetworkManager на systemd-networkd:

# systemctl disable --now network NetworkManager && systemctl enable --now systemd-{network,timesync}d

Для проверки работоспособности нового сервиса следует перезагрузиться с воткнутым сетевым кабелем (поскольку Wi-Fi ещё не настроен) и сразу после перезагрузки — убедиться, что адрес получен каким-то из интерфейсов:

$ networkctl
$ ip -o a s | awk '!/inet6|lo /'

Беспроводная сеть

Для подключения к Wi-Fi понадобится включить авторизацию:

# systemctl enable wpa_supplicant@wlan0

И создать вот такой файл:

/etc/wpa_supplicant/wpa_supplicant-wlan0.conf  
 ctrl_interface=/run/wpa_supplicant
 ctrl_interface_group=wheel
 eapol_version=2
 fast_reauth=1
 ## Только для бродкомов ##
 #preassoc_mac_addr=0
 #mac_addr=0
 ##########################

Чтоб подключаться к точке доступа по паролю, нужно:

  1. Добавить её, не светя пароль в настройках:
    # wpa_passphrase "BSSID" "пароль" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
    
  2. Перезапустить авторизацию на интерфейсе:
    # systemctl restart wpa_supplicant@wlan0
    

Осталось перезагрузиться с выдернутым сетевым кабелем и способом, описанным выше, проверить работоспособность уже Wi-Fi.

Для отключения Wi-Fi достаточно остановить авторизацию:

# systemctl stop wpa_supplicant@wlan0

DNS

С получением ДНС-серверов по сети прекрасно справляется systemd-resolved, который нужно установить, запустить и нацелиться на /run/systemd/resolve/resolv.conf символьной ссылкой /etc/resolv.conf, заменив ею файл openresolv'а:

# apt-get install systemd-resolved
# systemctl enable --now systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Для фиксации имени компьютера можно создать файл /etc/sysctl.d/sysname.conf со следующим содержимым:

kernel.hostname = <имя компьютера>
kernel.domainname = <имя домена> # опционально

Уборка

Если всё получилось, можно:

  • вернуть на место каталог /etc/net:
# mv -f /etc/net.old /etc/net
  • удалить ненужные более openresolv и etcnet:
Внимание: вместе с openresolv'ом приведённая команда тянет за собой NetworkManager и другие зависимости — чистит как пылесос!
# apt-get remove etcnet openresolv
  • перезагрузиться.

Заключение

Преимущества такого подхода к настройке сети:

  • работает в любом современном дистрибутиве linux в отличие от дистроспецифичных netplan, upstart, etcnet и пр.;
  • Wi-Fi подключается ещё при загрузке подобно проводному соединению, а не после входа юзера в иксы, как с NetworkManager;
  • ключи от точек доступа из системы не выудить, поскольку в конфиге — только их хэши.

Данная заметка — лишь первый шаг в освоении systemd-networkd и малая часть того, чем я пользуюсь и что он вообще умеет:

  • поднимать связки интерфейсов (bonds),
  • делить тегированные вланы,
  • строить мосты всех со всеми,
  • выступать не только клиентом DHCP, но и его сервером (пусть и с минимумом настроек),
  • прибивать отдельные статические маршруты через винегрет интерфейсов и даже заполнять для них пространные таблицы маршрутизации…

…и многое другое.

Проводной интерфейс с DHCP

Примечание: Настройки для Ethernet-интерфейсов могут также изменяться в ЦУС (модуль Ethernet-интерфейсы. В этом случае будут созданы файлы конфигурации /etc/systemd/network/alterator-<Имя_интерфейса>.network, например, /etc/systemd/network/alterator-enp0s3.network.


Пример файла /etc/systemd/network/20-enp0s3.network:

[Match]
Name = enp0s3

[Network]
DHCP = ipv4
LinkLocalAddressing = no
IPv6AcceptRA = false

[DHCPv4]
UseDomains = true
UseDNS = yes

Проводной интерфейс со статическим IP-адресом

Файл /etc/systemd/network/20-enp0s3.network:

[Match]
Name = enp0s3

[Network]
IPv6AcceptRA = false
Address = 192.168.0.196/24
Gateway = 192.168.0.1
Domains = test.alt
DNS = 8.8.8.8

[DHCPv4]

Сетевой мост с DHCP

Для создания моста на интерфейсе enp0s8 необходимо выполнить следующие действия:

  1. Создать виртуальный интерфейс моста. Для этого создать файл, например, /etc/systemd/network/20-bridge.netdev со следующим содержимым:
    [NetDev]
    Name=vmbr0
    Kind=bridge
    MACAddress=08:00:27:43:79:7b
    
    Можно не задавать MAC-адрес, в этом случае он будет сгенерирован на основе названия интерфейса и идентификатора машины.
  2. Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
    # systemctl restart systemd-networkd
    
  3. Проверка:
    $ ip a
    3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 08:00:27:43:79:7a brd ff:ff:ff:ff:ff:ff
    4: vmbr0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 08:00:27:43:79:7b brd ff:ff:ff:ff:ff:ff
    
    Интерфейс vmbr0 обнаружен, но выключен (DOWN).
  4. Привязать реальный сетевой интерфейса Ethernet (в примере — enp0s8) к виртуальному мосту. Для этого создать файл, например, /etc/systemd/network/20-bridge.network со следующим содержимым:
    [Match]
    Name=enp0s8
    
    [Network]
    Bridge=vmbr0
    
    Реальному сетевому интерфейсу не должно быть назначено никакого IP-адреса.
  5. Указать сетевые настройки виртуального моста. Для этого создать файл, например, /etc/systemd/network/20-bridge-dhcp.network со следующим содержимым:
    [Match]
    Name=vmbr0
    
    [Network]
    DHCP=ipv4
    
  6. Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
    # systemctl restart systemd-networkd
    
  7. Проверка:
    $ ip a
    3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master vmbr0 state UP group default qlen 1000
        link/ether 08:00:27:43:79:7a brd ff:ff:ff:ff:ff:ff
    4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 08:00:27:43:79:7b brd ff:ff:ff:ff:ff:ff
        inet 192.168.0.189/24 metric 1024 brd 192.168.0.255 scope global dynamic vmbr0
           valid_lft 258385sec preferred_lft 258385sec
        inet6 fd47:d11e:43c1:0:a00:27ff:fe43:797b/64 scope global mngtmpaddr noprefixroute 
           valid_lft forever preferred_lft forever
        inet6 fe80::a00:27ff:fe43:797b/64 scope link 
           valid_lft forever preferred_lft forever
    


Объединение сетевых интерфейсов (bonding)

Создание объединения (bond) на интерфейсах enp0s8 и enp0s9 с режимом работы active-backup:

  1. Создать объединённый интерфейс. Для этого создать файл, например, /etc/systemd/network/bond.netdev со следующим содержимым:
    [NetDev]
    Name=bond0
    Kind=bond
    
    [Bond]
    Mode=active-backup
    PrimaryReselectPolicy=always
    MIIMonitorSec=10s
    
  2. В качестве основного указать интерфейс enp0s8 (файл /etc/systemd/network/enp0s8-bond0.network):
    [Match]
    Name=enp0s8
    
    [Network]
    Bond=bond0
    PrimarySlave=true
    
  3. В качестве запасного указать интерфейс enp0s9 (файл /etc/systemd/network/enp0s9-bond0.network):
    [Match]
    Name=enp0s9
    
    [Network]
    Bond=bond0
    
  4. Указать сетевые настройки для виртуального интерфейса (файл /etc/systemd/network/bond0.network):
    [Match]
    Name=bond0
    
    [Network]
    DHCP=ipv4
    
  5. Перезапустить systemd-networkd или перечитать настройки networkctl, чтобы настройки вступили в силу:
    # networkctl reload
    
  6. Проверка
    # networkctl 
    IDX LINK   TYPE     OPERATIONAL SETUP     
      1 lo     loopback carrier     unmanaged
      2 enp0s3 ether    routable    configured
      3 enp0s8 ether    enslaved    configured
      4 enp0s9 ether    enslaved    configured
      6 bond0  bond     routable    configured
    
    5 links listed.
    
    Если отключить кабель от интерфейса enp0s8 соединение сохранится:
    # networkctl 
    IDX LINK   TYPE     OPERATIONAL      SETUP     
      1 lo     loopback carrier          unmanaged
      2 enp0s3 ether    routable         configured
      3 enp0s8 ether    no-carrier       configured
      4 enp0s9 ether    enslaved         configured
      6 bond0  bond     degraded-carrier configured
    

VLAN

В данном примере создадим два VLAN-интерфейса с идентификаторами 100 и 200 на интерфейсе enp0s3.

  1. Создать VLAN-интерфейсы. Для этого создать два файла. Первый файл /etc/systemd/network/20-enp0s3.netdev со следующим содержимым:
    [NetDev]
    Name=enp0s3.100
    Kind=vlan
    
    [VLAN]
    Id=100
    
    Второй файл /etc/systemd/network/21-enp0s3.netdev со следующим содержимым:
    [NetDev]
    Name=enp0s3.200
    Kind=vlan
    
    [VLAN]
    Id=200
    
  2. Привязать сетевой интерфейса Ethernet к VLAN. Для в файл настройки сетевого интерфейса enp0s3, например /etc/systemd/network/alterator-enp0s3.network добавить имена VLAN-интерфейсов:
    [Match]
    Name = enp0s3
    [Network]
    DHCP = ipv4
    LinkLocalAddressing = no
    IPv6AcceptRA = false
    VLAN=enp0s3.100
    VLAN=enp0s3.200
    [DHCPv4]
    UseDomains = true
    UseDNS = yes
    
  3. Указать сетевые настройки для каждой VLAN. Для интерфейса enp0s3.100 со статическим IP-адресом создать файл /etc/systemd/network/enp0s3.100.network со следующим содержимым:
    [Match]
    Name=enp0s3.100
    
    [Network]
    DHCP=no
    
    [Address]
    Address=192.168.30.25/25
    
    Содержимое второго файла /etc/systemd/network/enp0s3.200.network для интерфейса enp0s3.200:
    [Match]
    Name=enp0s3.200
    
    [Network]
    DHCP=no
    
    [Address]
    Address=192.168.30.145/25
    
  4. Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
    # systemctl restart systemd-networkd
    
  5. Проверка:
    $ ip -br a
    lo               UNKNOWN        127.0.0.1/8 ::1/128 
    enp0s3           UP             192.168.0.196/24 fe80::a00:27ff:fe85:1f31/64 
    enp0s3.100@enp0s3 UP             192.168.30.25/25 fe80::a00:27ff:fe43:79aa/64 
    enp0s3.200@enp0s3 UP             192.168.30.145/25 fe80::a00:27ff:fe85:1f31/64
    
    или
    $ networkctl list 
    IDX LINK       TYPE     OPERATIONAL SETUP      
      1 lo         loopback carrier     unmanaged
      2 enp0s3     ether    routable    configured 
      3 enp0s3.100 vlan     routable    configured 
      4 enp0s3.200 vlan     routable    configured 
    
    4 links listed.
    

Ссылки

Настройка сети для контейнера nspawn Запуск WireGuard (в т.ч. посредством systemd-networkd)

Благодарности

Статью вчерне накропал @NeuroFreak по следам моей ему помощи в настройке домашней сети на лаптопе. Мне оставалось её вычитать, отрихтовать, дополнить и структурировать.

Обратная связь