systemd-networkd

Сьогодні я вам розкажу коротку казочку про systemd-networkd.

TL;DR: усе працює, але є нюанси, особливо в складних конфігураціях, тому краще поки використовувати дистрибутивні конфігурялки мережі.

Конфіг для звичайного підключення до провайдера, зверху якого підніматиметься IPv6-тунель (enp2s0.network):

[Match]
Name=enp2s0

[Network]
DNS=127.0.0.1
IPForward=yes
Tunnel=netassist

[Address]
Address=a.b.c.d/24

[Route]
Gateway=e.f.g.h

Конфіг тунеля (по-порядку netassist.netdev і netassist.network):

[Match]
 
[NetDev]
Name=netassist
Kind=sit
MTUBytes=1480
 
[Tunnel]
Local=a.b.c.d
Remote=i.j.k.l
TTL=255

[Match]
Name=netassist
 
[Network]
Address=2a01:dead:beef::2
Gateway=2a01:dead:beef::1

Для Wi-Fi+hostapd я використовую такий же самий конфіг, що і для ISP, але ще додатково створюю сервіс, який виставляє потужність точки доступу після завантаження hostapd (After=hostapd.service).

VLAN’и конфігуруються також доволі просто (по-порядку enp3s0.10.netdev і enp3s0.10.network):

[Match]

[NetDev]
Name=enp3s0.10
Kind=vlan

[VLAN]
Id=10

[Match]
Name=enp3s0.10

[Network]
IPForward=yes
Address=10.10.10.1/24
Address=2a01:dead:beef:10::1/64

Зауважте, що якщо потрібно робити SNAT/маскарадинг чи щось інше, що потребує форвардінга пакетів на інтерфейсі, обов’язково потрібно вказувати IPForward=yes, інакше ніякий sysctl вам не допоможе.

Ще я роблю так, щоб на гіпервізорі був піднятий міст, у який підключаються віртуалки. Для початку конфіг моста (по-порядку bridge-vms.netdev і bridge-vms.network):

[NetDev]
Name=bridge-vms
Kind=bridge

[Match]
Name=bridge-vms

[Network]
IPForward=yes
Address=169.254.0.1/16

Отут, як бачите, дуже тупо. systemd-networkd вважає, що інтерфейс перебуває у стані degraded, якщо на ньому не навішено IP-адресу. Мені вона на інтерфейсі мосту не потрібно (див. нижче), тому я вішаю що-небудь сіре, у цьому випадку це IP з діапазону автоконфігурації IPv4.

Також, для доступу до бріджованих віртуалок я використовую VETH із гіпервізора (щоб не було проблем зі зміною MAC-адреси бріджа). Для цього в systemd-networkd потрібно створити аж три файли: host.netdev, host-bp.network і host.network. Їх подано нижче також по-порядку.

[NetDev]
Name=host
Kind=veth

[Peer]
Name=host-bp

[Match]
Name=host-bp

[Network]
Bridge=bridge-vms

[Match]
Name=host

[Network]
IPForward=yes
Address=10.10.11.1/24
Address=2a01:dead:beef:11::1/64

Таким чином, одним кінцем пара дивиться у брідж, іншим — у хост, і через цей інтерфейс можна робити маршрутизацію. Дивно, що в netctl я не знайшов поки що нічого схожого (як і для CentOS’і, мабуть, доведеться писати якийсь модуль самому).

Окрім підводного каміння із вмиканням форвардінга і деградованих бріджів є ще поки що не вилікувана проблема з тим, що мережеві інтерфейси частково піднімаються після служб, яким вони потрібні. При цьому, в netctl такого неподобства нема. Сюди ж відноситься і проблема з біндінгом nginx’а на IPv6-адресу, про яку я вже писав раніше. А в іншому інструментарій дуже зручний, і свої задачі після доведення до пристойного вигляду, сподіваюся, буде виконувати добре.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

*

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.