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

Материал из ALT Linux Wiki
 
(не показана 61 промежуточная версия 2 участников)
Строка 1: Строка 1:
'''Управление сетью посредством systemd-networkd'''
systemd-networkd — системная служба для управления сетевыми настройками. Его задачей является обнаружение и настройка сетевых устройств по мере их появления, а также создание виртуальных сетевых устройств.
==Подготовка==
 
#Установка пакета [[systemd-timesyncd]], который пригодится сразу после переезда, автоматически тянет за собой собственно <code>systemd-networkd</code>:
systemd/udev автоматически назначает постоянные имена для обнаруженных Ethernet, WLAN и WWAN-интерфейсов. Список интерфейсов можно увидеть, выполнив команду {{cmd|networkctl list}}.
#:<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>:
#:{{cmd|# apt-get install -y systemd-timesyncd}}
#Дабы оставить возможность отката, вместо сноса <code>etcnet</code> пока достаточно просто переименовать его каталог:
#Дабы оставить возможность отката, вместо сноса <code>etcnet</code> пока достаточно просто переименовать его каталог:
#:<source lang=bash> # mv -f /etc/net /etc/net.old</source>
#:{{cmd|# mv -f /etc/net /etc/net.old}}
#Создать пару файлов автонастройки для проводных (<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>


==Проводная сеть==
==== Проводная сеть ====
Пора переключиться с <code>etcnet</code>/<code>NetworkManager</code> на <code>systemd-networkd</code>:
Пора переключиться с <code>etcnet</code>/<code>NetworkManager</code> на <code>systemd-networkd</code>:
# systemctl disable network NetworkManager && systemctl enable systemd-networkd systemd-timesyncd
 
