Переваги systemd-networkd на віртуальних серверах Linux

Зазвичай на десктопах Linux для управління мережевими налаштуваннями використовується NetworkManager, оскільки він відмінно справляється зі своєю роботою і має GUI фронтенды для всіх популярних графічних середовищ. Однак на серверах Linux його використання не доцільне: він споживає багато ресурсів. NetworkManager займає в оперативній пам'яті близько 20 Мб, в той час як systemd-networkd і systemd-resolvd разом менше 2 Мб. З цієї причини, за замовчуванням серверні дистрибутиви Linux часто використовують різні власні демони.



Таким чином виникає цілий зоопарк скриптів і утиліт: демон networking під Debian, який управляє конфігурацією мережі через ifupdown, використовує файли конфігурації зберігаються в /etc/networing/interfaces.d і файл /etc/networking/interfaces, під CentOS network, який використовує скрипти ifup і ifdown і, звичайно ж, свої файли конфігурації знаходяться в /etc/sysconfig/network-scripts, netctl під ArchLinux. Всім відомо, що Linux — конструктор, але чому б такий простий і спільною для найрізноманітніших систем речі як налаштування мережі не мати однаковий вигляд?

Ми пропонуємо почати використовувати швидкий і простий демонsystemd-networkd, особливо в світлі того, що багато дистрибутиви вже перейшли на systemd, тому перемикання на systemd-networkd не складе праці. На поточний момент systemd-networkd може замінити собою безліч утиліт і підтримує, налаштування мережі як по DHCP (клієнт і сервер), так і зі статичними IP-адресами, мости, тунелі, VLANs, бездротові мережі (використовуючи при цьому wpa_supplicant).

У статті ми розглянемо, як активувати systemd-networkd і почати його використовувати і в чому його основні переваги перед іншими демонами.

Запуск systemd-networkd
Незважаючи на пристрасті кипіли навколо впровадження systemd, багато популярні дистрибутиви Linux стали використовувати цей менеджер служб і постачати його за замовчуванням. Тому, ймовірно, що ваша система містить все необхідне для включення systemd-networkd. Необхідний systemd версії 210 і вище.

Перевірити версію можна за допомогою команди:

$ systemctl --version

Щоб використовувати, запустіть наступні дві служби і включіть їх роботу при завантаженні системи (відключивши при цьому інші демони керуючі конфігурацією мережі):

$ systemctl enable systemd-networkd
$ systemctl start systemd-networkd
$ systemctl enable systemd-resolved
$ systemctl start systemd-resolved

Налаштування
В якості прикладу перемикання розглянемо перенесення конфігурації мережі за замовчуванням в CentOS (/etc/rc.d/init.d/network initscript) на systemd-networkd.

Повністю аналогичо переїзд можна здійснити для Fedora і, з невеликими змінами, для інших дистрибутивів. Конфігураційні файли systemd-networkd знаходяться в директорії /etc/systemd/network. Доступні наступні типи:

  • .link – описують фізичні параметри кожного інтерфейс: ім'я, MAC, MTU та інші
  • .network – описують параметри мережі: IP, маршрути, DNS та інші
  • .netdev – описують віртуальні інтерфейси, мости
Конфігурація для прикладу: два інтерфейсу зі статичним IP LAN і WAN.

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 04:01:40:23:1f:01 brd ff:ff:ff:ff:ff:ff
inet 188.166.46.238/18 brd 188.166.63.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 2a03:b0c0:2:d0::69:7001/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::601:40ff:fe23:1f01/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 04:01:40:23:1f:02 brd ff:ff:ff:ff:ff:ff
inet 10.133.248.54/16 brd 10.133.255.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::601:40ff:fe23:1f02/64 scope link
valid_lft forever preferred_lft forever

Конфігураційні файли для CentOS (або Fedora): можна знайти в директорії /etc/sysconfig/network-scripts

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE='eth0'
TYPE=Ethernet
BOOTPROTO=none
ONBOOT='yes'
HWADDR=04:01:40:23:1f:01
IPADDR=188.166.46.238
NETMASK=255.255.192.0
GATEWAY=188.166.0.1
NM_CONTROLLED='yes'
IPV6INIT=yes
IPV6ADDR=2A03:B0C0:0002:00D0:0000:0000:0069:7001/64
IPV6_DEFAULTGW=2A03:B0C0:0002:00D0:0000:0000:0000:0001
IPV6_AUTOCONF=no
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8

Необхідно створити 4 файлу в директорії /etc/systemd/network/

$ cat /etc/systemd/network/90-external.link
[Match]
MACAddress=04:01:40:23:1f:01
[Link]
Name=eth-external

