Systemd-networkd — Управление сетью

Установка, настройка, эксплуатация.
Ответить
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Systemd-networkd — Управление сетью

Сообщение root »

Оглавление
Темы
Преимущества и недостатки systemd-networkd
Настройка IPv4 и IPv6 в systemd-networkd
Основные команды для управления systemd-networkd
Демонстрационные примеры
MAC-адреса для мостов в systemd-networkd
Пример для TunnelBroker Hurricane Electric 6in4
Заключение
Дополнительные материалы
Network-Scripts — Управление сетью
NetworkManager — Управление сетью
systemd-networkd — это сетевой менеджер, являющийся частью systemd, предназначенный для управления сетевыми интерфейсами в Linux. Он поддерживает различные типы сетевых конфигураций, включая проводные и беспроводные сети, VPN, VLAN, мосты и т.д. Этот инструмент особенно полезен для серверов и минималистичных систем, где не требуется графический интерфейс.
Преимущества
  1. Интеграция с systemd:Поскольку systemd-networkd является частью systemd, он тесно интегрирован с остальными компонентами системы, что обеспечивает быструю и эффективную работу.
  2. Легковесность: systemd-networkd потребляет минимальные ресурсы, что делает его идеальным выбором для серверов и встроенных систем.
  3. Автоматизация: Он автоматически обнаруживает и настраивает сетевые интерфейсы при их подключении.
  4. Гибкость: Поддержка множества сетевых функций, таких как VLAN, мосты, туннели, статические и динамические IP-адреса, маршрутизация и другие.
  5. Управление через конфигурационные файлы: systemd-networkd использует простой и понятный формат конфигурационных файлов, что упрощает его настройку и управление.
Недостатки
  1. Отсутствие GUI: В отличие от NetworkManager, systemd-networkd не имеет графического интерфейса для управления сетью, что может затруднить его использование для пользователей, предпочитающих работать в графической среде.
  2. Меньшая популярность: В Fedora и других дистрибутивах по умолчанию используется NetworkManager, поэтому для некоторых пользователей переход на systemd-networkd может потребовать изучения новых инструментов и подходов.
  3. Меньшая поддержка для сложных сетевых конфигураций в десктопных средах: Для продвинутых конфигураций и взаимодействия с Wi-Fi systemd-networkd может быть менее удобным по сравнению с NetworkManager.
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

Для настройки сетевых интерфейсов через systemd-networkd, конфигурационные файлы создаются в директории /etc/systemd/network/. Название файла может быть любым, но важно, чтобы он имел расширение .network. Например, файл 20-wired.network.
Пример для IPv4
  1. Создайте конфигурационный файл:

    Код: Выделить всё

    nano /etc/systemd/network/20-wired.network
  2. Добавьте следующую конфигурацию для статического IP:

    Код: Выделить всё

    [Match]
    Name=enp1s0
    
    [Network]
    Address=192.168.1.100/24
    Gateway=192.168.1.1
    DNS=8.8.8.8
  3. Для получения IP-адреса через DHCP:

    Код: Выделить всё

    [Match]
    Name=enp1s0
    
    [Network]
    DHCP=yes
  4. Перезапустите systemd-networkd для применения изменений:

    Код: Выделить всё

    systemctl restart systemd-networkd
  5. Иногда возникает необходимость убрать с конкретного интерфейса LinkLocal адрес. для этого воспользуемся параметром LinkLocalAddressing, а параметр IPv6AcceptRA указываем для игнорирования пакетов (RA) автоматической конфигурации адреса IPv6 на интерфейсе.

    Код: Выделить всё

    [Network]
    LinkLocalAddressing=no
    IPv6AcceptRA=no
Пример настройки IPv6
  1. Для статической настройки IPv6:

    Код: Выделить всё

    [Match]
    Name=enp1s0
    
    [Network]
    Address=2000:2cc0:13b1:3333::4/64
    Gateway=2000:2cc0:13b1:3333::1
    DNS=2000:2cc0:13b1:3333::1
  2. Для получения IP-адреса через SLAAC:

    Код: Выделить всё

    [Match]
    Name=enp1s0
    
    [Network]
    IPv6AcceptRA=yes
  3. Для использования DHCPv6:

    Код: Выделить всё

    [Match]
    Name=enp1s0
    
    [Network]
    DHCP=yes
  4. Перезапустите systemd-networkd:

    Код: Выделить всё

    systemctl restart systemd-networkd
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

  1. Запуск systemd-networkd:

    Код: Выделить всё

    systemctl start systemd-networkd
  2. Автозапуск при загрузке:

    Код: Выделить всё

    systemctl enable systemd-networkd
  3. Просмотр статуса сетевых интерфейсов:

    Код: Выделить всё

    networkctl status
  4. Просмотр состояния конкретного интерфейса:

    Код: Выделить всё

    networkctl status enp1s0
