Systemd-networkd: различия между версиями

Материал из ALT Linux Wiki
 
(не показаны 83 промежуточные версии 2 участников)
Строка 1: Строка 1:
{{Stub}}
systemd-networkd — системная служба для управления сетевыми настройками. Его задачей является обнаружение и настройка сетевых устройств по мере их появления, а также создание виртуальных сетевых устройств.
=Управление сетью посредством systemd-networkd=
 
==Подготовка==
systemd/udev автоматически назначает постоянные имена для обнаруженных Ethernet, WLAN и WWAN-интерфейсов. Список интерфейсов можно увидеть, выполнив команду {{cmd|networkctl list}}.
#Установка пакета [[systemd-timesyncd]], который пригодится сразу после переезда, автоматически тянет за собой собственно systemd-networkd:
 
#:<source lang=bash> # apt-get install -y systemd-timesyncd</source>
После изменения файлов конфигурации, чтобы изменения вступили в силу необходимо перезапустить службу {{cmd|systemd-networkd.service}} или выполнить команду {{cmd|networkctl reload}}.
 
== Конфигурационные файлы ==
Конфигурационные файлы сетевых служб systemd хранятся в каталоге {{path|/etc/systemd/network}}.
 
Существует три типа конфигурационных файлов:
*.network — описывают параметры сети: IP, маршруты, DNS и другие;
*.link — описывают физические параметры каждого интерфейса: имя, MAC, MTU и т.д.;
*.netdev — описывают виртуальные интерфейсы, мосты.
 
{{Note|systemd понимает значения 1, true, yes, on как логическое true, а 0, false, no, off — как false.}}
=== Файл .network ===
 
Ниже приведены некоторые параметры основных разделов файла .network. Подробнее см. {{cmd|man systemd.network(5)}}.
 
==== Раздел [Match] ====
 
Раздел [Match] определяет, может ли данный сетевой файл быть применен к данному устройству.
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|MACAddress=
|Разделённый пробелами список MAC-адресов (в шестнадцатеричном формате); в качестве внутреннего разделителя в адресах можно использовать двоеточия, дефисы и точки
|08:00:27:4c:fc:4a 08-00-27-ae-ad:d5
|-
|Type=
|Разделённый пробелами список типов интерфейсов (как в выводе команды {{cmd|networkctl list}})
|ether wlan
|-
|Name=
|Разделённый пробелами список SSID подключенных беспроводных локальных сетей. Символ ! в начале инвертирует результаты поиска.
|
|-
|SSID=
|Разделённый пробелами список названий интерфейсов (можно указывать шаблоны с подстановочными символами в стиле командной оболочки). Символ ! в начале инвертирует результаты поиска.
|enp0s3
|-
|Host=
|Имя хоста или machine ID
|
|-
|Virtualization=
|Проверка на работу в виртуальном окружении, и, при необходимости, проверка, конкретной реализации виртуального окружения (Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или ВМ)
|qemu
|}
 
==== Раздел [Network] ====
Раздел [Network] определяет способ настройки устройства.
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|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] ====
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|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. Подробнее см. {{cmd|man systemd.netdev(5)}}.
 
==== Раздел [Match] ====
 
Раздел [Match] определяет, может ли данный сетевой файл быть применен к данному устройству.
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|Host=
|Имя хоста или machine ID
|
|-
|Virtualization=
|Проверка на работу в виртуальном окружении, и, при необходимости, проверка, конкретной реализации виртуального окружения (Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или ВМ)
|qemu
|}
 
==== Раздел [Netdev] ====
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|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».
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|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.
|
|}
 
Пример настройки сетевого объединения (файл {{path|/etc/systemd/network/25-bond.netdev}}:
<syntaxhighlight lang="ini">
[NetDev]
Name=bond1
Kind=bond
 
[Bond]
Mode=802.3ad
TransmitHashPolicy=layer3+4
MIIMonitorSec=1s
LACPTransmitRate=fast</syntaxhighlight>
 
==== Раздел [VLAN] ====
 
Раздел [VLAN] применяется только для сетевых устройств типа «vlan».
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|Id=
|Идентификатор VLAN. Целое число в диапазоне 0…4094. Параметр обязателен
|100
|-
|Protocol=
|Протокол, используемый для интерфейса VLAN. Возможные значения: «802.1q» или «802.1ad». По умолчанию не установлено и используется значение по умолчанию ядра.
|802.1q
|}
 