{{cmd|# systemctl disable --now network NetworkManager && systemctl enable --now systemd-networkd}}
 
Для проверки работоспособности нового сервиса следует перезагрузиться с воткнутым сетевым кабелем (поскольку Wi-Fi ещё не настроен) и сразу после перезагрузки — убедиться, что адрес получен каким-то из интерфейсов:
Для проверки работоспособности нового сервиса следует перезагрузиться с воткнутым сетевым кабелем (поскольку Wi-Fi ещё не настроен) и сразу после перезагрузки — убедиться, что адрес получен каким-то из интерфейсов:
<source lang=bash>
<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> со следующим содержимым:
Для подключения к Wi-Fi понадобится...
#:<source lang=ini>
* включить авторизацию:
*:{{cmd|# systemctl enable wpa_supplicant@wlan0}}
*и создать такой файл:
{|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
Строка 35: Строка 359:
  #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>
*:{{cmd|# wpa_passphrase "BSSID" "пароль" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf}}
#Осталось перезагрузиться с выдернутым сетевым кабелем и способом, описанным выше, проверить работоспособность уже Wi-Fi.
*и перезапустить авторизацию на интерфейсе:
#Если нужно добавить новую точку доступа:
*:{{cmd|# systemctl restart wpa_supplicant@wlan0}}
#:<source lang=bash>
Осталось перезагрузиться с выдернутым сетевым кабелем и способом, описанным выше, проверить работоспособность уже Wi-Fi.
# wpa_passphrase "имя новой точки доступа" "пароль от нее" | sed '/#/d' >>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
 
# systemctl restart wpa_supplicant@wlan0
Для отключения Wi-Fi достаточно остановить авторизацию: {{cmd|# systemctl stop wpa_supplicant@wlan0}}
</source>
 
#При необходимости отключения Wi-Fi:
==== DNS ====
#:<source lang=bash># systemctl stop wpa_supplicant@wlan0</source>
С получением ДНС-серверов по сети прекрасно справляется <code>systemd-resolved</code>, который нужно установить, запустить и нацелиться на {{path|/run/systemd/resolve/resolv.conf}} символьной ссылкой {{path|/etc/resolv.conf}}, заменив ею файл <code>openresolv</code>'а:
==Уборка==
 
{{cmd|# apt-get install systemd-resolved<br/># systemctl enable --now systemd-resolved<br/># ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf}}
 
Для фиксации имени компьютера можно создать файл {{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>
*:{{cmd|# mv -f /etc/net.old /etc/net}}
*удалить ненужные более openresolv и etcnet:
*удалить ненужные более <code>openresolv</code> и <code>etcnet</code>:
*:{{cmd|# apt-get remove etcnet openresolv}}
{{Внимание|вместе с <code>openresolv</code>'ом приведённая команда тянет за собой <code>NetworkManager</code> и другие зависимости — чистит как пылесос!}}
{{Внимание|вместе с <code>openresolv</code>'ом приведённая команда тянет за собой <code>NetworkManager</code> и другие зависимости — чистит как пылесос!}}
<source lang=bash># apt-get remove etcnet openresolv</source>
*перезагрузиться.
*перезагрузиться.


==DNS==
==== Заключение ====
С получением ДНС-серверов по сети прекрасно справляется <code>systemd-resolved</code>, который нужно установить, запустить и нацелиться на <code>/run/systemd/resolve/resolv.conf</code> символьной ссылкой <code>/etc/resolv.conf</code>, заменив ею файл старого резолвера:
<source lang=bash>
# apt-get install systemd-resolved
# systemctl enable --now systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
</source>
Для фиксации имени компьютера можно создать файл <code>/etc/sysctl.d/sysname.conf</code> со следующим содержимым:
kernel.hostname = <имя компьютера>
kernel.domainname = <имя домена> # опционально
 
==Заключение==
Преимущества такого подхода к настройке сети:
Преимущества такого подхода к настройке сети:
*работает в любом современном дистрибутиве linux в отличие от дистроспецифичных <code>upstart</code>, <code>etcnet</code> и пр.;
*работает в любом современном дистрибутиве linux в отличие от дистроспецифичных <code>netplan</code>, <code>upstart</code>, <code>etcnet</code> и пр.;
*Wi-Fi подключается ещё при загрузке подобно проводному соединению, а не после входа юзера в иксы, как с <code>NetworkManager</code>;
*Wi-Fi подключается ещё при загрузке подобно проводному соединению, а не после входа юзера в иксы, как с <code>NetworkManager</code>;
*ключи от точек доступа из системы не выудить, поскольку в конфиге — только их хэши.
*ключи от точек доступа из системы не выудить, поскольку в конфиге — только их хэши.


Данная заметка — лишь первый шаг в освоении <code>systemd-networkd</code> и малая часть того, чем я пользуюсь и что он вообще умеет:
Данная заметка — лишь первый шаг в освоении <code>systemd-networkd</code> и малая часть того, чем я пользуюсь и что он вообще умеет:
*выступать не только клиентом DHCP, но и его сервером (пусть и с минимумом настроек);
*поднимать связки интерфейсов (bonds),
*поднимать мосты (bridges) и связки (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
4 links listed.
</syntaxhighlight>


==Ссылки==
==Ссылки==
[[Контейнеры_systemd-nspawn#Сеть|Настройка сети для контейнера nspawn]]
[[Контейнеры_systemd-nspawn#Сеть|Настройка сети для контейнера nspawn]]
[[WireGuard|Запуск WireGuard (в т.ч. посредством systemd-networkd)]]
[[Категория:Systemd]]
{{Category navigation|title=Использование оборудования|category=использование оборудования|sortkey={{SUBPAGENAME}}}}
==Благодарности==
==Благодарности==
Статью вчерне накропал @NeuroFreak по следам моей ему помощи в настройке домашней сети на лаптопе. Мне оставалось её вычитать, отрихтовать, дополнить и структурировать.
Статью вчерне накропал @NeuroFreak по следам моей ему помощи в настройке домашней сети на лаптопе. Мне оставалось её вычитать, отрихтовать, дополнить и структурировать.
[[Категория:Systemd]]
==Обратная связь==
{{Category navigation|title=Использование оборудования|category=использование оборудования|sortkey={{SUBPAGENAME}}}}
*[https://t.me/gbIMoBou @gbIMoBou]
*[[Участник:Дым#Заметки|Другие статьи]]

Текущая версия от 06:53, 1 декабря 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
 ##########################

А для подключения к точке доступа по паролю, потребуется...

  • добавить её, не светя пароль в настройках:
    # wpa_passphrase "BSSID" "пароль"
  • и перезапустить авторизацию на интерфейсе:
    # 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
Внимание: вместе с openresolv'ом приведённая команда тянет за собой NetworkManager и другие зависимости — чистит как пылесос!
  • перезагрузиться.

Заключение

Преимущества такого подхода к настройке сети:

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

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