Переключение сетевого менеджера

Код: Выделить всё

systemctl disable --now NetworkManager && systemctl enable --now systemd-networkd
После запуска системная служба systemd-resolved создаст свой собственный файл resolv.conf в одной из поддиректорий директории /run/systemd. Однако, обычной практикой является сохранение этого файла по пути /etc/resolv.conf, причем многие сетевые приложения все еще используют именно файл /etc/resolv.conf. Исходя из этого, вам придется создать символьную ссылку с именем /etc/resolv.conf следующим образом:

Код: Выделить всё

rm /etc/resolv.conf && ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

Пример для демонстрации большинства необходимых опций конфигурирования.

Код: Выделить всё

[Match]
Name=eth0

[Network]
#DHCP=yes
#DHCP=ipv6
Address=192.168.114.10/24
Address=2000:2cc0:13b1:3333::4/64
DNS=192.168.114.3
DNS=2000:2cc0:13b1:3333::1
DNSSEC=false
DNSSECNegativeTrustAnchors=tr-home.de
Domains=tr-home.de ~.
# overrides setting via sysctl
IPv6PrivacyExtensions=kernel
ManageTemporaryAddress=true
IPv6AcceptRA=true
LinkLocalAddressing=ipv6
IPv6LinkLocalAddressGenerationMode=eui64

[IPv6AcceptRA]
UseDNS=false
Token=eui64

[DHCPv6]
UseDNS=false

[Route]
Gateway=192.168.114.1
GatewayOnlink=yes

[Route]
Gateway=2000:2cc0:13b1:3333::1
В конфигурационном файле для systemd-networkd используются различные параметры для настройки сетевого интерфейса и его поведения. Давайте рассмотрим назначение опций:
  • [Match]
  • Name=eth0: Этот параметр указывает, что настройки из этого файла будут применяться только к сетевому интерфейсу с именем eth0. Если интерфейс имеет другое имя, настройки не будут применяться.

    [Network]
  • DNSSEC=false: Отключает проверку подписей DNSSEC при разрешении доменных имен. DNSSEC обеспечивает защиту от подделки данных DNS, но если эта опция отключена, система не будет проверять подлинность записей DNS.
  • DNSSECNegativeTrustAnchors=tr-home.de: Исключает домен tr-home.de из проверки DNSSEC, даже если DNSSEC включен. Это полезно, если домен не поддерживает DNSSEC, но вы все равно хотите использовать его без предупреждений о некорректных DNS-записях.
  • Domains=tr-home.de ~.: Определяет домены поиска для интерфейса. В этом случае, при запросе неполного имени хоста (например, host1), система сначала попробует найти его в домене tr-home.de, а затем в корневом домене (.). Символ ~. указывает, что этот домен должен использоваться как резервный, если имя не удалось разрешить в других доменах.
  • IPv6PrivacyExtensions=kernel: Управляет использованием временных IPv6-адресов, которые используются для повышения конфиденциальности. Значение kernel указывает, что конфигурация должна использовать параметры, заданные в ядре системы. Временные адреса помогают предотвратить отслеживание устройства на основе его MAC-адреса.
  • ManageTemporaryAddress=true: Если установлено в true, systemd-networkd будет управлять временными IPv6-адресами, которые создаются для повышения конфиденциальности. Эти адреса часто используются для исходящих подключений, чтобы скрыть основной IPv6-адрес устройства.
  • IPv6AcceptRA=true: Включает получение и обработку объявлений маршрутизаторов (RA) для настройки IPv6 через Stateless Address Autoconfiguration (SLAAC). Это позволяет устройству автоматически получать адреса и другую информацию от маршрутизаторов в сети.
  • LinkLocalAddressing=ipv6: Указывает, что на интерфейсе будут использоваться только локальные IPv6-адреса. Локальные адреса используются для связи между устройствами в одной сети (например, fe80::/64). Вариантами также могут быть ipv4, both, или no (отключает локальные адреса).
    IPv6LinkLocalAddressGenerationMode=eui64: Указывает, как генерировать локальный IPv6-адрес. Значение eui64 означает, что адрес будет сгенерирован на основе MAC-адреса интерфейса, что делает его стабильным и предсказуемым.

    [IPv6AcceptRA]
  • UseDNS=false: Отключает автоматическую настройку DNS-серверов, полученных через объявления маршрутизаторов (RA). Это может быть полезно, если вы хотите использовать свои DNS-серверы, а не те, которые предоставляются маршрутизатором.
  • Token=eui64: Использует механизм EUI-64 для генерации идентификатора интерфейса в IPv6-адресах, полученных через SLAAC. Это обеспечивает стабильность адресов, сгенерированных на основе MAC-адреса интерфейса.

    [DHCPv6]
  • UseDNS=false: Отключает использование DNS-серверов, полученных через DHCPv6. Это позволяет использовать вручную настроенные DNS-серверы вместо тех, что предлагает DHCP-сервер.

    [Route]
  • GatewayOnlink=yes: Этот параметр указывает, что шлюз, указанный для маршрута, может находиться в любой сети, не обязательно в сети, к которой подключен данный интерфейс. Это полезно, если шлюз находится за пределами прямого сетевого сегмента, но вы знаете, что он доступен через определённый интерфейс.
    Обычное поведение при указании шлюза в маршрутах — это проверка, находится ли шлюз в одной и той же сети, что и интерфейс, на который назначен маршрут. Если эта проверка не проходит, маршрут не будет активирован. Параметр GatewayOnlink=yes игнорирует эту проверку, позволяя маршрутам с указанным шлюзом быть активированными, даже если он находится "вне" локальной сети.
    Это может быть полезно в сложных сетевых конфигурациях, например, когда вы настраиваете маршрут через VPN или через многосегментные сети, где шлюз не принадлежит напрямую сети интерфейса.
