Страница 1 из 1

Описание systemd-networkd

Добавлено: 12 ноя 2017, 00:02
xor
Источник: https://wiki.archlinux.org/index.php/Sy ... %B8%D0%B9)

Описание systemd-networkd
systemd-networkd - это системный демон, который управляет сетевыми настройками. По мере появления он обнаруживает и настраивает сетевые устройства, также может создавать виртуальные сетевые устройства. Эта служба может быть особенно полезной для установки сложных сетевых настроек, для контейнера управляемым Systemd-nspawn или для виртуальных машин. А также отлично работает на простом соединении.

Основы использования
Пакет systemd является частью установки Arch по умолчанию, и содержит все необходимые файлы для работы в проводной сети. Беспроводные адаптеры могут быть установлены другими службами, такими как wpa_supplicant, они будут рассмотрены далее в этой статье.

Обязательные службы и установки
Чтобы использовать systemd-networkd, запустите следующие две службы и включите их работу при загрузке системы:
  • systemd-networkd.service
  • systemd-resolved.service
Офтопик
Примечание: systemd-resolved на самом деле требуется, только если вы указали записи DNS в файлах .network или если вы хотите получить адреса DNS от DHCP клиента networkd.
Для совместимости с resolv.conf, удалите или переименуйте существующий файл и создайте следующую символическую ссылку:
# ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

Для того, чтобы использовать локальную DNS-заглушку распознающую systemd-resolved (и, следовательно, использовать LLMNR и DNS слияние каждого интерфейса), замените dns с resolve в /etc/nsswitch.conf:

Код: Выделить всё

hosts: files resolve myhostname
Смотрите systemd-resolved(8), resolved.conf(5) и Systemd README.
Офтопик
Примечание: Systemd's resolve не может найти локальный домен, когда дается только имя хоста, даже когда UseDomains=yes или Domains=[domain-list] присутствует в соответствующем файле .network, и что файл производит ожидаемый search [domain-list] в resolv.conf. Если вы столкнулись с этой проблемой:
  • Переключитесь на использование полного доменного имени
  • Используйте разрешения имен хостов /etc/hosts
  • Откатитесь назад, используя glibc's dns вместо systemd's resolve
Примеры настроек
Все настройки этого раздела хранятся в foo.network в /etc/systemd/network. Для получения полного списка опций и порядка обработки, см. #Файлы настроек и страницу man systemd.network.
Systemd/udev автоматически назначает предсказуемые, стабильные имена сетевого интерфейса для всех локальных Ethernet, WLAN, и WWAN интерфейсов. Воспользуйтесь networkctl list, - список устройств в системе.
После внесения изменений в файл настройки, перезагрузите демон networkd.
# systemctl restart systemd-networkd
Офтопик
Примечание: В приведенных ниже примерах, enp1s0 это проводной адаптер, а wlp2s0 беспроводной адаптер. Эти имена могут быть другими в разных системах.
Проводной адаптер с DHCP
/etc/systemd/network/wired.network

Код: Выделить всё

[Match]
Name=enp1s0

[Network]
DHCP=ipv4
Проводной адаптер использующий статический IP
/etc/systemd/network/wired.network

Код: Выделить всё

[Match]
Name=enp1s0

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
Для больших вариантов, таких как сети с указанием DNS-серверов и широковещательного адреса, смотрите страницу man systemd.network(5).

Беспроводной адаптер
Для того, чтобы подключиться к беспроводной сети с systemd-networkd, беспроводной адаптер настраивается с другой службой, например потребуется wpa_supplicant. В этом примере, соответствующий файл службы Systemd, которая должна быть включена в wpa_supplicant@wlp2s0.service.
/etc/systemd/network/wireless.network

Код: Выделить всё

[Match]
Name=wlp2s0

[Network]
DHCP=ipv4
Если беспроводной адаптер имеет статический IP-адрес, настройка является такой же (кроме имени интерфейса) как в проводном адаптере.

Проводные и беспроводные адаптеры на одной машине
Такая настройка проводной и беспроводной связи DHCP IP (использующих Metric директивы) даст возможность ядру решать на лету, какой из них использовать. Таким образом, когда проводное соединение отключено, никакого обрыва соединения не будет.
Маршрут метрики ядра (также как настройка ip) решает, какой маршрут использовать для исходящих пакетов, в тех случаях, когда установлено несколько Match. Это происходит в том случае, когда оба устройства (проводное и беспроводное) в системе имеют активные соединения. Чтобы разорвать связь, ядро использует метрики. Если одно из соединений завершается, другое автоматически выигрывает без наличия разрывов (текущие трансферты могут до сих пор не справиться с этим хорошо, но это в другом слое OSI).
Офтопик
Примечание: Опция Metric для статических маршрутов, а опция RouteMetric для не использующих статические маршруты.
/etc/systemd/network/wired.network

