Systemd-networkd
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 — описывают виртуальные интерфейсы, мосты.
Файл .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
Подготовка
- Установка пакета systemd-timesyncd, который пригодится сразу после переезда, автоматически тянет за собой собственно
systemd-networkd
:# apt-get install -y systemd-timesyncd
- Дабы оставить возможность отката, вместо сноса
etcnet
пока достаточно просто переименовать его каталог:# mv -f /etc/net /etc/net.old
- Создать в каталоге /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-networkd
Для проверки работоспособности нового сервиса следует перезагрузиться с воткнутым сетевым кабелем (поскольку 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
##########################
|
Чтоб подключаться к точке доступа по паролю, нужно:
- Добавить её, не светя пароль в настройках:
# wpa_passphrase "BSSID" "пароль" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
- Перезапустить авторизацию на интерфейсе:
# 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
:
# apt-get remove etcnet openresolv
- перезагрузиться.
Заключение
Преимущества такого подхода к настройке сети:
- работает в любом современном дистрибутиве linux в отличие от дистроспецифичных
netplan
,upstart
,etcnet
и пр.; - Wi-Fi подключается ещё при загрузке подобно проводному соединению, а не после входа юзера в иксы, как с
NetworkManager
; - ключи от точек доступа из системы не выудить, поскольку в конфиге — только их хэши.
Данная заметка — лишь первый шаг в освоении systemd-networkd
и малая часть того, чем я пользуюсь и что он вообще умеет:
- поднимать связки интерфейсов (bonds),
- делить тегированные вланы,
- строить мосты всех со всеми,
- выступать не только клиентом DHCP, но и его сервером (пусть и с минимумом настроек),
- прибивать отдельные статические маршруты через винегрет интерфейсов и даже заполнять для них пространные таблицы маршрутизации…
…и многое другое.
Проводной интерфейс с DHCP
Пример файла /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 необходимо выполнить следующие действия:
- Создать виртуальный интерфейс моста. Для этого создать файл, например, /etc/systemd/network/20-bridge.netdev со следующим содержимым:
[NetDev] Name=vmbr0 Kind=bridge MACAddress=08:00:27:43:79:7b
- Можно не задавать MAC-адрес, в этом случае он будет сгенерирован на основе названия интерфейса и идентификатора машины.
- Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
# systemctl restart systemd-networkd
- Проверка:
$ 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).
- Привязать реальный сетевой интерфейса Ethernet (в примере — enp0s8) к виртуальному мосту. Для этого создать файл, например, /etc/systemd/network/20-bridge.network со следующим содержимым:
[Match] Name=enp0s8 [Network] Bridge=vmbr0
- Реальному сетевому интерфейсу не должно быть назначено никакого IP-адреса.
- Указать сетевые настройки виртуального моста. Для этого создать файл, например, /etc/systemd/network/20-bridge-dhcp.network со следующим содержимым:
[Match] Name=vmbr0 [Network] DHCP=ipv4
- Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
# systemctl restart systemd-networkd
- Проверка:
$ 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:
- Создать объединённый интерфейс. Для этого создать файл, например, /etc/systemd/network/bond.netdev со следующим содержимым:
[NetDev] Name=bond0 Kind=bond [Bond] Mode=active-backup PrimaryReselectPolicy=always MIIMonitorSec=10s
- В качестве основного указать интерфейс enp0s8 (файл /etc/systemd/network/enp0s8-bond0.network):
[Match] Name=enp0s8 [Network] Bond=bond0 PrimarySlave=true
- В качестве запасного указать интерфейс enp0s9 (файл /etc/systemd/network/enp0s9-bond0.network):
[Match] Name=enp0s9 [Network] Bond=bond0
- Указать сетевые настройки для виртуального интерфейса (файл /etc/systemd/network/bond0.network):
[Match] Name=bond0 [Network] DHCP=ipv4
- Перезапустить systemd-networkd или перечитать настройки networkctl, чтобы настройки вступили в силу:
# networkctl reload
- Проверка
# 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.
- Создать 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
- Привязать сетевой интерфейса 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
- Указать сетевые настройки для каждой 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
- Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
# systemctl restart systemd-networkd
- Проверка:
$ 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 по следам моей ему помощи в настройке домашней сети на лаптопе. Мне оставалось её вычитать, отрихтовать, дополнить и структурировать.