Демонстрационные примеры Пример для демонстрации большинства необходимых опций конфигурирования.
- Код: выделить все
[Match]
Name=eth0
[Network]
#DHCP=yes
#DHCP=ipv6
Address=192.168.114.10/24
Address=2000:2cc0:13b1:3333::4/64
DNS=192.168.114.3
DNS=2000:2cc0:13b1:3333::1
DNSSEC=false
DNSSECNegativeTrustAnchors=tr-home.de
Domains=tr-home.de ~.
# overrides setting via sysctl
IPv6PrivacyExtensions=kernel
ManageTemporaryAddress=true
IPv6AcceptRA=true
LinkLocalAddressing=ipv6
IPv6LinkLocalAddressGenerationMode=eui64
[IPv6AcceptRA]
UseDNS=false
Token=eui64
[DHCPv6]
UseDNS=false
[Route]
Gateway=192.168.114.1
GatewayOnlink=yes
[Route]
Gateway=2000:2cc0:13b1:3333::1
В конфигурационном файле для systemd-networkd используются различные параметры для настройки сетевого интерфейса и его поведения. Давайте рассмотрим назначение опций:
[Match]
- Name=eth0: Этот параметр указывает, что настройки из этого файла будут применяться только к сетевому интерфейсу с именем eth0. Если интерфейс имеет другое имя, настройки не будут применяться.
[Network] - DNSSEC=false: Отключает проверку подписей DNSSEC при разрешении доменных имен. DNSSEC обеспечивает защиту от подделки данных DNS, но если эта опция отключена, система не будет проверять подлинность записей DNS.
- DNSSECNegativeTrustAnchors=tr-home.de: Исключает домен tr-home.de из проверки DNSSEC, даже если DNSSEC включен. Это полезно, если домен не поддерживает DNSSEC, но вы все равно хотите использовать его без предупреждений о некорректных DNS-записях.
- Domains=tr-home.de ~.: Определяет домены поиска для интерфейса. В этом случае, при запросе неполного имени хоста (например, host1), система сначала попробует найти его в домене tr-home.de, а затем в корневом домене (.). Символ ~. указывает, что этот домен должен использоваться как резервный, если имя не удалось разрешить в других доменах.
- IPv6PrivacyExtensions=kernel: Управляет использованием временных IPv6-адресов, которые используются для повышения конфиденциальности. Значение kernel указывает, что конфигурация должна использовать параметры, заданные в ядре системы. Временные адреса помогают предотвратить отслеживание устройства на основе его MAC-адреса.
- ManageTemporaryAddress=true: Если установлено в true, systemd-networkd будет управлять временными IPv6-адресами, которые создаются для повышения конфиденциальности. Эти адреса часто используются для исходящих подключений, чтобы скрыть основной IPv6-адрес устройства.
- IPv6AcceptRA=true: Включает получение и обработку объявлений маршрутизаторов (RA) для настройки IPv6 через Stateless Address Autoconfiguration (SLAAC). Это позволяет устройству автоматически получать адреса и другую информацию от маршрутизаторов в сети.
- LinkLocalAddressing=ipv6: Указывает, что на интерфейсе будут использоваться только локальные IPv6-адреса. Локальные адреса используются для связи между устройствами в одной сети (например, fe80::/64). Вариантами также могут быть ipv4, both, или no (отключает локальные адреса).
IPv6LinkLocalAddressGenerationMode=eui64: Указывает, как генерировать локальный IPv6-адрес. Значение eui64 означает, что адрес будет сгенерирован на основе MAC-адреса интерфейса, что делает его стабильным и предсказуемым.
[IPv6AcceptRA] - UseDNS=false: Отключает автоматическую настройку DNS-серверов, полученных через объявления маршрутизаторов (RA). Это может быть полезно, если вы хотите использовать свои DNS-серверы, а не те, которые предоставляются маршрутизатором.
- Token=eui64: Использует механизм EUI-64 для генерации идентификатора интерфейса в IPv6-адресах, полученных через SLAAC. Это обеспечивает стабильность адресов, сгенерированных на основе MAC-адреса интерфейса.
[DHCPv6] - UseDNS=false: Отключает использование DNS-серверов, полученных через DHCPv6. Это позволяет использовать вручную настроенные DNS-серверы вместо тех, что предлагает DHCP-сервер.
[Route] - GatewayOnlink=yes: Этот параметр указывает, что шлюз, указанный для маршрута, может находиться в любой сети, не обязательно в сети, к которой подключен данный интерфейс. Это полезно, если шлюз находится за пределами прямого сетевого сегмента, но вы знаете, что он доступен через определённый интерфейс.
Обычное поведение при указании шлюза в маршрутах — это проверка, находится ли шлюз в одной и той же сети, что и интерфейс, на который назначен маршрут. Если эта проверка не проходит, маршрут не будет активирован. Параметр GatewayOnlink=yes игнорирует эту проверку, позволяя маршрутам с указанным шлюзом быть активированными, даже если он находится "вне" локальной сети.
Это может быть полезно в сложных сетевых конфигурациях, например, когда вы настраиваете маршрут через VPN или через многосегментные сети, где шлюз не принадлежит напрямую сети интерфейса.
Эти параметры позволяют гибко настроить поведение сетевого интерфейса eth0, управляя тем, как он получает IPv6-адреса, обрабатывает DNS-запросы, использует временные адреса для повышения конфиденциальности и взаимодействует с объявлениями маршрутизаторов. Они обеспечивают более точный контроль над тем, как интерфейс взаимодействует с сетью, что особенно важно в сложных или чувствительных к безопасности средах.
Пример DUAL STACKПример конфигурационного файла с опциями максимально приближенными к реальным условиям использования
- Код: выделить все
[Match]
Name=enp0s3
[Network]
DHCP=no
DNS=192.168.114.254
DNS=2000:2cc0:13b1:3333::1
ManageTemporaryAddress=false
IPv6AcceptRA=false
LinkLocalAddressing=ipv6
IPv6LinkLocalAddressGenerationMode=eui64
Domains=free-adm.ru ~.
DNSSECNegativeTrustAnchors=free-adm.ru
[IPv6AcceptRA]
UseDNS=false
[Address]
Label=LANv4
Address=192.168.114.19/24
[Address]
Label=LANv6
Address=2000:2cc0:13b1:3333::19/64
[Route]
Gateway=192.168.114.254
[Route]
Gateway=2000:2cc0:13b1:3333::1
Пример с VLANscd /etc/systemd/network/
- Код: выделить все
├── 10-enp0s3.link
├── 10-enp0s3.network
├── 20-enp0s3.10.netdev
├── 20-enp0s3.10.network
├── 20-enp0s3.20.netdev
├── 20-enp0s3.20.network
├── 20-enp0s3.30.netdev
├── 20-enp0s3.30.network
├── 20-enp0s3.40.netdev
├── 20-enp0s3.40.network
├── 20-enp0s3.50.netdev
└── 20-enp0s3.50.network
cat 10-enp0s3.link
- Код: выделить все
[Match]
MACAddress=08:00:27:f3:11:31
[Link]
Name=enp0s3
RequiredForOnline=no
RequiredForOnline — это параметр в systemd-networkd, который определяет, считается ли интерфейс обязательным для состояния сети «online».
Если RequiredForOnline=yes, то:
- systemd-networkd-wait-online будет ожидать, пока этот интерфейс полностью поднимется (адрес, маршруты, link-up),
- система не перейдёт в состояние network-online.target, пока интерфейс не будет готов.
Если RequiredForOnline=no, то:
- интерфейс игнорируется для цели «network online»,
- загрузка не задерживается, даже если интерфейс отсутствует, недоступен или не получил IP.
Проще говоря:
RequiredForOnline — указывает, должен ли интерфейс быть полностью рабочим, чтобы система считалась "в сети".
cat 10-enp0s3.network
- Код: выделить все
[Match]
Name=enp0s3
[Network]
VLAN=enp0s3.10
VLAN=enp0s3.20
VLAN=enp0s3.30
VLAN=enp0s3.40
VLAN=enp0s3.50
LinkLocalAddressing=no
IPv6AcceptRA=no
отключаем для родительского интерфейса Link Local Address и приём пакетов RA (router advertisements)
cat 20-enp0s3.10.netdev
- Код: выделить все
[NetDev]
Name=enp0s3.10
Kind=vlan
MACAddress=02:00:27:f3:11:0a
[VLAN]
Id=10
cat 20-enp0s3.10.network
- Код: выделить все
[Match]
Name=enp0s3.10
[Network]
Address=192.168.1.1/24
DNS=192.168.1.1
Отсутствие параметра gateway не является недочётом конфигурации (в данном случае), так как используется OSPF.
cat 20-enp0s3.20.netdev
- Код: выделить все
[NetDev]
Name=enp0s3.20
Kind=vlan
MACAddress=02:00:27:f3:11:14
[VLAN]
Id=20
cat 20-enp0s3.20.network
- Код: выделить все
[Match]
Name=enp0s3.20
[Network]
Address=10.10.11.6/29
cat 20-enp0s3.30.netdev
- Код: выделить все
[NetDev]
Name=enp0s3.30
Kind=vlan
MACAddress=02:00:27:f3:11:1e
[VLAN]
Id=30
cat 20-enp0s3.30.network
- Код: выделить все
[Match]
Name=enp0s3.30
[Network]
Address=10.10.11.14/29
cat 20-enp0s3.40.netdev
- Код: выделить все
[NetDev]
Name=enp0s3.40
Kind=vlan
MACAddress=02:00:27:f3:11:28
[VLAN]
Id=40
cat 20-enp0s3.40.network
- Код: выделить все
[Match]
Name=enp0s3.40
[Network]
Address=10.10.11.22/29
cat 20-enp0s3.50.netdev
- Код: выделить все
[NetDev]
Name=enp0s3.50
Kind=vlan
MACAddress=02:00:27:f3:11:32
[VLAN]
Id=50
cat 20-enp0s3.50.network
- Код: выделить все
[Match]
Name=enp0s3.50
[Network]
Address=10.10.11.30/29
На VLAN'ы назначаются MAC адреса из диапазона LAA вида
02.XX:XX:XX:XX:
ID. ID - идентификатор VLAN, который указан как HEX. В примере задействован последний байт для наглядности. Чтобы покрыть весь диапазон возможных значений нужно задействовать 2 последних байта адреса (от 00:00 до FF:FF) - это как раз покрывает полный диапазон от 1 до 4094 возможных значений VLAN ID.
VLAN является самостоятельным широковещательным доменом, однако наличие одинаковых MAC адресов может является проблемой:
- VLAN изолирует широковещательные домены, но не "вселенные MAC-адресов". MAC-адрес — это идентификатор конкретного сетевого интерфейса в рамках общей среды передачи данных (Ethernet).
- Проблема возникает при маршрутизации между VLAN (L3) или при использовании устройств, которые работают с несколькими VLAN одновременно (роутеры, L3-коммутаторы, межсетевые экраны, некоторые серверы с тегированными интерфейсами).
Совет: Не стоит считать, что VLAN разрешает дублирование MAC-адресов.
Для преобразования десятичных значений в шестнадцатеричный вид можно использовать простой однострочный скрипт. Примерно такой:
- Код: выделить все
printf "%x\n" 20
14
Настройка параметров Ethernet# /etc/systemd/networkd/internet.link
- Код: выделить все
[Match]
MACAddress=a0:36:9f:6e:52:26
[Link]
BitsPerSecond=1G
Duplex=full
MTUBytes=1480