Код: Выделить всё

[Match]
Name=enp1s0

[Network]
DHCP=ipv4

[DHCP]
RouteMetric=10
/etc/systemd/network/wireless.network

Код: Выделить всё

[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

[DHCP]
RouteMetric=20
IPv6 расширения конфиденциальности
Офтопик
Примечание: Broken on v228 https://github.com/systemd/systemd/issues/2242
Файлы настроек
Файлы настроек расположены в /usr/lib/systemd/network, в динамическом каталоге выполнения сети /run/systemd/network и локальном каталоге сетевого администрирования /etc/systemd/network. Файлы в /etc/systemd/network имеют самый высокий приоритет.
Существуют три типа файлов настройки.
  • .network файлы. Они будут применять сетевую настройку для matching (совпадения) устройства
  • .netdev файлы. Они создадут virtual network device для среды matching
  • .link файлы. Когда появится сетевое устройство, udev сначала посмотрит matching файла .link
Все они следуют тем же правилам:
  • Если все условия в [Match] разделе совпали, профиль будет активирован
  • Пустая секция [Match] означает, что профиль будет применяться в любом случае (можно сравнить с шуткой *)
  • Каждая запись с синтаксисом NAME=VALUE является ключевой
  • все файлы настроек вместе сортируются и обрабатываются в лексическом порядке, независимо от каталога, в котором они живут
  • файлы с одинаковым именем сменяют друг друга
Офтопик
Совет:
переопределить системный файл /usr/lib/systemd/network на постоянную основу (то есть даже после обновления) можно поместив файл с таким же именем в каталог /etc/systemd/network и создав для него символьную ссылку в /dev/null
символ * можно использовать в VALUE (например, значению en* будет соответствовать любое устройство Ethernet)
в соответствии с информацией, данной в этом сообщении Arch-general, лучше всего выставлять параметры для конкретных сетевых контейнеров внутри контейнера при помощи файлов networkd
Файлы network
Эти файлы направлены на установку переменных сетевых настроек, в основном для серверов и контейнеров.
Ниже приводится основная структура файла МойПрофиль.network:
/etc/systemd/network/МойПрофиль.network

Код: Выделить всё

[Match]
вертикальный список ключей

[Network]
вертикальный список ключей

[Address]
вертикальный список ключей

[Route]
вертикальный список ключей
[Match] раздел
Наиболее распространенные ключи:
  • Name= имя устройства (например Br0, enp4s0, en*)
  • Host= имя хоста машины
  • Virtualization= проверить, является ли система выполненной в виртуализированной среде или нет. Virtualization=no ключ будет применяться только на вашей машине, в то время как Virtualization=yes применяются к любому контейнеру или VM.
[Network] раздел
Наиболее распространенные ключи:
  • DHCP= включает поддержку DHCPv4 и/или DHCPv6. Принимает: yes, no, ipv4 или ipv6
  • DNS= является DNS адрес сервера. Вы можете указать этот параметр более одного раза
  • Bridge= это имя моста, чтобы добавить ссылку на
  • IPForward= по умолчанию no. Это разрешает IP forwarding, выполняя пересылку в соответствии с таблицей маршрутизации и необходим для настройк Internet sharing. Заметим, что включение IPForward= относится ко всем сетевым интерфейсам.
  • Domains= список доменов, используемых для разрешения имен DNS хоста.
Для подробностей, смотрите systemd.network(5).

[Address] раздел
Большинство общих ключ в разделе [Address]:
Address= статический IPv4 или IPv6 адрес и его длина префикса, разделенных символом / (например 192.168.1.90/24). Эта опция обязательна, если не используется DHCP

[Route] раздел
Большинство общих ключ в разделе [Route]:
Gateway= это адрес шлюза вашей машины. Эта опция обязательна если не используется DHCP.
Обратитесь к systemd.network(5) для исчерпывающего списка ключей.
Офтопик
Совет: you can put the Address= and Gateway= keys in the [Network] section as a short-hand if Address= contains only an Address key and Gateway= section contains only a Gateway key
Файлы NetDev
Эти файлы будут создавать виртуальные сетевые устройства.
Ниже приводится основная структура файла Mydevice.netdev:

/etc/systemd/network/MyDevice.netdev

Код: Выделить всё

[Match]
вертикальный список ключей

[NetDev]
вертикальный список ключей
[Match] раздел
Большинство общих ключ в Host= и Virtualization=

[Netdev] раздел
Наиболее распространенные ключи:
  • Name= это имя интерфейса, используемое при создании netdev. Эта опция обязательна
  • Kind= это вид netdev. Например, поддерживаются: bridge, bond, vlan, veth, sit, и т.д. Эта опция обязательна
Чтобы увидеть исчерпывающий перечень ключей, обратитесь к странице справочного руководства systemd.netdev(5)

Файлы link
Эти файлы являются альтернативой пользовательским правилам udev и будут применяться при как появлении устройства.
Ниже приводится основная структура файла МоеУстройство.link:
/etc/systemd/network/МоеУстройство.link

Код: Выделить всё

[Match]
вертикальный список ключей

[Link]
вертикальный список ключей
Раздел [Match] будет определять, если данный связующий файл может быть применён к данному устройству, когда раздел [Link] определяет настройку устройства.

[Match] раздел
Наиболее распространенные ключи MACAddress=, Host= и Virtualization=.
Type= тип устройства (например vlan)

[Link] раздел
Наиболее распространенные ключи:
MACAddressPolicy= либо persistent когда оборудование имеет постоянный MAC-адрес (должно быть на большинстве аппаратных) или random, который даёт случайный MAC-адрес устройства.
MACAddress= должен использоваться, когда не указан MACAddressPolicy=
Офтопик
Примечание: Системе, как правило, /usr/lib/systemd/network/99-default.link достаточно для большинства случаев.
Использование с контейнерами
Служба доступна с systemd >= 210. Хотите сипользовать #Основы использования systemctl|включение и запуск systemd-networkd.service на хосте и контейнере.
Для отладки, настоятельно рекомендуется установить пакеты bridge-utils, net-tools и iproute2.
Если вы используете systemd-nspawn, вам, возможно, потребуется изменить systemd-nspawn@.service и добавить параметры загрузки в строку ExecStart. Для исчерпывающего списка варианттов, обратитесь к systemd-nspawn(1). Обратите внимание, если вы хотите, использовать автоматическую настройку DNS от DHCP, то Вам необходимо включить systemd-resolved и символьную ссылку /run/systemd/resolve/resolv.conf на /etc/resolv.conf. Для большей информации, смотрите systemd-resolved.service(8).
Офтопик
Совет: Before you start to configure your container network, it is useful to:
  • disable all your netctl services. This will avoid any potential conflicts with systemd-networkd and make all your configurations easier to test. Furthermore, odds are high you will end with few or even no netctl activated profiles. The netctl list command will output a list of all your profiles, with the activated one being starred.
  • disable the systemd-nspawn@.service and use the systemd-nspawn -bnD /path_to/your_container/ command as root to boot the container. To log off and shutdown inside the container systemctl poweroff is used as root. Once the network setting meets your requirements, enable and start systemd-nspawn@.service
  • disable the dhcpcd.service if enabled on your system, since it activates dhcpcd on all interfaces
  • make sure you have no netctl profiles activated in the container, and ensure that systemd-networkd.service is neither enabled nor started
  • make sure you do not have any iptables rules which can block traffic
  • * make sure packet forwarding is enabled if you want to let containers access the internet. Make sure that your .network file does not accidentally turn off forwarding because if you do not have a IPForward=1 setting in it, systemd-networkd will turn off forwarding on this interface, even if you have it enabled globally.
  • when the daemon is started the systemd networkctl command displays the status of network interfaces.
Офтопик
Примечание: For the set-up described below,
  • we will limit the output of the ip a command to the concerned interfaces
  • we assume the host is your main OS you are booting to and the container is your guest virtual machine
  • all interface names and IP addresses are only examples
Основная DHCP сеть
Такая настройка включит DHCP IP для хоста и контейнера. В этом случае, обе системы будут иметь одинаковый IP, поскольку они разделяют одни и те же интерфейсы.
/etc/systemd/network/MyDhcp.network

Код: Выделить всё

[Match]
Name=en*

[Network]
DHCP=ipv4
Когда, включен [broken link: invalid section] и запущен systemd-networkd.service в вашем контейнере.
Вы, конечно, можете заменить en* на полное имя вашего сетевого устройства, получив его на выходе команды ip link
на хосте и контейнере:
$ ip a

Код: Выделить всё

2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.72/24 brd 192.168.1.255 scope global enp7s0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever
По умолчанию имя хоста, полученное от DHCP-сервера будет использоваться в качестве переходного хоста.
Чтобы изменить его добавьте UseHostname=false в раздел [DHCPv4]
/etc/systemd/network/MyDhcp.network

Код: Выделить всё

[DHCPv4]
UseHostname=false
Если вы не хотите настраивать DNS в /etc/resolv.conf и хотите полагаться на DHCP для его настройки, вам нужно включить [broken link: invalid section] systemd-resolved.service и сделать символическую ссылку /run/systemd/resolve/resolv.conf на /etc/resolv.conf
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Для подробной информации смотрите systemd-resolved.service(8).

DHCP с двумя различными IP
Интерфейс моста
Создайте интерфейс виртуального мост
/etc/systemd/network/MyBridge.netdev

Код: Выделить всё

[NetDev]
Name=br0
Kind=bridge
На хосте и контейнере:
$ ip a

Код: Выделить всё

3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether ae:bd:35:ea:0c:c9 brd ff:ff:ff:ff:ff:ff
    
Обратите внимание что интерфейс br0 в списке, но не работает (DOWN).

Привязать Ethernet для моста
Измените /etc/systemd/network/MyDhcp.network, чтобы удалить DHCP, мосту необходим интерфейс для привязки не с IP, а также добавьте ключ, чтобы связать это устройство для BR0, давайте изменим свое название на одно более актуальное.
/etc/systemd/network/MyEth.network

Код: Выделить всё

[Match]
Name=en*

[Network]
Bridge=br0
Сетевой мост
Создание сетевого профиля для моста
/etc/systemd/network/MyBridge.network

Код: Выделить всё

[Match]
Name=br0

[Network]
DHCP=ipv4
Добавить опцию для загрузки контейнера
Поскольку мы хотим, дать выделенный IP для хоста и контейнера, мы должны Отключить сеть контейнера от хоста. Чтобы сделать это, добавьте опцию --network-bridge=br0 в вашу команду загрузки контейнера.
# systemd-nspawn --network-bridge=br0 -bD /path_to/my_container
Результат
на хосте
$ ip a

Код: Выделить всё

3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.87/24 brd 192.168.1.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever
6: vb-MyContainer: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether d2:7c:97:97:37:25 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d07c:97ff:fe97:3725/64 scope link 
       valid_lft forever preferred_lft forever
на контейнере
$ ip a

Код: Выделить всё

2: host0: <BROADCAST,MULTICAST,ALLMULTI,AUTOMEDIA,NOTRAILERS,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 5e:96:85:83:a8:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global host0
       valid_lft forever preferred_lft forever
    inet6 fe80::5c96:85ff:fe83:a85d/64 scope link 
       valid_lft forever preferred_lft forever
Уведомление
  • we have now one IP address for Br0 on the host, and one for host0 in the container
  • two new interfaces have appeared: vb-MyContainer in the host and host0 in the container. This comes as a result of the --network-bridge=br0 option. This option implies another option, --network-veth. This means a virtual Ethernet link has been created between host and container.
  • the DHCP address on host0 comes from the system /usr/lib/systemd/network/80-container-host0.network file.
на хосте
$ brctl show

Код: Выделить всё

bridge name	bridge id		STP enabled	interfaces
br0		8000.14dae9b57a88	no		enp7s0
							vb-MyContainer
Приведенный выше вывод команды подтверждает, что мы имеем мост с двумя переплетёнными/связанными интерфейсами.
на хосте
$ ip route

Код: Выделить всё

default via 192.168.1.254 dev br0 
192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.87
на контейнере
$ ip route

Код: Выделить всё

default via 192.168.1.254 dev host0 
192.168.1.0/24 dev host0  proto kernel  scope link  src 192.168.1.73
the above command outputs confirm we have activated br0 and host0 interfaces with an IP address and Gateway 192.168.1.254. The gateway address has been automatically grabbed by systemd-networkd
$ cat /run/systemd/resolve/resolv.conf

Код: Выделить всё

nameserver 192.168.1.254
Статические IP-сети
Установка статического IP для каждого устройства может быть полезна в случае развертывания веб-служб (например, FTP, HTTP, SSH). Each device will keep the same MAC address across reboots if your system /usr/lib/systemd/network/99-default.link file has the MACAddressPolicy=persistent option (it has by default). Thus, you will easily route any service on your Gateway to the desired device. First, we shall get rid of the system /usr/lib/systemd/network/80-container-host0.network file. To do it in a permanent way (e.g even after upgrades), do the following on container. This will mask the file /usr/lib/systemd/network/80-container-host0.network since files of the same name in /etc/systemd/network take priority over /usr/lib/systemd/network.
# ln -sf /dev/null /etc/systemd/network/80-container-host0.network
Then, enable and start systemd-networkd on your container.
The needed configuration files:
на хосте

Код: Выделить всё

/etc/systemd/network/MyBridge.netdev
/etc/systemd/network/MyEth.network
Измените MyBridge.network
/etc/systemd/network/MyBridge.network

Код: Выделить всё

[Match]
Name=br0

[Network]
DNS=192.168.1.254
Address=192.168.1.87/24
Gateway=192.168.1.254
на контейнере
/etc/systemd/network/MyVeth.network

Код: Выделить всё

[Match]
Name=host0

[Network]
DNS=192.168.1.254
Address=192.168.1.94/24
Gateway=192.168.1.254