$ cat /etc/systemd/network/90-internal.link
[Match]
MACAddress=04:01:40:23:1f:02
[Link]
Name=eth-inner

$ cat eth-external.network
[Match]
Name= eth-outer
[Network]
DHCP=no
Adress=188.166.46.238/18
Adress=2A03:B0C0:0002:00D0:0000:0000:0000:0069:7001/64
Gateway=188.166.0.1
Gateway= 2A03:B0C0:0002:00D0:0000:0000:0000:0000:0001
DNS=2001:4860:4860:8844
DNS=2001:4860:4860:8888
DNS=8.8.8.8

$ cat eth-internal.network
[Match]
Name=eth-inner
[Network]
Address=10.133.248.54/16

Ось і все: конфігурація мережі завершено. Тепер можна перезапустити сервіс:

systemctl restart systemd-networkd

$ networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback n/a n/a
2 eth-outer ether routable configured
3 eth-inner ether routable configured

Інші типи мереж:

DHCP

В даному прикладі сконфігуріруем DHCP IPv4 і IPv6; IPv6 якщо не потрібен, можна виключити.

$ cat /etc/systemd/network/wired-dhcp.network
[Match]
Name=eth*

[Network]
DHCP=ipv4
DHCP=ipv6

Підключення типу Міст

Спочатку створює конфігурацію віртуального інтерфейсу:

$ cat /etc/systemd/network/bridge.netdev
[NetDev]
Name=br0
Kind=bridge

$ cat /etc/systemd/network/bridge.network
[Match]
Name=br0

[Network]
DHCP=ipv4

І налаштовуємо інтерфейс для підключення:

$ cat /etc/systemd/network/wired.network
[Match]
Name=eth*

[Network]
Bridge=br0

Недоліки (не актуальні, за великим рахунком, для серверів)
1. Не буде працювати без systemd.

2. Немає ні CLI ні GUI фронтендов. І NetworkManager, і netctl не страждають таким недоліком. Наприклад, для підключення до WiFi вам знадобиться командний рядок. Не зовсім актуально для сервера.

3. Для першого підключення до WiFi необхідні root права. Однак це не зовсім недолік, так як в майбутньому до цієї бездротової мережі з'єднання буде відбуватися автоматично.

4. Якщо бути обережним, то пароль від WiFi може зберігатися у відкритому вигляді в історії команд. але цього можна легко уникнути кількома способами: тимчасово відключити запис команд в історію (для bash: set +o history, set -o history), використовувати shell не запам'ятовує історію (наприклад dash) або просто видалити пароль з історії.

Бенчмарк
Тестується швидкість отримання адрес по DHCP, Network manager and dnsmasq відключені.

Софт:
— CentOS 7
— kernel-3.10.0-327.28.3.el7
— systemd 219
— ISC DHCP client daemon and dhclient-script 4.2.5
systemd-networkd
$ systemctl start systemd-networkd
$ journalctl -u systemd-networkd.service
Sep 01 13:04:41 localhost systemd[1]: Starting Network Service...
Sep 01 13:04:41 localhost systemd-networkd[4085]: Enumeration completed
Sep 01 13:04:41 localhost systemd[1]: Started Network Service.
Sep 01 13:04:41 localhost systemd-networkd[4085]: eth0: DHCPv4 address 192.168.1.114/24 via 192.168.1.1
Sep 01 13:04:41 localhost systemd-networkd[4085]: eth0: Configured

Менше ніж за секунду.

ISC DHCP
$ time dhclient -v eth0
Interface up - dhclient
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/enp2s0/94:de:80:1a:da:af
Sending on LPF/enp2s0/94:de:80:1a:da:af
Sending on Socket/fallback
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x5b763f4d)
DHCPACK from 192.168.1.1 (xid=0x5b763f4d)
bound to 192.168.1.115 -- renewal in 20662 seconds.

real 0m2.243s
user 0m0.042s
sys 0m0.216s

Середній час після декількох спроб склало 2.5 секунд.

Висновок
У вигляді активного використання systemd різними топовими дистрибутивами Linux можна укласти, що, все ж, співтовариство прагне до уніфікації основних системних функцій. До них відноситься, в тому числі, конфігурування мережі, а systemd, в свою чергу, пропонує зручне, швидке і функціональне рішення. І нехай поки це рішення стикається з проблемою відсутності GUI для десктопних систем, але для Linux серверів воно, можливо, стане стандартом «де-факто» і замінить купу легасі демонів і окремих утиліт. Це зробить Linux набагато більш зручним для контейнеризації і використання на віртуальних машинах.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.