Подробный гайд: Конфигурация systemd-networkd и systemd-resolved в Linux

Полный гайд по настройке systemd-networkd и systemd-resolved. Конфигурация сети, DNS, DHCP, маршруты, безопасность в Linux

2026.05.14                  


Подробный гайд: Конфигурация systemd-networkd и systemd-resolved в LinuxПодробный гайд: Конфигурация systemd-networkd и systemd-resolved в Linux Данный гайд описывает декларативную настройку сети и DNS в современных Linux-системах с использованием компонентов systemd. Все примеры и директивы актуальны для systemd >= 252 (стабильная ветка до 2026 года).


1. systemd-networkd

Назначение

Управление сетевыми интерфейсами: назначение адресов, маршрутов, DHCP, создание мостов, VLAN, bonds, туннелей, настройка IPv6 RA, forward и т.д.

Расположение и приоритет файлов

Путь Назначение Приоритет
/etc/systemd/network/ Пользовательские конфиги Высший
/run/systemd/network/ Временные (генерируемые) Средний
/usr/lib/systemd/network/ Пакетные (по умолчанию) Низший

Расширения:

  • .network – привязка к интерфейсу и настройка стека IP
  • .netdev – создание виртуальных устройств (bridge, vlan, bond, macvlan, wireguard)
  • .link – переименование, MTU, MAC, offload-параметры на уровне udev

Правило именования:

  • Цифры-имя.расширение (например, 10-eth0.network, 20-dhcp.network). Файлы обрабатываются в лексикографическом порядке, первый совпавший [Match] побеждает.

Структура .network файла

Формат: INI. Основные секции:

[Match] – выбор интерфейса

Директива Пример Описание
Name= eth0, enp* Имя интерфейса (поддерживает glob)
Type= ether, vlan Тип интерфейса
Driver= e1000e, virtio_net Драйвер ядра
Path= pci-0000:00:1f.6 Физический путь
MACAddress= aa:bb:cc:dd:ee:ff MAC-адрес
Host= myhost Применяется только на указанном хосте

[Network] – общая конфигурация

Директива Значения Описание
DHCP= no, yes, ipv4, ipv6 Режим DHCP
IPv6AcceptRA= no, yes, always Обработка Router Advertisements
LinkLocalAddressing= no, yes, ipv4, ipv6, fallback IPv4LL/IPv6LL
Address= 192.168.1.10/24 Статический адрес
Gateway= 192.168.1.1 Шлюз по умолчанию
DNS= 8.8.8.8, fd00::1 DNS для resolved
Domains= example.com, ~corp.local Поиск + маршрутизация DNS
IPv4Forwarding= / IPv6Forwarding= yes/no Включение forward
ConfigureWithoutCarrier= yes/no Поднимать интерфейс без линка

[DHCPv4] / [DHCPv6]

Директива Описание
UseDNS=, UseDomains=, UseHostname= Получать ли DNS/домены/имя хоста от сервера
UseMTU=, UseNTP=, UseSIP=, UseTimezone= Прочие опции DHCP
RouteMetric= Метрика маршрутов от DHCP
ClientIdentifier= mac, duid, vendor, string
VendorClassIdentifier= Строка для идентификации клиента
Anonymize= yes/no – скрыть MAC в запросах

[Address] (для сложных адресов)

[Address]
Address=192.168.1.10/24
Label=eth0:static
PreferredLifetime=3600
ValidLifetime=7200

[Route] (статические маршруты)

[Route]
Destination=10.0.0.0/8
Gateway=192.168.1.1
Metric=100
Scope=link
OnLink=yes
Table=100
Type=unicast

Примеры конфигураций

1. Статический IP + маршруты

/etc/systemd/network/20-static.network

[Match]
Name=eth0