Пример настройки VLAN (файл {{path|/etc/systemd/network/30-vlan.netdev}}:
<syntaxhighlight lang="ini">
[Match]
Virtualization=no
 
[NetDev]
Name=vlan100
Kind=vlan
 
[VLAN]
Id=100</syntaxhighlight>
 
=== Файлы link ===
Файлы .link можно использовать для назначения интерфейсу нового имени вместо редактирования правил udev.
Файлы .link выступают в качестве альтернативы пользовательским правилам udev и применяются при обнаружении менеджером нового устройства. Файл состоит из двух разделов, [Match] и [Link]. Ниже приведены основные параметры обоих разделов. Подробнее см. {{cmd|man systemd.link(5)}}.
 
==== Раздел [Match] ====
 
Раздел [Match] определяет, может ли данный файл .link быть применен к данному устройству.
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|MACAddress=
|Разделённый пробелами список MAC-адресов (в шестнадцатеричном формате); в качестве внутреннего разделителя в адресах можно использовать двоеточия, дефисы и точки
|08:00:27:4c:fc:4a 08-00-27-ae-ad:d5
|-
|Type=
|Разделённый пробелами список типов интерфейсов (как в выводе команды {{cmd|networkctl list}})
|ether wlan
|-
|Host=
|Имя хоста или machine ID
|
|-
|Virtualization=
|Проверка на работу в виртуальном окружении, и, при необходимости, проверка, конкретной реализации виртуального окружения (Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или ВМ)
|qemu
|}
 
==== Раздел [Link] ====
 
{| class="wikitable"
! | Параметр
! Описание
! Пример
|-
|MACAddressPolicy=
|Политика, согласно которой должен быть установлен MAC-адрес. Доступные политики: «persistent», «random», «none».
|none
|-
|MACAddress=
|Использование конкретного адреса. Чтобы этот параметр вступил в силу, MACAddressPolicy= должен быть не установлен, пуст или иметь значение «none».
|
|-
|NamePolicy=
|Политики выбора и назначения имён интерфейсов, например, kernel, keep и т.д.
|
|}
 
== Примеры ==
=== Переключение с etcnet/NetworkManager на systemd-networkd ===
==== Подготовка ====
#Установка пакета {{pkg|systemd-timesyncd}}, который пригодится сразу после переезда, автоматически тянет за собой собственно <code>systemd-networkd</code>:
#:<syntaxhighlight lang="bash"># apt-get install -y systemd-timesyncd</syntaxhighlight>
#Дабы оставить возможность отката, вместо сноса <code>etcnet</code> пока достаточно просто переименовать его каталог:
#Дабы оставить возможность отката, вместо сноса <code>etcnet</code> пока достаточно просто переименовать его каталог:
#:<source lang=bash> # mv -f /etc/net /etc/net.old</source>
#:<syntaxhighlight lang="bash"> # mv -f /etc/net /etc/net.old</syntaxhighlight>
#Создать пару файлов автонастройки для проводных (<code>/etc/systemd/network/lan.network</code>) и беспроводных (<code>/etc/systemd/network/wifi.network</code>) интерфейсов по DHCP (предварительно удостоверившись в отсутствии настроенных на статические адреса туннелей, вланов, мостов и т.п.) со следующим содержимым:
#Создать в каталоге {{path|/etc/systemd/network/}} пару файлов автонастройки по DHCP для проводных (<code>lan.network</code>) и беспроводных (<code>wifi.network</code>) интерфейсов (предварительно удостоверившись в отсутствии настроенных на статические адреса туннелей, вланов, мостов и т.п.) со следующим содержимым:
#:<source lang=ini>
#:<syntaxhighlight lang=ini>
[Match]
[Match]
Name = e* # в  lan.network
Name = X* # вместо "Х" — "e" для lan.network и "w" для wifi.network
Name = w* # в wifi.network