Эти параметры позволяют гибко настроить поведение сетевого интерфейса eth0, управляя тем, как он получает IPv6-адреса, обрабатывает DNS-запросы, использует временные адреса для повышения конфиденциальности и взаимодействует с объявлениями маршрутизаторов. Они обеспечивают более точный контроль над тем, как интерфейс взаимодействует с сетью, что особенно важно в сложных или чувствительных к безопасности средах.
Пример DUAL STACK
Пример конфигурационного файла с опциями максимально приближенными к реальным условиям использования

Код: Выделить всё

[Match]
Name=enp0s3

[Network]
DHCP=no
DNS=192.168.114.254
DNS=2000:2cc0:13b1:3333::1
ManageTemporaryAddress=false
IPv6AcceptRA=false
LinkLocalAddressing=ipv6
IPv6LinkLocalAddressGenerationMode=eui64
Domains=free-adm.ru ~.
DNSSECNegativeTrustAnchors=free-adm.ru

[IPv6AcceptRA]
UseDNS=false

[Address]
Label=LANv4
Address=192.168.114.19/24

[Address]
Label=LANv6
Address=2000:2cc0:13b1:3333::19/64

[Route]
Gateway=192.168.114.254

[Route]
Gateway=2000:2cc0:13b1:3333::1
Пример с VLANs
cd /etc/systemd/network/

Код: Выделить всё

├── 10-enp0s3.link
├── 10-enp0s3.network
├── 20-enp0s3.10.netdev
├── 20-enp0s3.10.network
├── 20-enp0s3.20.netdev
├── 20-enp0s3.20.network
├── 20-enp0s3.30.netdev
├── 20-enp0s3.30.network
├── 20-enp0s3.40.netdev
├── 20-enp0s3.40.network
├── 20-enp0s3.50.netdev
└── 20-enp0s3.50.network
cat 10-enp0s3.link

Код: Выделить всё

[Match]
MACAddress=08:00:27:f3:11:31

[Link]
Name=enp0s3
RequiredForOnline=no
RequiredForOnline — это параметр в systemd-networkd, который определяет, считается ли интерфейс обязательным для состояния сети «online».
Если RequiredForOnline=yes, то:
  • systemd-networkd-wait-online будет ожидать, пока этот интерфейс полностью поднимется (адрес, маршруты, link-up),
  • система не перейдёт в состояние network-online.target, пока интерфейс не будет готов.
Если RequiredForOnline=no, то:
  • интерфейс игнорируется для цели «network online»,
  • загрузка не задерживается, даже если интерфейс отсутствует, недоступен или не получил IP.
Проще говоря:
RequiredForOnline — указывает, должен ли интерфейс быть полностью рабочим, чтобы система считалась "в сети".
cat 10-enp0s3.network

Код: Выделить всё

[Match]
Name=enp0s3