[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
DNS=8.8.8.8 1.1.1.1
Domains=example.com
IPv4Forwarding=no
LinkLocalAddressing=no

[Route]
Destination=10.0.0.0/8
Gateway=192.168.1.254
Metric=200

2. DHCP с переопределением DNS

/etc/systemd/network/20-dhcp.network

[Match]
Name=eth*

[Network]
DHCP=yes

[DHCPv4]
UseDNS=no
UseDomains=no
UseHostname=yes
ClientIdentifier=mac

[Route]
Destination=192.168.1.0/24
Gateway=_dhcp4

3. Мост + физический порт

/etc/systemd/network/10-br0.netdev

[NetDev]
Name=br0
Kind=bridge

/etc/systemd/network/10-br0.network

[Match]
Name=br0

[Network]
DHCP=yes

/etc/systemd/network/20-eth0.network

[Match]
Name=eth0

[Network]
Bridge=br0

4. VLAN 802.1Q

/etc/systemd/network/10-vlan100.netdev

[NetDev]
Name=vlan100
Kind=vlan

[VLAN]
Id=100

/etc/systemd/network/10-vlan100.network

[Match]
Name=vlan100

[Network]
Address=10.100.0.10/24
DHCP=no

Управление networkd

systemctl enable --now systemd-networkd
systemctl restart systemd-networkd
networkctl reload               # Перечитать конфиги без разрыва соединений
networkctl status               # Список интерфейсов
networkctl status eth0          # Детали по интерфейсу
journalctl -u systemd-networkd -f

2. systemd-resolved

Назначение

Кэширующий DNS-резолвер, поддержка DNSSEC, DNS-over-TLS, mDNS, LLMNR, stub-слушатель на 127.0.0.53:53, разделение DNS по доменам (split-DNS).

Расположение конфигурации

  • Основной: /etc/systemd/resolved.conf
  • Переопределения: /etc/systemd/resolved.conf.d/*.conf (рекомендуется)

Секция [Resolve]

Директива Значения Описание
DNS= 8.8.8.8, fd00::1, 1.1.1.1#cloudflare-dns.com Глобальные DNS-серверы
FallbackDNS= 9.9.9.9, 1.0.0.1 Запасные, если основные недоступны
Domains= example.com, ~corp.local, . Поисковые домены + маршрутизация
DNSSEC= yes, no, allow-downgrade Проверка DNSSEC
DNSOverTLS= yes, opportunistic, no Шифрование DNS-трафика
Cache= yes, no, negative, default Поведение кэша
ReadEtcResolvConf= yes/no Читать /etc/resolv.conf (устаревший режим)
ResolveUnicastSingleLabel= yes/no Разрешать однокомпонентные имена через unicast
LLMNR= yes, no, resolve Multicast DNS для локальной сети
MulticastDNS= yes, no, resolve mDNS (.local)
StubListener= yes, no Включить слушатель на 127.0.0.53

Режимы работы

Режим Как настроить Поведение
Stub (по умолчанию) /etc/resolv.conf -> симлинк на /run/systemd/resolve/stub-resolv.conf Все запросы идут в 127.0.0.53, resolved управляет кэшем, DNSSEC, DoT
System ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf resolved не кеширует, только пересылает запросы на указанные в конфигах DNS
Off systemctl disable --now systemd-resolved Сеть управляется другими демонами (NetworkManager, dhcpcd и т.д.)

Рекомендация: всегда использовать Stub mode.

Примеры конфигурации

Глобальные DNS + DNSSEC + DoT

/etc/systemd/resolved.conf.d/99-custom.conf

[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=9.9.9.9 84.200.69.80
Domains=example.com ~corp.local
DNSSEC=yes
DNSOverTLS=opportunistic
Cache=yes
LLMNR=no
MulticastDNS=no

Split-DNS (разные DNS для разных доменов)

Конфигурируется через Domains= или на уровне интерфейса в .network:

[Network]
DNS=10.0.0.53 10.0.0.54
Domains=~corp.local
  • ~corp.local -> запросы к corp.local и всем поддоменам идут только на 10.0.0.53/54
  • example.com (без ~) -> добавляется в search-лист, но не маршрутизируется строго

Управление resolved

systemctl enable --now systemd-resolved
systemctl restart systemd-resolved

resolvectl status                 # Полная картина DNS, доменов, маршрутов
resolvectl dns eth0               # DNS для конкретного интерфейса
resolvectl query example.com      # Тест разрешения
resolvectl statistics             # Статистика кэша и запросов
journalctl -u systemd-resolved -f

3. Взаимодействие networkd и resolved

  1. systemd-networkd передаёт DNS, домены, NTP в systemd-resolved через D-Bus.
2. Приоритет DNS:
  • Специфичные для интерфейса (DNS= в .network) -> глобальные (DNS= в resolved.conf) -> Fallback
    1. Маршрутизация DNS (Domains=~...) позволяет избежать утечки запросов во внешние DNS.
    2. Изменение Domains= на лету:
   resolvectl domain eth0 ~corp.local example.com

4. Диагностика и отладка

Задача Команда
Проверить, какой DNS использует система resolvectl status
Посмотреть применённые конфиги systemd-analyze cat-config systemd/network/
systemd-analyze cat-config systemd/resolved.conf
Проверить синтаксис .network networkctl reload + journalctl -u systemd-networkd --since "1 min ago"
Тест разрешения с указанием DNS resolvectl query --interface=eth0 example.com
Проверить DNSSEC resolvectl query --dnssec example.com
Увидеть кэш resolvectl flush-caches
resolvectl statistics
Отладка DHCP networkctl status eth0 -a
Логи networkd journalctl -u systemd-networkd -f
Логи resolved journalctl -u systemd-resolved -f

5. Безопасность и лучшие практики

  1. Не редактируйте /etc/resolv.conf вручную. Всегда используйте симлинк:
   ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
  1. Включайте DNSSEC и DNS-over-TLS, где это поддерживается провайдером.
  2. Используйте *.conf.d/ вместо правки основных файлов. Это упрощает обновления и откаты.
  3. Избегайте UseDNS=yes при строгих политиках безопасности. Переопределяйте DNS= явно.
  4. Ограничьте LLMNR/mDNS, если не используете их: LLMNR=no, MulticastDNS=no.
  5. Проверяйте forward-состояние: IPv4Forwarding=yes только на шлюзах/роутерах.
  6. Бэкапите конфиги перед перезапуском: networkctl reload безопасен, systemctl restart рвёт соединения.

6. Полезные ссылки

  • man systemd.network – полное описание .network, .netdev, .link
  • man systemd-resolved – архитектура resolved
  • man resolved.conf – все директивы конфигурации
  • man networkctl, man resolvectl – CLI утилиты