[Network]
[Network]
DHCP = ipv4
DHCP = ipv4
</source>
</syntaxhighlight>
==Проводная сеть==
 
Пора переключиться с etcnet / NetworkManager на systemd-networkd:
==== Проводная сеть ====
# systemctl disable network NetworkManager && systemctl enable systemd-networkd systemd-timesyncd
Пора переключиться с <code>etcnet</code>/<code>NetworkManager</code> на <code>systemd-networkd</code>:
Для проверки работоспособности systemd-networkd следует перезагрузиться с воткнутым сетевым кабелем, поскольку Wi-Fi ещё не настроен. А сразу после перезагрузки имеет смысл проверить, получен ли адрес каким-либо из интерфейсов:
<syntaxhighlight lang="bash"># systemctl disable --now network NetworkManager && systemctl enable --now systemd-networkd</syntaxhighlight>
<source lang=bash>
Для проверки работоспособности нового сервиса следует перезагрузиться с воткнутым сетевым кабелем (поскольку Wi-Fi ещё не настроен) и сразу после перезагрузки — убедиться, что адрес получен каким-то из интерфейсов:
<syntaxhighlight lang="bash">
$ networkctl
$ networkctl
$ ip -o a s | awk '!/inet6|lo /'
$ ip -o a s | awk '!/inet6|lo /'
</source>
</syntaxhighlight>
==Беспроводная сеть==
 
#Для подключения к Wi-Fi понадобится файл <code>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf</code> со следующим содержимым:
====Беспроводная сеть====
#:<source lang=ini>
Для подключения к Wi-Fi понадобится включить авторизацию:
<syntaxhighlight lang="bash"># systemctl enable wpa_supplicant@wlan0</syntaxhighlight>
И создать вот такой файл:
{|class="mw-collapsible mw-collapsed wikitable"
!/etc/wpa_supplicant/wpa_supplicant-wlan0.conf &nbsp;
|-
|<syntaxhighlight lang=ini>
  ctrl_interface=/run/wpa_supplicant
  ctrl_interface=/run/wpa_supplicant
  ctrl_interface_group=wheel
  ctrl_interface_group=wheel
Строка 34: Строка 356:
  #mac_addr=0
  #mac_addr=0
  ##########################
  ##########################
</source>
</syntaxhighlight>
#Чтоб подключаться к точке доступа по паролю, требуется добавить его, не светя в настройках:
|}
#:<source lang=bash> # wpa_passphrase "имя точки доступа" "пароль от нее" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf</source>
Чтоб подключаться к точке доступа по паролю, нужно:
#И включить авторизацию по Wi-Fi:
#Добавить её, не светя пароль в настройках:
#:<source lang=bash> # systemctl enable wpa_supplicant@wlan0</source>
#:<syntaxhighlight lang="bash"># wpa_passphrase "BSSID" "пароль" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf</syntaxhighlight>
#Осталось перезагрузиться с выдернутым сетевым кабелем и способом, описанным выше, проверить работоспособность уже Wi-Fi.
#Перезапустить авторизацию на интерфейсе:
#Если нужно добавить новую точку доступа:
#:<syntaxhighlight lang="bash"># systemctl restart wpa_supplicant@wlan0</syntaxhighlight>
#:<source lang=bash>
Осталось перезагрузиться с выдернутым сетевым кабелем и способом, описанным выше, проверить работоспособность уже Wi-Fi.
# wpa_passphrase "имя новой точки доступа" "пароль от нее" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
 
# systemctl restart wpa_supplicant@wlan0
Для отключения Wi-Fi достаточно остановить авторизацию:
</source>
<syntaxhighlight lang="bash"># systemctl stop wpa_supplicant@wlan0</syntaxhighlight>
#При необходимости отключения Wi-Fi:
 