[Network]
VLAN=enp0s3.10
VLAN=enp0s3.20
VLAN=enp0s3.30
VLAN=enp0s3.40
VLAN=enp0s3.50
LinkLocalAddressing=no
IPv6AcceptRA=no
отключаем для родительского интерфейса Link Local Address и приём пакетов RA (router advertisements)

cat 20-enp0s3.10.netdev

Код: Выделить всё

[NetDev]
Name=enp0s3.10
Kind=vlan
MACAddress=02:00:27:f3:11:0a

[VLAN]
Id=10
cat 20-enp0s3.10.network

Код: Выделить всё

[Match]
Name=enp0s3.10

[Network]
Address=192.168.1.1/24
DNS=192.168.1.1
Отсутствие параметра gateway не является недочётом конфигурации (в данном случае), так как используется OSPF.
cat 20-enp0s3.20.netdev

Код: Выделить всё

[NetDev]
Name=enp0s3.20
Kind=vlan
MACAddress=02:00:27:f3:11:14

[VLAN]
Id=20
cat 20-enp0s3.20.network

Код: Выделить всё

[Match]
Name=enp0s3.20

[Network]
Address=10.10.11.6/29
cat 20-enp0s3.30.netdev

Код: Выделить всё

[NetDev]
Name=enp0s3.30
Kind=vlan
MACAddress=02:00:27:f3:11:1e

[VLAN]
Id=30
cat 20-enp0s3.30.network

Код: Выделить всё

[Match]
Name=enp0s3.30

[Network]
Address=10.10.11.14/29
cat 20-enp0s3.40.netdev

Код: Выделить всё

[NetDev]
Name=enp0s3.40
Kind=vlan
MACAddress=02:00:27:f3:11:28

[VLAN]
Id=40
cat 20-enp0s3.40.network

Код: Выделить всё

[Match]
Name=enp0s3.40

[Network]
Address=10.10.11.22/29
cat 20-enp0s3.50.netdev

Код: Выделить всё

[NetDev]
Name=enp0s3.50
Kind=vlan
MACAddress=02:00:27:f3:11:32

[VLAN]
Id=50
cat 20-enp0s3.50.network

Код: Выделить всё

[Match]
Name=enp0s3.50

[Network]
Address=10.10.11.30/29
На VLAN'ы назначаются MAC адреса из диапазона LAA вида 02.XX:XX:XX:XX:ID. ID - идентификатор VLAN, который указан как HEX. В примере задействован последний байт для наглядности. Чтобы покрыть весь диапазон возможных значений нужно задействовать 2 последних байта адреса (от 00:00 до FF:FF) - это как раз покрывает полный диапазон от 1 до 4094 возможных значений VLAN ID.
VLAN является самостоятельным широковещательным доменом, однако наличие одинаковых MAC адресов может является проблемой:
  • VLAN изолирует широковещательные домены, но не "вселенные MAC-адресов". MAC-адрес — это идентификатор конкретного сетевого интерфейса в рамках общей среды передачи данных (Ethernet).
  • Проблема возникает при маршрутизации между VLAN (L3) или при использовании устройств, которые работают с несколькими VLAN одновременно (роутеры, L3-коммутаторы, межсетевые экраны, некоторые серверы с тегированными интерфейсами).
Совет: Не стоит считать, что VLAN разрешает дублирование MAC-адресов.
Для преобразования десятичных значений в шестнадцатеричный вид можно использовать простой однострочный скрипт. Примерно такой:

Код: Выделить всё

printf "%x\n" 20
14
Настройка параметров Ethernet
# /etc/systemd/networkd/internet.link

Код: Выделить всё

[Match]
MACAddress=a0:36:9f:6e:52:26

[Link]
BitsPerSecond=1G
Duplex=full
MTUBytes=1480
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

В Linux рекомендуется использовать следующие правила:
  • всё виртуальное — только с LAA;
  • всё физическое — с MAC производителя (OUI).
Это обеспечивает предсказуемость, отсутствие конфликтов и корректную работу сетевых протоколов (ARP, STP, ND, VLAN).
1. Рекомендуемый вариант — фиксированный LAA
Используем локально адм. адрес (LAA) для моста:

Код: Выделить всё

[NetDev]
Name=br0
Kind=bridge
MACAddress=02:xx:xx:xx:xx:ID
Пояснения:
  • Первый байт = 02 — признак LAA.
  • Последний байт = ID моста / VLAN (обеспечивает уникальность).
  • Предсказуемая работа ARP, STP, IPv6 ND.
  • Нет конфликтов при подключении/отключении физических интерфейсов.
