Подробный гайд: Конфигурация 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
systemd-networkd передаёт DNS, домены, NTP в systemd-resolved через D-Bus.
2. Приоритет DNS:
- Специфичные для интерфейса (
DNS= в .network) -> глобальные (DNS= в resolved.conf) -> Fallback
- Маршрутизация DNS (
Domains=~...) позволяет избежать утечки запросов во внешние DNS.
- Изменение
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. Безопасность и лучшие практики
- Не редактируйте
/etc/resolv.conf вручную. Всегда используйте симлинк:
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
- Включайте DNSSEC и DNS-over-TLS, где это поддерживается провайдером.
- Используйте
*.conf.d/ вместо правки основных файлов. Это упрощает обновления и откаты.
- Избегайте
UseDNS=yes при строгих политиках безопасности. Переопределяйте DNS= явно.
- Ограничьте LLMNR/mDNS, если не используете их:
LLMNR=no, MulticastDNS=no.
- Проверяйте forward-состояние:
IPv4Forwarding=yes только на шлюзах/роутерах.
- Бэкапите конфиги перед перезапуском:
networkctl reload безопасен, systemctl restart рвёт соединения.
6. Полезные ссылки
man systemd.network – полное описание .network, .netdev, .link
man systemd-resolved – архитектура resolved
man resolved.conf – все директивы конфигурации
man networkctl, man resolvectl – CLI утилиты