#:<source lang=bash># systemctl stop wpa_supplicant@wlan0</source>
==== DNS ====
==Уборка==
С получением ДНС-серверов по сети прекрасно справляется <code>systemd-resolved</code>, который нужно установить, запустить и нацелиться на {{path|/run/systemd/resolve/resolv.conf}} символьной ссылкой {{path|/etc/resolv.conf}}, заменив ею файл <code>openresolv</code>'а:
<syntaxhighlight lang="bash">
# apt-get install systemd-resolved
# systemctl enable --now systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
</syntaxhighlight>
Для фиксации имени компьютера можно создать файл {{path|/etc/sysctl.d/sysname.conf}} со следующим содержимым:
<syntaxhighlight lang="ini">kernel.hostname = <имя компьютера>
kernel.domainname = <имя домена> # опционально</syntaxhighlight>
==== Уборка ====
Если всё получилось, можно:
Если всё получилось, можно:
#Переименовать каталог /etc/net обратно:
*вернуть на место каталог {{path|/etc/net}}:
#:<source lang=bash># mv -f /etc/net.old /etc/net</source>
<syntaxhighlight lang=bash># mv -f /etc/net.old /etc/net</syntaxhighlight>
#Удалить ненужные более openresolv и etcnet:
*удалить ненужные более <code>openresolv</code> и <code>etcnet</code>:
{{Внимание|тянет за собой NetworkManager и другие зависимости, чистит как пылесос}}
{{Внимание|вместе с <code>openresolv</code>'ом приведённая команда тянет за собой <code>NetworkManager</code> и другие зависимости чистит как пылесос!}}
#:<source lang=bash># apt-get remove -y openresolv etcnet</source>
<syntaxhighlight lang=bash># apt-get remove etcnet openresolv</syntaxhighlight>
#Перезагрузиться.
*перезагрузиться.
 
==== Заключение ====
Преимущества такого подхода к настройке сети:
*работает в любом современном дистрибутиве linux в отличие от дистроспецифичных <code>netplan</code>, <code>upstart</code>, <code>etcnet</code> и пр.;
*Wi-Fi подключается ещё при загрузке подобно проводному соединению, а не после входа юзера в иксы, как с <code>NetworkManager</code>;
*ключи от точек доступа из системы не выудить, поскольку в конфиге — только их хэши.
 
Данная заметка — лишь первый шаг в освоении <code>systemd-networkd</code> и малая часть того, чем я пользуюсь и что он вообще умеет:
*поднимать связки интерфейсов (bonds),
*делить тегированные вланы,
*строить мосты всех со всеми,
*выступать не только клиентом DHCP, но и его сервером (пусть и с минимумом настроек),
*прибивать отдельные статические маршруты через винегрет интерфейсов и даже заполнять для них пространные таблицы маршрутизации…
…и многое другое.
 
=== Проводной интерфейс с DHCP ===
{{Note|Настройки для Ethernet-интерфейсов могут также изменяться в [[ЦУС]] (модуль [[Alterator-net-eth|Ethernet-интерфейсы]]. В этом случае будут созданы файлы конфигурации {{path|/etc/systemd/network/alterator-<Имя_интерфейса>.network}}, например, {{path|/etc/systemd/network/alterator-enp0s3.network}}.}}
 
Пример файла {{path|/etc/systemd/network/20-enp0s3.network}}:
<syntaxhighlight lang="ini">[Match]
Name = enp0s3
 
[Network]
DHCP = ipv4
LinkLocalAddressing = no
IPv6AcceptRA = false
 
[DHCPv4]
UseDomains = true
UseDNS = yes</syntaxhighlight>
 
=== Проводной интерфейс со статическим IP-адресом ===
Файл {{path|/etc/systemd/network/20-enp0s3.network}}:
<syntaxhighlight lang="ini">[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]</syntaxhighlight>
 
=== Сетевой мост с DHCP ===
Для создания моста на интерфейсе enp0s8 необходимо выполнить следующие действия:
# Создать виртуальный интерфейс моста. Для этого создать файл, например, {{path|/etc/systemd/network/20-bridge.netdev}} со следующим содержимым:
#:<syntaxhighlight lang="ini">[NetDev]
Name=vmbr0
Kind=bridge
MACAddress=08:00:27:43:79:7b</syntaxhighlight>
#:Можно не задавать MAC-адрес, в этом случае он будет сгенерирован на основе названия интерфейса и идентификатора машины.
# Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
#:<syntaxhighlight lang="bash"># systemctl restart systemd-networkd</syntaxhighlight>
# Проверка:
#:<syntaxhighlight lang="bash">$ 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</syntaxhighlight>
#:Интерфейс vmbr0 обнаружен, но выключен (DOWN).
# Привязать реальный сетевой интерфейса Ethernet (в примере — enp0s8) к виртуальному мосту. Для этого создать файл, например, {{path|/etc/systemd/network/20-bridge.network}} со следующим содержимым:
#:<syntaxhighlight lang="ini">[Match]
Name=enp0s8
 
[Network]
Bridge=vmbr0
</syntaxhighlight>
#:Реальному сетевому интерфейсу не должно быть назначено никакого IP-адреса.
# Указать сетевые настройки виртуального моста. Для этого создать файл, например, {{path|/etc/systemd/network/20-bridge-dhcp.network}} со следующим содержимым:
#:<syntaxhighlight lang="ini">[Match]
Name=vmbr0
 
[Network]
DHCP=ipv4
</syntaxhighlight>
# Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
#:<syntaxhighlight lang="bash"># systemctl restart systemd-networkd</syntaxhighlight>
# Проверка:
#:<syntaxhighlight lang="bash">$ 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</syntaxhighlight>
 
 
=== Объединение сетевых интерфейсов (bonding) ===
 
Создание объединения (bond) на интерфейсах enp0s8 и enp0s9 с режимом работы active-backup:
# Создать объединённый интерфейс. Для этого создать файл, например, {{path|/etc/systemd/network/bond.netdev}} со следующим содержимым:
#:<syntaxhighlight lang="ini">[NetDev]
Name=bond0
Kind=bond
 
[Bond]
Mode=active-backup
PrimaryReselectPolicy=always
MIIMonitorSec=10s</syntaxhighlight>
# В качестве основного указать интерфейс enp0s8 (файл {{path|/etc/systemd/network/enp0s8-bond0.network}}):
#:<syntaxhighlight lang="ini">[Match]
Name=enp0s8
 
[Network]
Bond=bond0
PrimarySlave=true</syntaxhighlight>
# В качестве запасного указать интерфейс enp0s9 (файл {{path|/etc/systemd/network/enp0s9-bond0.network}}):
#:<syntaxhighlight lang="ini">[Match]
Name=enp0s9
 
[Network]
Bond=bond0
</syntaxhighlight>
# Указать сетевые настройки для виртуального интерфейса (файл {{path|/etc/systemd/network/bond0.network}}):
#:<syntaxhighlight lang="ini">[Match]
Name=bond0
 
[Network]
DHCP=ipv4
</syntaxhighlight>
# Перезапустить systemd-networkd или перечитать настройки networkctl, чтобы настройки вступили в силу:
#:<syntaxhighlight lang="bash"># networkctl reload</syntaxhighlight>
# Проверка
#:<syntaxhighlight lang="bash"># 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.</syntaxhighlight>
#:Если отключить кабель от интерфейса enp0s8 соединение сохранится:
#:<syntaxhighlight lang="bash"># 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</syntaxhighlight>
 
=== VLAN ===
В данном примере создадим два VLAN-интерфейса с идентификаторами 100 и 200 на интерфейсе enp0s3.
 
# Создать VLAN-интерфейсы. Для этого создать два файла. Первый файл {{path|/etc/systemd/network/20-enp0s3.netdev}} со следующим содержимым:
#:<syntaxhighlight lang="ini">[NetDev]
Name=enp0s3.100
Kind=vlan
 
[VLAN]
Id=100</syntaxhighlight>
#:Второй файл {{path|/etc/systemd/network/21-enp0s3.netdev}} со следующим содержимым:
#:<syntaxhighlight lang="ini">[NetDev]
Name=enp0s3.200
Kind=vlan
 
[VLAN]
Id=200</syntaxhighlight>
# Привязать сетевой интерфейса Ethernet к VLAN. Для в файл настройки сетевого интерфейса enp0s3, например {{path|/etc/systemd/network/alterator-enp0s3.network}} добавить имена VLAN-интерфейсов:
#:<syntaxhighlight lang="ini">[Match]
Name = enp0s3
[Network]
DHCP = ipv4
LinkLocalAddressing = no
IPv6AcceptRA = false
VLAN=enp0s3.100
VLAN=enp0s3.200
[DHCPv4]
UseDomains = true
UseDNS = yes</syntaxhighlight>
# Указать сетевые настройки для каждой VLAN. Для интерфейса enp0s3.100 со статическим IP-адресом создать файл {{path|/etc/systemd/network/enp0s3.100.network}} со следующим содержимым:
#: <syntaxhighlight lang="ini">[Match]
Name=enp0s3.100
 
[Network]
DHCP=no
 
[Address]
Address=192.168.30.25/25
</syntaxhighlight>
#: Содержимое второго файла {{path|/etc/systemd/network/enp0s3.200.network}} для интерфейса enp0s3.200:
#:<syntaxhighlight lang="ini">[Match]
Name=enp0s3.200
 
[Network]
DHCP=no
 
[Address]
Address=192.168.30.145/25
</syntaxhighlight>
# Перезапустить systemd-networkd.service, чтобы настройки вступили в силу:
#: <syntaxhighlight lang="bash"># systemctl restart systemd-networkd</syntaxhighlight>
# Проверка:
#: <syntaxhighlight lang="bash">$ 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
</syntaxhighlight>
#: или
#: <syntaxhighlight lang="bash">$ 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


==DNS==
4 links listed.
С получением ДНС-серверов по сети прекрасно справляется <code>systemd-resolved</code>, который нужно:
</syntaxhighlight>
*установить и запустить:
*:<source lang=bash># apt-get install systemd-resolved && systemctl enable --now systemd-resolved</source>
*нацелиться символьной ссылкой <code>/etc/resolv.conf</code> на <code>/run/systemd/resolve/resolv.conf</code>:
*:<source lang=bash># ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf</source>
Для настроек имени компьютера можно создать файл <code>/etc/sysctl.d/sysname.conf</code> со следующим содержимым:
kernel.hostname = <имя компьютера>
kernel.domainname = <имя домена> # опционально


==Заключение==
Плюсы такого способа настройки:
*Wi-Fi подключается ещё при загрузке, а не после входа юзера в иксы;
*ключи от точек доступа из системы не выудить, поскольку в конфиге — только их хэши;
*работает в любом современном дистрибутиве linux в отличие от дистроспецифичных <code>upstart</code>, <code>etcnet</code> и пр.
И это лишь малая часть того, что умеет <code>systemd-networkd</code>. В частности, её посредством можно настраивать мосты (bridges), сетевые объединения (bonds) и мн.др.
==Ссылки==
==Ссылки==
[[Контейнеры_systemd-nspawn#Сеть|Настройка сети для контейнера nspawn]]
[[Контейнеры_systemd-nspawn#Сеть|Настройка сети для контейнера nspawn]]
==P.S.==
[[WireGuard|Запуск WireGuard (в т.ч. посредством systemd-networkd)]]
Создание статьи инициировано @NeuroFreak, которому я помогал настроить по этой методе домашнюю сеть на лаптопе.
[[Категория:Systemd]]
[[Категория:Systemd]]
{{Category navigation|title=Использование оборудования|category=использование оборудования|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Использование оборудования|category=использование оборудования|sortkey={{SUBPAGENAME}}}}
==Благодарности==
Статью вчерне накропал @NeuroFreak по следам моей ему помощи в настройке домашней сети на лаптопе. Мне оставалось её вычитать, отрихтовать, дополнить и структурировать.
==Обратная связь==
*[https://t.me/gbIMoBou @gbIMoBou]
*[[Участник:Дым#Заметки|Другие статьи]]

Текущая версия от 02:36, 29 февраля 2024

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-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
 ##########################

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

  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 по следам моей ему помощи в настройке домашней сети на лаптопе. Мне оставалось её вычитать, отрихтовать, дополнить и структурировать.

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