Пример:

Код: Выделить всё

[NetDev]
Name=br0
Kind=bridge
MACAddress=02:00:27:09:74:00
Почему нельзя использовать MAC физического интерфейса
  1. Конфликты MAC.
    При переносе физического интерфейса в мост его MAC может остаться активным → коллизии.
  2. STP/RSTP может работать некорректно.
    Несколько портов могут «бороться» за один MAC.
  3. Некоторые коммутаторы/маршрутизаторы сохраняют MAC в таблицах и путаются при его переносе.
2. Вариант: унаследовать MAC от интерфейса
Допустимо, но не рекомендуется для сложной инфраструктуры.

Код: Выделить всё

[NetDev]
Name=br0
Kind=bridge
MACAddress=from-enp0s3
systemd возьмёт MAC первого добавленного в мост интерфейса. Подходит только если состав моста фиксирован и не меняется.
Пример полной конфигурации
10-bridge.netdev

Код: Выделить всё

[NetDev]
Name=br0
Kind=bridge
MACAddress=02:00:27:09:74:00
20-bridge.network

Код: Выделить всё

[Match]
Name=br0

[Network]
Bridge=br0
LinkLocalAddressing=ipv6

[Address]
Label=LANv4
Address=195.0.1.21/24

[Address]
Address=2001:470:1f21:16b::21/64

[Route]
Destination=0.0.0.0/0
Gateway=195.0.1.254
#GatewayOnLink=yes
30-ethernet.network

Код: Выделить всё

[Match]
Name=enp0s3

[Network]
Bridge=br0

[Link]
# Сохраняем оригинальный MAC физического интерфейса
MACAddress=08:00:27:09:74:10
Проверка

Код: Выделить всё

ip link show enp0s3
ip link show br0
Ожидаемый результат:
  • enp0s3 — MAC производителя (08:00:27:...)
  • br0 — LAA (02:00:27:...)
Они обязаны быть разными.
Важно
После включения физического интерфейса в мост:
  • IP-адреса назначаются только на br0
  • enp0s3 становится чистым портом моста
  • весь IPv4/IPv6-трафик проходит через br0
    это нормальное поведение Linux bridge
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

eth1.network

Код: Выделить всё

# Это может быть любой общедоступный интерфейс, в основном тот, который подключен к Интернету (собственный или мостовой).
[Match]
Name=eth1

[Network]
#ваш обычный адрес интерфейса: 10.1.1.2/24
Address=<LOCAL_IPV4>/<NETMASK> 
Gateway=<LOCAL_IPV4_GW> # local ip gw e.g 10.1.1.1

#  ниже приведен адрес туннеля
Tunnel=he6
# Первый из ipv6-адресов маршрутизатора туннеля. ( 2001:470:xxx::1/64 or /48)
Address=<ROUTED_IPV6_ADDRESS> 
he.netdev

Код: Выделить всё

#  Определение и создание туннельного интерфейса
[Match]

[NetDev]
Name=he6
Kind=sit
MTUBytes=1480

[Tunnel]
Remote=<SERVER_IPV4_ADDRESS>
Local=<LOCAL_IPV4>
TTL=255
he.network

Код: Выделить всё

# Это конфигурация вашего туннельного интерфейса
[Match]
Name=he6

[Network]
Address=<CLIENT_IPV6_ADDRESS>
Gateway=<SERVER_IPV6_ADDRESS>

# опционально ip forward
IPForward=yes 

# Приведенные ниже маршруты на основе политики необходимы только в том случае,
# если вы уже настроили ipv6 и хотите убедиться, что входящая маршрутизация работает правильно
[Route]
Gateway=<SERVER_IPV6_ADDRESS>
Destination=::/0
Table=200
Metric=20

[RoutingPolicyRule]
Table=200
Family=ipv6
From=<CLIENT_IPV6_ADDRESS>

[RoutingPolicyRule]
Table=200
Family=ipv6
From=<ROUTED_IPV6_PREFIX> 
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

systemd-networkd — это мощный инструмент для управления сетью, особенно полезный на серверах и в минималистичных окружениях. Он обеспечивает легкость, гибкость и интеграцию с системой, однако требует знания и работы с конфигурационными файлами без графического интерфейса. Fedora, как и другие современные дистрибутивы, поддерживает использование systemd-networkd, что позволяет гибко управлять сетевыми интерфейсами как для IPv4, так и для IPv6.
Ответить