systemd-networkd (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи systemd-networkd. Дата последней синхронизации: 11 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

systemd-networkd — системный демон для управления сетевыми настройками. Его задачей является обнаружение и настройка сетевых устройств по мере их появления, а также создание виртуальных сетевых устройств. Эта служба особенно полезна при работе со сложными сетевыми настройками контейнера systemd-nspawn или виртуальной машины, но вполне подойдёт и для простых соединений.

Основы использования

Пакет systemd входит в базовую установку Arch. В нём содержится всё необходимое для работы с проводной сетью. Беспроводные сетевые интерфейсы настраиваются специализированными утилитами вроде wpa_supplicant или iwd.

Службы и настройки

Чтобы включить systemd-networkd, запустите/включите службу systemd-networkd.service.

Примечание: Убедитесь, что в системе не запущены другие службы, имеющие доступ к изменению сетевых настроек — это может привести к конфликтам. Найдите такие службы командой systemctl --type=service и остановите их.

При необходимости можно также настроить systemd-resolved, который будет выполнять разрешение сетевых имён для прикладных приложений:

  • Некоторые пояснения насчёт того, как systemd-resolved работает с файлом resolv.conf, можно найти в статье systemd-resolved.
  • systemd-resolved необходим, если в .network-файлах заданы связанные с DNS параметры.
  • systemd-resolved необходим, если DNS-адреса будут выдаваться DHCP-сервером или через IPv6 router advertisements (параметры DHCP= и/или IPv6AcceptRA= в разделе [Network], а также UseDNS=yes (задано по умолчанию) в разделах [DHCPv4], [DHCPv6], [IPv6AcceptRA], см. systemd.network(5)).
  • Кроме того, systemd-resolved может использоваться и без systemd-networkd.

systemd-networkd-wait-online

Cлужба systemd-networkd-wait-online.service запускается автоматически при включении службы systemd-networkd.service. Это служба типа "oneshot", которая ожидает конфигурации доступа в сеть и начинает работу только после выполнения цели network-online.target (параметр WantedBy=network-online.target). См. также systemd#Запуск сервисов после подключения к сети.

По умолчанию systemd-networkd-wait-online.service ожидает получения информации о состоянии всех интерфейсов под управлением systemd-networkd, причем минимум на одном интерфейсе должно быть установлено рабочее подключение.

Если в вашей системе несколько интерфейсов, но некоторые не смогли подключиться к сети (например, Ethernet-интерфейс с двумя портами, но кабель воткнут только в один), запуск systemd-networkd-wait-online.service завершится неудачно по истечении тайм-аута в 2 минуты. Это может стать причиной неприятной паузы во время загрузки системы. Чтобы служба ожидала подключения любого интерфейса, а не всех, отредактируйте файл службы, добавив параметр --any к строке ExecStart:

/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any

Также можно настроить и другие параметры, например, ожидание включения конкретных интерфейсов и режим работы. Подробнее см. systemd-networkd-wait-online(8).

Примеры настроек

Настройки должны храниться в каталоге /etc/systemd/network в файлах с суффиксом .network. Подробнее смотрите #Файлы настроек и systemd.network(5).

systemd/udev автоматически назначает постоянные имена для обнаруженных Ethernet, WLAN и WWAN интерфейсов. Перечень интерфейсов можно увидеть командой networkctl list.

Чтобы изменения настроек вступили в силу необходимо будет перезапустить демон systemd-networkd.service.

Примечание:
  • Параметры в файлах настроек чувствительны к регистру.
  • В примерах ниже enp1s0 — проводной интерфейс, а wlp2s0 — беспроводной. Названия интерфейсов на вашей системе могут отличаться. Подробнее об именах интерфейсов см. Настройка сети#Сетевые интерфейсы.
  • Можно использовать подстановочные символы (wildcards), например Name=en* или Name=wl*.
  • Можно искать устройства по типу. Например, Type=ether для Ethernet, Type=wlan для Wi-Fi и Type=wwan для WWAN. Учтите, что Type=ether включает также виртуальные Ethernet-интерфейсы (veth*), что может оказаться нежелательно.
  • Если вы хотите отключить IPv6, то изучите статью IPv6#systemd-networkd.

Проводной интерфейс с DHCP

/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
DHCP=yes

Проводной интерфейс со статическим IP-адресом

/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1

Параметр Address= можно указать несколько раз, если необходимо настроить несколько IPv4 и IPv6 адресов. Подробнее смотрите #Файлы network и systemd.network(5).

Беспроводной интерфейс

Беспроводной сетевой интерфейс нужно предварительно настроить приложением вроде wpa_supplicant или iwd. После этого можно подключиться к беспроводной сети посредством systemd-networkd:

/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=yes

Если беспроводному интерфейсу назначен статический IP-адрес, то настройка полностью (за исключением названия интерфейса) совпадает с настройкой проводного интерфейса.

Для аутентификации в беспроводной сети можно использовать wpa_supplicant или iwd.

Проводные и беспроводные интерфейсы на одной машине

Когда в системе есть и проводной, и беспроводной интерфейсы, настройте директиву ядра metric, чтобы оно могло "на лету" определять, какой из интерфейсов использовать. В этом случае при отключении проводного соединения полного обрыва связи не произойдёт.

Ядро использует настройки метрик при выборе одного из возможных маршрутов для исходящих пакетов — например, при двух включённых сетевых интерфесах, проводном и беспроводном. Если вдруг одно из соединений прерывается, то второй вариант автоматически объявляется победителем. При этом полного разрыва соединения не происходит. Правда, для текущих процессов передачи данных не всегда всё так гладко, но, сторого говоря, это проблема другого уровня сетевой модели OSI.

Примечание: Параметр Metric используется для статических маршрутов, а RouteMetric — для динамической маршрутизации. Подробнее смотрите systemd.network(5).
/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
DHCP=yes

[DHCP]
RouteMetric=10
/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=yes

[DHCP]
RouteMetric=20

Переименование интерфейса

Файлы .link можно использовать для назначения интерфейсу нового имени вместо редактирования правил udev. Например, можно задать постоянное имя интерфейса для USB-to-Ethernet адаптера на основе его MAC-адреса, т.к. имена таким адаптерам обычно назначаются в зависимости от того, к какому USB-порту они подключены.

/etc/systemd/network/10-ethusb0.link
[Match]
MACAddress=12:34:56:78:90:ab

[Link]
Description=USB to Ethernet Adapter
Name=ethusb0
Примечание: Название пользовательского файла .link должно быть "меньше" (в лексическом смысле), чем название файла настроек по умолчанию 99-default.link. Например, название 10-ethusb0.link подходит, а ethusb0.link — нет.

Файлы настроек

Файлы настроек могут находиться в следующих каталогах (в порядке увеличения приоритета):

  • /usr/lib/systemd/network/ — системный сетевой каталог.
  • /run/systemd/network/ — runtime-каталог сетевых программ.
  • /etc/systemd/network/ — локальный каталог системного администрирования.

Существуют три типа файлов настройки.

  • Файлы .network — настройки (профили) сетевых интерфейсов.
  • Файлы .netdev — настройки (профили) виртуальных сетевых интерфейсов.
  • Файлы .link — настройки, которые использует менеджер устройств udev при обнаружении нового интерфейса.

Для этих файлов действуют следующие правила:

  • Профиль активируется, если совпали все условия в разделе [Match].
  • Если в разделе [Match] не указано ничего, то профиль применяется для всех устройств (можно сравнить с подстановочным символом *).
  • Файлы настроек сортируются по названиям и обрабатываются в лексическом порядке, независимо от каталога, в котором они расположены.
  • Файлы с одинаковыми названиями заменяют друг друга — в порядке приоритета каталогов, в которых они находятся.
Совет:
  • Файлы в каталоге /etc/systemd/network/ имеют приоритет перед системными файлами в /usr/lib/systemd/network/. Создайте в этом каталоге символическую ссылку на /dev/null, чтобы "замаскировать" системный файл.
  • systemd понимает значения 1, true, yes, on как логическое true, а 0, false, no, off — как false.

Файлы network

В network-файлах задаются сетевые настройки, чаще всего — для серверов и контейнеров.

Файлы .network могут содержать разделы [Match], [Link], [Network], [Address], [Route] и [DHCP]. Ниже приведены основные параметры для каждого раздела. Подробнее смотрите systemd.network(5).

[Match]

Наиболее распространенные ключи для поиска совпадающего устройства:

Параметр Описание Возможные значения Значение по умолчанию
Name= Поиск интерфейса по названию, например: en*. Символ ! в начале инвертирует результаты поиска. Разделённые пробелами названия интерфейсов (можно указывать шаблоны с подстановочными символами в стиле командной оболочки), логическое отрицание (!).
MACAddress= Поиск интерфейса по MAC-адресу, например: MACAddress=01:23:45:67:89:ab 00-11-22-33-44-55 AABB.CCDD.EEFF Разделённые пробелами MAC-адреса в шестнадцатеричном формате; в качестве внутреннего разделителя в адресах можно использовать двоеточия, дефисы и точки.
Host= Поиск по имени хоста или machine ID. Имя хоста (в том числе в виде шаблона), machine-id(5)
Virtualization= Проверка на работу в виртуальном окружении. Virtualization=false — для хост-системы, Virtualization=true — для работы в контейнере или виртуальной машине. Есть возможность проверить тип виртуализации и пространство имён пользователя (параметр private-users). булевские, логическое отрицание (!), тип (vm и container), реализация (qemu, kvm, zvm, vmware, microsoft, oracle, powervm, xen, bochs, uml, bhyve, qnx, openvz, lxc, lxc-libvirt, systemd-nspawn, docker, podman, rkt, wsl, proot, pouch, acrn), private-users

[Link]

Параметр Описание Допустимые значения Значение по умолчанию
MACAddress= Привязка аппаратного адреса к устройству. Полезно при подмене MAC-адреса. Полный MAC-адрес с двоеточием, дефисом или точкой в качестве разделителя
MTUBytes= Максимальный размер передаваемого пакета данных для данного интерфейса. Имейте в виду, что если для интерфейса включён IPv6 и задано значение MTU ниже 1280 (минимальный MTU для IPv6), то оно будет автоматически увеличено до этого значения. Большее значение MTU (например, при использовании jumbo frames) может повысить скорость передачи данных. Целое число; возможны суффиксы K, M, G для указания размерности (основание 1024)
Multicast= групповая передача для интерфейса(-ов). булевское ? не задокументировано ?

[Network]

Параметр Описание Допустимые значения Значение по умолчанию
DHCP= Поддержка DHCPv4- и/или DHCPv6-клиента. булевское, ipv4, ipv6. false
DHCPServer= Запуск сервера DHCPv4. булевское false
MulticastDNS= Поддержка multicast DNS. Если задать значение resolve, то включится только разрешение имён, но не регистрация и объявление хостов/служб. булевское, resolve false
DNSSEC= Поддержка DNSSEC. Если задать значение allow-downgrade, то DNSSEC будет автоматически отключаться в не-DNSSEC сетях, что повысит совместимость. булевское, allow-downgrade false
DNS= Адрес DNS-сервера. Может указываться больше одного раза. inet_pton(3)
Domains= Список доменов, которые должны разрешаться с использованием DNS-сервера (подробнее). имя домена (в том числе с символом (~) в начале)
IPForward= Пересылка входящих пакетов на другой интерфейс в соответствии с таблицей маршрутизации. Подробнее см. Раздача интернета#Разрешите пересылку пакетов. булевское, ipv4, ipv6 false
IPMasquerade= Если опция включена, то при пересылке пакетов IP-адрес источника подменяется адресом локального сетевого интерфейса. Неявно подразумевает IPForward=ipv4, IPForward=ipv6 или IPForward=yes. ipv4, ipv6, both, no no
IPv6PrivacyExtensions= Использование временных IPv6-адресов в соответствии с RFC 4941. Если задать значение prefer-public, то privacy extensions включатся, но предпочтение будет отдаваться использованию публичных адресов, а не временных. Если задать значение kernel, то будут использоваться настройки ядра. булевское, prefer-public, kernel false

[Address]

Параметр Описание Допустимые значения Значение по умолчанию
Address= Можно настроить несколько адресов, указав этот ключ несколько раз. Опция обязательна, если не используется DHCP. Если указать значение 0.0.0.0 (для IPv4) или :: (для IPv6), то будет выделен неиспользуемый блок адресов заданного размера. сатические адреса IPv4 и IPv6 с длиной префикса (см. inet_pton(3))

[Route]

  • Gateway= — адрес шлюза. Если не используется DHCP, то эта опция обязательна.
  • Destination= — префикс сети назначения.

Если параметр Destination не задан, то используется маршрут по умолчанию.

Совет: Если в разделах [Address] и [Route] заданы только параметры Address= и Gateway= соответственно, то для краткости оба эти параметра можно перенести в раздел [Network].

[DHCP]

Параметр Описание Допустимые значения Значение по умолчанию
UseDNS= Объявление DNS-сервера при работе DHCP-сервера. булевское true
Anonymize= Если задать значение true, посылаемые DHCP-серверу параметры будут соответствовать RFC:7844 (Anonymity Profiles for DHCP Clients) для сокрытия идентифицирующей информации. булевское false
UseDomains= Использование полученного от DHCP-сервера домена в качестве адреса для DNS-поиска. Если задать значение route, полученное доменное имя будет использоваться только для маршрутизации DNS-запросов, но не для поиска. Эта опция может повлиять на локальное разрешение имён с помощью systemd-resolved. булевское, route false

[DHCPServer]

Ниже приведён пример настройки DHCP-сервера с hostapd, выступающего в качестве беспроводной точки доступа. Параметр IPMasquerade включает правила межсетевого экрана для NAT, а также автоматически включает IPForward=ipv4, что разрешает пересылку пакетов.

/etc/systemd/network/wlan0.network
[Match]
Name=wlan0

[Network]
Address=10.1.1.1/24
DHCPServer=true
IPMasquerade=true

[DHCPServer]
PoolOffset=100
PoolSize=20
EmitDNS=yes
DNS=9.9.9.9

Файлы netdev

В файлах netdev описывается создание виртуальных сетевых интерфейсов. В нём два раздела, [Match] и [NetDev]. Ниже приведены некоторые важные параметры. Подробнее смотрите systemd.netdev(5).

[Match]

  • Host= — поиск по имени хоста.
  • Virtualization= — проверка на работу в виртуальном окружении.

[Netdev]

Наиболее распространенные ключи:

  • Name= — имя интерфейса. Опция обязательна.
  • Kind= — вид интерфейса. Например, bridge, bond, vlan, veth, sit и т.д. Опция обязательна.

Файлы link

Файлы link выступают в качестве альтернативы пользовательским правилам udev и применяются при обнаружении менеджером нового устройства. Файл состоит из двух разделов, [Match] и [Link]. Ниже приведены основные параметры обоих разделов. Подробнее смотрите systemd.link(5).

Совет: Для выявления проблем с .link-файлами используйте команду # udevadm test-builtin net_setup_link /sys/путь/к/сетевому/устройству .

[Match]

  • MACAddress= — поиск по MAC-адресу.
  • Host= — поиск по имени хоста.
  • Virtualization= — проверка на виртуализацию.
  • Type= — поиск по типу интерфейса (например, vlan).

[Link]

  • MACAddressPolicy= — использование постоянных или же случайных адресов.
  • MACAddress= — использование конкретного адреса.
  • NamePolicy= — политики выбора и назначения имён интерфейсов, например, kernel, keep и т.д.
Примечание: Настроек в системном файле /usr/lib/systemd/network/99-default.link, как правило, в большинстве случаев вполне достаточно.

Использование с контейнерами

systemd-networkd предоставляет полную сетевую конфигурацию для контейнеров systemd-nspawn, запущенных как на хостовой системе, так и внутри другого контейнера. Подробнее см. systemd-nspawn#Networking

В примерах ниже:

  • вывод команды ip a будет ограничен только рассматриваемыми интерфейсами.
  • хост будет означать вашу основную ОС, а контейнер — гостевую виртуальную машину.
  • все названия сетевых интерфейсов и IP-адреса приведены в качестве примера.

Сетевой мост с DHCP

Интерфейс моста

Первым делом необходимо создать виртуальный интерфейс моста. С помощью systemd создаём устройство-мост br0:

/etc/systemd/network/мой_мост.netdev
[NetDev]
Name=br0
Kind=bridge

Перезапустите systemd-networkd.service, чтобы настройки вступили в силу.

Совет: systemd-networkd генерирует MAC-адрес на основе названия интерфейса и идентификатора машины (machine ID) и привязывает его к мосту. Это может создать проблемы, например, при маршрутизации с фильтрацией по MAC-адресам. Чтобы избежать такого рода проблем, привязку MAC-адреса моста (возможно, совпадающего с MAC-адресом физического устройства) необходимо выполнить с помощью строки MACAddress=xx:xx:xx:xx:xx:xx в разделе NetDev в примере выше.

Чтобы увидеть новый мост на хосте или в контейнере, выполните:

$ 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 к мосту

Следующий шаг — выполнить привязку реального сетевого интерфейса к виртуальному мосту. В примере ниже мы привязываем любой интерфейс, название которого совпадает с шаблоном en*.

/etc/systemd/network/привязка.network
[Match]
Name=en*

[Network]
Bridge=br0

Выбранному проводному интерфейсу не должно быть назначено никакого IP-адреса, поскольку для привязки необходим интерфейс без оного. Если необходимо, отредактируйте файл /etc/systemd/network/мой_Eth.network соответствующим образом.

Сеть моста

Теперь, поскольку мост создан и привязан к существующему сетевому интерфейсу, необходимо создать настройки IP. Это определяется в файле .network:

/etc/systemd/network/мой_мост.network
[Match]
Name=br0

[Network]
DHCP=ipv4

Настройка контейнера

Используйте параметр --networkd-bridge=br0 при запуске контейнера. Подробнее см. systemd-nspawn#Use a network bridge.

Результат

  • для хоста
$ 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-мой_контейнер: <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

Замечания

  • теперь задан один IP-адрес для интерфейса br0 на хосте, и один для интерфейса host0 в контейнере.
  • появилось два новых интерфейса: vb-мой_контейнер на хосте и host0 в контейнере. Это результат опции --network-bridge=br0 (см. systemd-nspawn#Use a network bridge).
  • DHCP-адрес интерфейса host0 был выдан на основании файла /usr/lib/systemd/network/80-container-host0.network.
  • на хосте
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.14dae9b57a88	no		enp7s0
							vb-мой_контейнер

Выше показано, что в системе есть мост с двумя связанными интерфейсами.

  • на хосте
$ 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

А здесь видно, что были активированы интерфейсы br0 и host0 с отдельными IP-адресами и шлюзом по умолчанию 192.168.1.254. Адрес шлюза был автоматически назначен systemd-networkd.

Сетевой мост со статическими IP-адресами

Настройка статического IP-адреса может быть удобной в случае развёртывания веб-сервисов (например, FTP, http, SSH). Если в файле /usr/lib/systemd/network/99-default.link задан параметр MACAddressPolicy=persistent (значение по умолчанию), то устройствам будут назначены постоянные MAC-адреса. Следовательно, будет несложно настроить маршрутизацию сервисов от шлюза на разные интерфейсы.

Выполните следующие настройки:

  • на хосте

Настройка очень похожа на настройку #Сетевой мост с DHCP. Во-первых, нужно создать виртуальный мост и привязать к нему физический интерфейс. Эта делается с помощью двух файлов настроек, содержание которых аналогично файлам из раздела о DHCP.

/etc/systemd/network/мой_мост.netdev
/etc/systemd/network/мой_Eth.network

Далее, необходимо настроить IP и DNS для моста. Пример настройки:

/etc/systemd/network/мой_мост.network
[Match]
Name=br0

[Network]
DNS=192.168.1.254
Address=192.168.1.87/24
Gateway=192.168.1.254
  • на контейнере

Чтобы настроить статический IP-адрес для контейнера, необходимо заместить системный файл /usr/lib/systemd/network/80-container-host0.network, который содержит настройки DHCP для сетевого интерфейса host0 контейнера. Для этого нужно поместить настройки в файл /etc/systemd/network/80-container-host0.network. Например:

/etc/systemd/network/80-container-host0.network
[Match]
Name=host0

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

Не забудьте проверить, что служба systemd-networkd.service в контейнере включена.

Советы и рекомендации

Интеграция сетевого интерфейса и рабочего стола

Systemd-networkd не имеет встроенной функциональности для интерактивного управления сетевыми интерфейсами, ни через графическое приложение, ни через командную оболочку. Тем не менее, существует ряд утилит для отображения состояния сети, изменения настроек или получения уведомлений.

  • Утилита командной строки networkctl позволяет вывести информацию о сетевых интерфейсах.
  • Когда networkd настраивается с помощью wpa_supplicant, утилитами wpa_cli и wpa_gui можно динамически настраивать WLAN-интерфейсы.
  • Плагин networkd-notify-gitAUR выводит уведомления при изменениях в работе интерфейса (например, при установлении соединения или его завершении).
  • Демон networkd-dispatcherAUR позволяет выполнять сценарии при изменении состояния интерфейса. Работает схожим образом с NetworkManager-dispatcher.
  • Отобразить информацию о DNS-сервере для systemd-resolved можно командой resolvectl status.

Назначение IP-адреса на основании SSID

Может возникнуть ситуация, когда дома вы используете беспроводную сеть с DHCP, а на работе — беспроводную же сеть, но со статическим IP-адресом. Пример смешанных настроек приведён ниже.

Примечание: Номер в начале имени файла определяет порядок, в котором они будут обрабатываться. В разделе [Match] можно использовать параметры SSID, BSSID или оба одновременно.
/etc/systemd/network/24-wireless-office.network
# отдельные настройки для сети WiFi на работе
[Match]
Name=wlp2s0
SSID=название_точки_доступа
#BSSID=aa:bb:cc:dd:ee:ff

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8
/etc/systemd/network/25-wireless-dhcp.network
# для остальных сетей используется DHCP
[Match]
Name=wlp2s0

[Network]
DHCP=ipv4

Объединение проводного и беспроводного интерфейсов

См. также Wireless bonding.

Объединение интерфейсов (bonding) позволяет использовать для одного Интернет-соединения несколько сетевых интерфейсов. Если затем, например, проводной сетевой интерфейс по какой-то причине отключится, соединение будет перенаправлено на беспроводной.

Создайте объединённый интерфейс. В качестве режима работы необходимо указать active-backup, чтобы пакеты направлялись на запасной сетевой интерфейс, если основной будет отключён.

/etc/systemd/network/30-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
PrimaryReselectPolicy=always
MIIMonitorSec=1s

Укажите проводной интерфейс в качестве основного:

/etc/systemd/network/30-ethernet-bond0.network
[Match]
Name=enp0s25

[Network]
Bond=bond0
PrimarySlave=true

Беспроводной интерфейс будет запасным:

/etc/systemd/network/30-wifi-bond.network
[Match]
Name=wlan0

[Network]
Bond=bond0

Объединённый интрефейс необходимо настроить так же, как настраивается обычный сетевой интерфейс:

/etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
DHCP=ipv4

Теперь, если Ethernet-интерфейс будет отключён, соединение сохранится по беспроводной сети:

$ networkctl
IDX LINK    TYPE     OPERATIONAL      SETUP     
  1 lo      loopback carrier          unmanaged 
  2 enp0s25 ether    no-carrier       configured
  3 bond0   bond     degraded-carrier configured
  5 wlan0   wlan     enslaved         configured

4 links listed.

Ускорение TCP Slow Start

В сетях с большой пропускной способностью и значительной величиной задержки (для домашнего интернета — выше 10 Мбит/с) стандартные значения для алгоритма TCP Slow Start являются довольно консервативными. Это приводит к тому, что загрузки начинаются медленно и проходит несколько секунд, прежде чем будет задействована вся доступная пропускная способность. Особенно это заметно при обновлениях пакетов в pacman, когда загрузка каждого отдельного пакета успевает завершиться до достижения максимальной скорости для данного соединения.

Настройки TCP позволяют увеличить начальный размер окна, в результате чего соединения будут "ускоряться" быстрее [1]. Для медленных соединений это часто приводит к замедлению передачи, поскольку приходится передавать заново большое количество потерянных пакетов, но при наличии достаточной пропускной способности производительность вырастет.

Очень важно провести тестовые замеры до и после изменения значений, чтобы убедиться, что вы повысили скорость, а не уменьшили её. Если вы не замечаете, что ваши загрузки начинаются медленно, то скорее всего, текущие значения являются оптимальными для вашего соединения. При тестах следует использовать как быстрый, так и медленный удалённый сервер, чтобы убедиться, что вы не ускорили доступ к быстрым машинам, при этом сделав доступ к медленным серверам ещё медленнее.

Отредактируйте .network-файл для соединения:

/etc/systemd/network/eth0.network
[Match]
Name=eth0

#[Network]
#Gateway=...  <-- Удалите это значение, если оно задано, и поместите в строку Gateway= ниже

[Route]
# Применяется только к шлюзам с DHCP. Если вы вручную выбрали шлюз,
# то укажите его.
Gateway=_dhcp4

# Стандартное значение — 10. Это множитель для MSS (1460 байт).
InitialCongestionWindow=10
InitialAdvertisedReceiveWindow=10

Стандартное значение 10 хорошо работает для сетей меньше 10 Мбит/с. Для соединений 100 Мбит/с подойдёт значение 30. Если верить systemd.network(5) § [ROUTE] SECTION OPTIONS, значение 100 будет уже чрезмерным.

Если параметр sysctl net.ipv4.tcp_slow_start_after_idle включён, то соединение будет возвращаться к этим начальным настройкам после некоторого простоя (иногда довольно небольшого). Если этот параметр отключён, соединение будет работать с большим размером окна, если оно было согласовано при передаче пакетов. Вне зависимости от значения этого параметра, каждое TCP-соединение будет начинать со значений в параметрах Initial*.

Параметр sysctl net.ipv4.tcp_congestion_control не относится напрямую к этим значениям, но он управляет перегрузками и размером окна получателя, особенно при перегрузке канала связи, что обычно выливается в уменьшение пропускной способности. Значения Initial* задают стандартные значения окна для каждого соединения, до того, как алгоритм управления перегрузками возьмет управление на себя и изменит их под текущие потребности. Более высокие значения позволят ускорить процесс согласования, пока алгоритм перегрузок пытается найти оптимальное значение. Наоборот, задание неправильных значений усложняет согласование и работу алгоритма управления перегрузками, замедляя каждое TCP-соединение на несколько дополнительных секунд.

Смотрите также