NetworkManager (Русский)
NetworkManager — это программа для обнаружения и настройки систем для автоматического подключения к сетям. Функциональность NetworkManager может быть полезна как для беспроводных, так и проводных сетей. При подключении к беспроводным сетям NetworkManager отдаёт предпочтение ранее известным сетям и имеет возможность переключаться на наиболее стабильную сеть. Приложения, поддерживающие NetworkManager, могут переключаться из онлайн-режима в автономный. NetworkManager также предпочитает проводные соединения беспроводным, поддерживает модемные соединения и некоторые типы VPN. NetworkManager изначально был разработан компанией Red Hat, а в настоящее время поддерживается проектом GNOME.
Установка
Установите пакет networkmanager, который содержит демон, консольный инструмент nmcli
и интерфейс nmtui
на основе curses.
Включение NetworkManager
После установки запустите и включите службу NetworkManager.service
. После запуска NetworkManager автоматически подключится ко всем «системным соединениям», которые уже были заранее настроены в системе. «Пользовательские соединения» настраиваются и подключаются через nmcli или апплет.
- Каждый сетевой интерфейс должен управляться только одним DHCP-клиентом или сетевым менеджером, поэтому рекомендуется запускать в системе только один DHCP-клиент или сетевой менеджер. Вы можете посмотреть список запущенных служб командой
systemctl --type=service
и затем остановить или перенастроить конфликтующие. - Если systemd-resolved не запущен, вы получите кучу ошибок в журнале. Подробнее смотрите #Unit dbus-org.freedesktop.resolve1.service not found.
Дополнительные интерфейсы
- nm-connection-editor предоставляет графический интерфейс,
- network-manager-applet предоставляет апплет для трея (
nm-applet
).
Поддержка мобильной сети
NetworkManager использует ModemManager для подключения к мобильным сетям.
Установите пакеты modemmanager и usb_modeswitch. Затем запустите и включите службу ModemManager.service
.
Может понадобиться перезапустить NetworkManager.service
, чтобы он обнаружил ModemManager. После перезапуска переподключите модем, и он должен обнаружиться.
При добавлении нового соединения (например через nm-connection-editor) выберите «Мобильное широкополосное подключение». После выбора оператора и тарифного плана остальные настройки (в частности APN) должны заполниться автоматически на основе информации из mobile-broadband-provider-info.
Поддержка PPPoE / DSL
Установите пакет ppp и добавьте новое соединение через nm-connection-editor
.
Поддержка VPN
С версии 1.16 NetworkManager поддерживает WireGuard, нужен лишь модуль ядра wireguard
. Подробности читайте в посте в блоге.
Поддержка других VPN осуществляется через систему плагинов. Доступны следующие пакеты:
- networkmanager-openconnect для OpenConnect
- networkmanager-openvpn для OpenVPN
- networkmanager-pptp для клиента PPTP
- networkmanager-strongswan для strongSwan
- networkmanager-vpnc
- networkmanager-fortisslvpnAUR
- networkmanager-iodine-gitAUR
- networkmanager-libreswanAUR
- networkmanager-l2tp
- networkmanager-ssh-gitAUR
- network-manager-sstp
- Чтобы DNS полноценно работал при использовании VPN, вам может понадобиться настроить условное перенаправление.
- Некоторые плагины могут не иметь интерфейса для командной строки или вообще не работать без запущенного апплета для трея. Это обычно не проблема при использовании среды рабочего стола, но если вы её не используете, запускайте #nm-applet вручную при работе с VPN-соединениями, чтобы плагин мог отобразить все необходимые для соединения диалоговые окна, такие как запрос пароля.
Использование
NetworkManager поставляется с командами nmcli(1) и nmtui(1).
Примеры nmcli
Посмотреть список доступных сетей Wi-Fi:
$ nmcli device wifi list
Подключиться к сети Wi-Fi:
$ nmcli device wifi connect SSID_или_BSSID password пароль
Подключиться к скрытой сети Wi-Fi:
$ nmcli device wifi connect SSID_или_BSSID password пароль hidden yes
Подключиться к Wi-Fi на интерфейсе wlan1
:
$ nmcli device wifi connect SSID_или_BSSID password пароль ifname wlan1 имя_профиля
Отключить сетевой интерфейс:
$ nmcli device disconnect ifname eth0
Получить список соединений с их именами, UUID, типами и используемыми устройствами:
$ nmcli connection show
Активировать соединение (то есть подключиться к сети с существующим профилем):
$ nmcli connection up имя_или_uuid
Удалить соединение:
$ nmcli connection delete имя_или_uuid
Посмотреть список сетевых устройств и их состояние:
$ nmcli device
Отключить Wi-Fi:
$ nmcli radio wifi off
Изменение соединения
Полный список параметров можно посмотреть в nm-settings(5).
Сперва получите список соединений:
$ nmcli connection
NAME UUID TYPE DEVICE Проводное соединение 2 e7054040-a421-3bef-965d-bb7d60b7cecf ethernet enp5s0 Проводное соединение 1 997f2782-f0fc-301d-bfba-15421a2735d8 ethernet enp0s25 MY-HOME-WIFI-5G 92a0f7b3-2eba-49ab-a899-24d83978f308 wifi --
Имя, указанное в первом столбце, можно использовать в качестве идентификатора соединения. Здесь для примера используем Проводное соединение 2
.
Есть три способа настройки соединения после его создания:
- Интерактивный редактор nmcli
nmcli connection edit 'Проводное соединение 2'
.
В редакторе есть хорошая встроенная документация на русском языке.
- Интерфейс командной строки nmcli
nmcli connection modify 'Проводное соединение 2' параметр.свойство значение
. Для использования смотрите nmcli(1). Например, изменить метрику маршрута IPv4 на 200 можно с помощью командыnmcli connection modify 'Проводное соединение 2' ipv4.route-metric 200
.
Для удаления настройки укажите пустое значение (""):
nmcli connection modify 'Проводное соединение 2' параметр.свойство ""
- Файл соединения
- В каталоге
/etc/NetworkManager/system-connections/
измените соответствующий файлПроводное соединение 2.nmconnection
.
Не забудьте перезагрузить настройки командойnmcli connection reload
.
nmtui
В состав NetworkManager входит программа с текстовым интерфейсом (TUI) для управления соединениями, настройки имени хоста и управления беспроводными картами. Запустить её можно командой nmtui
.
Фронтенды
Для интеграции со средой рабочего стола обычно используют апплет в трее. Он предоставляет не только лёгкий доступ к настройкам сети, но и агент для хранения паролей. Многие среды рабочего стола имеют свои собственные апплеты; если в вашей среде его нет, вы можете использовать #nm-applet.
GNOME
В GNOME есть свой собственный инструмент, доступный в настройках сети.
KDE Plasma
Установите пакет plasma-nm и добавьте виджет сети на панель задач.
nm-applet
network-manager-applet — фронтенд на базе GTK 3, который работает в окружениях Xorg как значок в трее.
Для сохранения паролей установите и настройте приложение, реализующее Secret Service D-Bus API: например, GNOME Keyring, KDE Wallet или KeePassXC.
Имейте в виду, что после включения флажка Все пользователи могут подключаться к этой сети NetworkManager сохраняет пароль открытым текстом, хотя соответствующий файл доступен только для root (или других пользователей через nm-applet
). Смотрите #Шифрование паролей Wi-Fi.
Для запуска nm-applet
без панели задач можно использовать trayer или stalonetray. Например, вы можете сделать такой скрипт:
nmgui
#!/bin/sh nm-applet 2>&1 > /dev/null & stalonetray 2>&1 > /dev/null killall nm-applet
После закрытия окна stalonetray он автоматически завершит nm-applet
.
Апплет может уведомлять о событиях, таких как как подключение к сети Wi-Fi или отключение от неё. Чтобы эти уведомления отображались, убедитесь, что у вас установлен сервер уведомлений — смотрите статью Desktop notifications (Русский). Если вы используете апплет без сервера уведомлений, вы можете увидеть некоторые сообщения в stdout/stderr, и апплет может зависнуть. Смотрите .
Запустить nm-applet
с отключенными уведомлениями можно так:
$ nm-applet --no-agent
nm-applet
может быть запущен автоматически с помощью desktop-файла автозапуска. В этом случае для добавления опции --no-agent
измените строку Exec в этом файле:
Exec=nm-applet --no-agent
--no-agent
, не позволит подключиться к защищённой сети Wi-Fi, так как не сможет запросить пароль. В журнале будет ошибка no secrets: No agents were available for this request
.Appindicator
С версии 1.18.0 в официальном пакете network-manager-applet появилась поддержка Appindicator. Для использования Appindicator добавьте соответствующий параметр:
$ nm-applet --indicator
networkmanager-dmenu
Ещё вариант — networkmanager-dmenu-gitAUR, небольшой скрипт для управления соединениями NetworkManager через dmenu или rofi вместо nm-applet
. Он предоставляет все основные функции, такие как подключение к существующим Wi-Fi или проводным соединениям NetworkManager, подключение к новым Wi-Fi соединениям, запрос пароля по необходимости, подключение к существующим VPN соединениям, включение/выключение сети, запуск nm-connection-editor, подключение к Bluetooth-сетям.
switchboard
switchboard из Pantheon предлагает способ настройки NetworkManager, не зависящий от среды рабочего стола, в сочетании с switchboard-plug-network и nm-connection-editor. Его можно запустить командой:
$ io.elementary.settings
Настройка
NetworkManager требует некоторых дополнительных шагов для правильной работы. Убедитесь, что вы настроили /etc/hosts
как описано в разделе Настройка сети#Имя хоста.
Глобальный файл настроек — /etc/NetworkManager/NetworkManager.conf
. Дополнительные файлы можно добавить в каталог /etc/NetworkManager/conf.d/
. Обычно менять их не требуется.
После изменения файлов настроек нужно применить изменения:
# nmcli general reload
NetworkManager-wait-online
Включение NetworkManager.service
автоматически включает NetworkManager-wait-online.service
— oneshot-службу, которая ждёт окончания настройки сети. У неё есть WantedBy=network-online.target
, так что она завершится только когда сам network-online.target
будет включен или задействован каким-то другим юнитом. Смотрите также systemd (Русский)#Запуск сервисов после подключения к сети.
По умолчанию NetworkManager-wait-online.service
ждёт не появления сети, а завершения загрузки NetworkManager (смотрите nm-online(1)). Если она завершится до реального появления сети, это может привести к проблемам запуска других служб, зависимых от сети. Для решения проблемы создайте drop-in файл для этого юнита, чтобы убрать параметр -s
из строки ExecStart
:
[Service] ExecStart= ExecStart=/usr/bin/nm-online -q
Однако это может привести к другим проблемам.
Иногда служба по-прежнему не запускается при загрузке из-за слишком маленького таймаута. Отредактируйте службу, прописав для NM_ONLINE_TIMEOUT
вместо 60
значение побольше.
Настройка разрешений PolicyKit
По умолчанию пользователи в активных локальных сеансах могут редактировать большинство сетевых настроек без пароля. Проверьте тип сеанса как описано в разделе Устранение часто встречающихся неполадок#Разрешения сессии. В большинстве случаев всё должно работать из коробки.
Некоторые действия (например, изменение имени хоста системы) требуют пароля администратора. В этом случае вам нужно добавить себя в группу wheel
и запустить агент аутентификации Polkit, который будет запрашивать пароль.
Для удалённых сеансов (например, headless VNC) у вас есть несколько вариантов получения привилегий, необходимых для работы с NetworkManager:
- Добавить себя в группу
wheel
. Вам нужно будет вводить свой пароль при каждом действии. Имейте в виду, что эта группа также может предоставлять другие разрешения, такие как возможность использовать sudo без ввода пароля root. - Добавить себя в группу
network
и создать файл/etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules
со следующим содержимым:polkit.addRule(function(action, subject) { if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("network")) { return polkit.Result.YES; } });
Все пользователи в группеnetwork
смогут добавлять и удалять сети без пароля (что означает, что вам не понадобится запускать агент аутентификации Polkit, так что этот вариант работает в том числе через SSH).
Настройки прокси
NetworkManager поддерживает некоторые настройки прокси. Хотя их нельзя изменить напрямую через nmtui, nm-applet и nmcli поддерживают их. Смотрите настройки прокси в nm-settings-nmcli(5).
Кроме того, пользовательские команды прокси всегда можно запустить с помощью диспетчерских скриптов; смотрите раздел #Примеры диспетчерских скриптов.
Смотрите также Proxy settings.
Проверка соединения
NetworkManager может попытаться связаться с веб-сервером после подключения к сети, чтобы определить, находится ли он, например, за captive portal. По умолчанию для проверки используется ping.archlinux.org (это CNAME-псевдоним для redirect.archlinux.org, прописан в файле /usr/lib/NetworkManager/conf.d/20-connectivity.conf
). Если вы хотите прописать другой адрес, создайте файл /etc/NetworkManager/conf.d/20-connectivity.conf
, смотрите NetworkManager.conf(5) § CONNECTIVITY SECTION. Пример использования серверов GNOME (использовать сам GNOME при этом необязательно):
/etc/NetworkManager/conf.d/20-connectivity.conf
[connectivity] uri=http://nmcheck.gnome.org/check_network_status.txt
Чтобы отключить проверку соединения NetworkManager, используйте следующую конфигурацию. Это может быть полезно при подключении к VPN, которая блокирует проверки соединения.
/etc/NetworkManager/conf.d/20-connectivity.conf
[connectivity] enabled=false
Captive portal
При использовании сетей, в которых используется captive portal, среда рабочего стола может автоматически открыть окно с запросом учётных данных. Если ваша среда этого не делает, вы можете использовать capnet-assist (однако на данный момент в нём сломан диспетчерский скрипт). В качестве альтернативы можно создать свой диспетчерский скрипт:
/etc/NetworkManager/dispatcher.d/90-open_captive_portal
#!/bin/sh -e # Script to dispatch NetworkManager events # # Runs shows a login webpage on walled garden networks. # See NetworkManager(8) for further documentation of the dispatcher events. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin if [ -x "/usr/bin/logger" ]; then logger="/usr/bin/logger -s -t captive-portal" else logger=":" fi wait_for_process() { PNAME=$1 while [ -z "$(/usr/bin/pgrep $PNAME)" ]; do sleep 3; done } #launch the browser, but on boot we need to wait that nm-applet starts start_browser() { local user="$1" local display="$2" export DISPLAY="$display" wait_for_process nm-applet export XAUTHORITY="/home/$user/.Xauthority" $logger "Running browser as '$user' with display '$display' to login in captive portal" sudo -u "$user" --preserve-env=DISPLAY,XAUTHORITY -H xdg-open http://capnet.elementary.io 2>&1 > /dev/null } # Run the right scripts case "$2" in connectivity-change) $logger -p user.debug "dispatcher script triggered on connectivity change: $CONNECTIVITY_STATE" if [ "$CONNECTIVITY_STATE" = "PORTAL" ]; then # Match last column of who's output with ' :[at least one digit] ' who | awk '$NF ~ /\(:[0-9]+\)/ { print $1 " " substr($NF, 2, length($NF)-2) };' | \ while read user display; do start_browser $user $display || $logger -p user.err "Failed for user: '$user' display: '$display'" done fi ;; *) # In a down phase exit 0 ;; esac
Сделайте скрипт исполняемым. Он предполагает, что вы используете X, и просто открывает http-страницу. Это может сработать не для всех.
Перезапустите службу NetworkManager.service
или перезагрузитесь для применения изменений. После этого скрипт должен открыть страницу входа, как только обнаружит captive portal.
Простым решением является captive-portal-sh — скрипт, который получает адрес captive portal и открывает его в браузере по умолчанию (только для Wayland).
Ещё одно решение — captive-browser-gitAUR, основанное на Google Chrome.
Клиент DHCP
По умолчанию NetworkManager использует свой внутренний DHCP-клиент. Внутренний плагин DHCPv4 основан на nettools n-dhcp4, в то время как плагин DHCPv6 основан на коде из systemd-networkd.
Для использования другого клиента DHCP установите какую-нибудь альтернативу:
Для выбора клиента DHCP пропишите опцию main.dhcp=имя_клиента_dhcp
в каком-нибудь файле в каталоге /etc/NetworkManager/conf.d/
, например:
/etc/NetworkManager/conf.d/dhcp-client.conf
[main] dhcp=dhcpcd
Не включайте юниты, идущие в комплекте с пакетами dhclient и dhcpcd: они будут конфликтовать с NetworkManager. Смотрите примечание в разделе #Установка.
Управление DNS
Управление DNS в NetworkManager описано на вики-странице проекта GNOME: Projects/NetworkManager/DNS.
Кэширование DNS и условное перенаправление
NetworkManager имеет плагин для включения кэширования DNS и условного перенаправления (conditional forwarding, ранее известный как "split DNS") с использованием dnsmasq или systemd-resolved. Преимущества этого в том, что запросы DNS будут кэшироваться, что сокращает время резолвинга, а DNS-запросы для хостов VPN будут направляться на соответствующие DNS-серверы VPN. Это особенно полезно, если вы подключены к нескольким VPN.
/etc/resolv.conf
является символической ссылкой на /run/systemd/resolve/stub-resolv.conf
, /run/systemd/resolve/resolv.conf
, /lib/systemd/resolv.conf
или /usr/lib/systemd/resolv.conf
, NetworkManager автоматически использует systemd-resolved. Для использования dnsmasq сперва удалите эту ссылку и перезапустите NetworkManager.dnsmasq
Установите dnsmasq и пропишите main.dns=dnsmasq
в каком-нибудь файле в каталоге /etc/NetworkManager/conf.d/
:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=dnsmasq
Затем выполните nmcli general reload
от имени root. NetworkManager автоматически запустит dnsmasq и добавит 127.0.0.1
в /etc/resolv.conf
. Исходные DNS-серверы можно найти в файле /run/NetworkManager/no-stub-resolv.conf
. Вы можете проверить, используется ли dnsmasq, дважды выполнив один и тот же DNS-запрос с помощью drill example.com
и сравнив время запроса.
- Вам не нужно запускать
dnsmasq.service
или изменять/etc/dnsmasq.conf
. NetworkManager запустит dnsmasq без использования службы systemd и без чтения стандартных файлов настроек dnsmasq. - Экземпляр dnsmasq, который запускается NetworkManager'ом, будет принимать запросы на
127.0.0.1:53
, вы не можете запустить другие программы (в том числеdnsmasq.service
) на том же адресе и порту.
Пользовательская конфигурация dnsmasq
Свои настройки для dnsmasq можно добавить в каталог /etc/NetworkManager/dnsmasq.d/
. Например, для изменения размера кэша DNS (который находится в оперативной памяти):
/etc/NetworkManager/dnsmasq.d/cache.conf
cache-size=1000
Проверить синтаксис можно такой командой:
$ dnsmasq --test --conf-file=/dev/null --conf-dir=/etc/NetworkManager/dnsmasq.d
Смотрите список доступных опций в dnsmasq(8).
IPv6
Включение dnsmasq
в NetworkManager может сломать IPv6-only DNS lookups (т. е. drill -6 [hostname]
), которые без него работали бы. Чтобы решить эту проблему, создание следующего файла настроит dnsmasq на прослушивание IPv6 loopback:
/etc/NetworkManager/dnsmasq.d/ipv6-listen.conf
listen-address=::1
Кроме того, dnsmasq
также не определяет приоритеты upstream DNS IPv6. К сожалению, NetworkManager этого не делает (Ubuntu Bug). Обходной путь — отключить IPv4 DNS в конфигурации NetworkManager, если таковой существует.
DNSSEC
Экземпляр dnsmasq, который запускается NetworkManager'ом, по умолчанию не будет проверять DNSSEC, так как он запускается с параметром --proxy-dnssec
. Он будет доверять любой информации DNSSEC, полученной от вышестоящего DNS-сервера.
Чтобы dnsmasq правильно проверял DNSSEC, тем самым ломая разрешение DNS с серверами имён, которые его не поддерживают, создайте следующий файл настроек:
/etc/NetworkManager/dnsmasq.d/dnssec.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf dnssec
systemd-resolved
NetworkManager может использовать systemd-resolved в качестве распознавателя DNS и кэша. Перед использованием убедитесь, что systemd-resolved правильно настроен и что служба systemd-resolved.service
запущена.
NetworkManager автоматически будет использовать systemd-resolved, если файл /etc/resolv.conf
является символической ссылкой на /run/systemd/resolve/stub-resolv.conf
, /run/systemd/resolve/resolv.conf
или /usr/lib/systemd/resolv.conf
.
Вы можете включить его явно, добавив настройку main.dns=systemd-resolved
в какой-нибудь файл в каталоге /etc/NetworkManager/conf.d/
:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=systemd-resolved
Распознаватель DNS с абонентом openresolv
Если openresolv позволяет подключить ваш локальный DNS-резолвер в качестве абонента, подключите его и настройте NetworkManager на использование openresolv.
Поскольку NetworkManager выглядит как один «интерфейс» для resolvconf, невозможно реализовать условное перенаправление между двумя соединениями NetworkManager. Смотрите NetworkManager issue 153.
Эта проблема может быть частично решена, если вы установите private_interfaces="*"
в /etc/resolvconf.conf
. Любые запросы к доменам, которых нет в списке поисковых доменов, не будут перенаправлены. Они будут обработаны в соответствии с конфигурацией локального резолвера, например, перенаправлены на другой DNS-сервер или разрешены рекурсивно от корня DNS.
Пользовательские серверы DNS
Настройка глобальных серверов DNS
Чтобы задать DNS-серверы для всех соединений, укажите их в NetworkManager.conf(5), используя синтаксис servers=ipадрес1,ipадрес2,ipадрес3
в разделе [global-dns-domain-*]
. Например:
/etc/NetworkManager/conf.d/dns-servers.conf
[global-dns-domain-*] servers=::1,127.0.0.1
- Если вы используете плагин dnsmasq или systemd-resolved или #Распознаватель DNS с абонентом openresolv, не указывайте loopback-адреса, это сломает DNS.
- Указанные серверы не отправляются на systemd-resolved, вместо них используются DNS-серверы соединения. Смотрите NetworkManager issue 1366 и systemd issue 33754.
Настройка серверов DNS для соединения
Настройка серверов DNS для соединения (GUI)
Настройка зависит от типа используемого графического интерфейса. Обычно для этого нужно открыть изменение соединения через апплет и выбрать метод Только автоматические адреса (DHCP), затем в поле Серверы DNS будет можно их ввести примерно в таком виде: 127.0.0.1, DNS-сервер-раз, ...
.
Настройка серверов DNS для соединения (nmcli / файл соединения)
Чтобы настроить серверы DNS для отдельного соединения, измените параметры ipv4.dns
и ipv6.dns
(и связанные с ними dns-search
и dns-options
) в настройках соединения.
Если method
установлен на auto
(при использовании DHCP/RA), также установите ignore-auto-dns
на yes
.
Чтобы использовать DNS over TLS (требуется systemd-resolved), укажите серверы DNS, используя синтаксис dns=ip.адрес#имясервера;
и дополнительно установите параметр connection.dns-over-tls
в значение 2
. Пример для Quad9:
/etc/NetworkManager/system-connections/Example Wi-Fi.nmconnection
... [connection] ... dns-over-tls=2 [ipv4] ... dns=9.9.9.9#dns.quad9.net;149.112.112.112#dns.quad9.net; ignore-auto-dns=true [ipv6] ... dns=2620:fe::fe#dns.quad9.net;2620:fe::9#dns.quad9.net; ignore-auto-dns=true
/etc/resolv.conf
Управление файлом /etc/resolv.conf
настраивается параметром main.rc-manager
. Пакет networkmanager использует symlink
, что отличается от значения по умолчанию auto
в апстриме. Документация по этой настройке доступна в NetworkManager.conf(5).
NetworkManager также предоставляет хуки через так называемые диспетчерские скрипты (dispatcher scripts), которые можно использовать для обновления /etc/resolv.conf
после изменения состояния сети. Смотрите #Сетевые службы с диспетчером NetworkManager и NetworkManager(8) для более подробной информации.
- Если NetworkManager настроен на использование dnsmasq или systemd-resolved, в файл
/etc/resolv.conf
будут записаны соответствующие loopback-адреса. - Файл
resolv.conf
, который NetworkManager записывает или мог бы записать, находится в/run/NetworkManager/resolv.conf
. - Файл
resolv.conf
с назначенными серверами имен и поисковыми доменами находится в/run/NetworkManager/no-stub-resolv.conf
.
Неуправляемый /etc/resolv.conf
Чтобы NetworkManager больше не трогал файл /etc/resolv.conf
, пропишите опцию main.dns=none
в файле настроек внутри /etc/NetworkManager/conf.d/
:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=none
main.systemd-resolved=false
, чтобы NetworkManager не отправлял настройки DNS в systemd-resolved.main.dns=none
можно настроить NetworkManager на использование dnsmasq или systemd-resolved в качестве бэкенда DNS; смотрите раздел #Кэширование DNS и условное перенаправление.После этого /etc/resolv.conf
может оказаться сломанной символической ссылкой, которую нужно будет удалить. Затем просто создайте новый файл /etc/resolv.conf
.
Использование openresolv
- Не указывайте
main.rc-manager=resolvconf
при использовании systemd-resolved, вместо этого создайте символическую ссылку /etc/resolv.conf или настройте NetworkManager на явное использование systemd-resolved. - Убедитесь, что пакет systemd-resolvconf не установлен, если systemd-resolved не используется. Пока
systemd-resolved.service
не запущен, это сломает все сетевые приложения (не только NetworkManager), которые используют resolvconf.
Чтобы настроить NetworkManager на использование openresolv, установите опцию main.rc-manager=resolvconf
в файле настроек внутри /etc/NetworkManager/conf.d/
:
/etc/NetworkManager/conf.d/rc-manager.conf
[main] rc-manager=resolvconf
Межсетевой экран
Вы можете назначить зону firewalld на основе вашего текущего соединения. Например, ограничительный брандмауэр на работе и менее ограничительный дома.
Это также можно сделать с помощью диспетчера NetworkManager.
Сетевые службы с диспетчером NetworkManager
Существует сетевые службы, которые желательно не запускать до тех пор, пока NetworkManager не настроит сеть. NetworkManager имеет возможность запускать службы при подключении к сети и останавливать их при отключении (например, при использовании NFS, SMB и NTPd).
Для активации этой возможности запустите и включите службу NetworkManager-dispatcher.service
.
После включения службы можно добавлять скрипты в каталог /etc/NetworkManager/dispatcher.d
.
Владельцем скриптов должен быть root, иначе диспетчер не станет их выполнять. Для дополнительной безопасности укажите также группу root:
# chown root:root /etc/NetworkManager/dispatcher.d/10-скрипт.sh
Сделайте файл исполняемым.
Скрипты будут запускаться в алфавитном порядке во время подключения и в обратном алфавитном порядке во время отключения. Чтобы чётко определить, в каком порядке они будут запускаться, обычно используют цифровые символы перед именем скрипта (например, 10-portmap
или 30-netfs
(что гарантирует, что portmapper будет запущен до попытки монтирования NFS).
Скрипты будут принимать два аргумента:
- Имя интерфейса: например,
eth0
- Действие: up, down, vpn-up, vpn-down, ... (полный список приведён в NetworkManager-dispatcher(8))
Обход таймаута диспетчера
Если всё работает, то этот раздел вам не нужен. Однако существует общая проблема, связанная с запуском диспетчерских скриптов, которые выполняются долго. Изначально использовался внутренний тайм-аут, равный всего трём секундам. Если вызванный скрипт не успевал завершиться, диспетчер его убивал. Позже таймаут был увеличен примерно до 20 секунд (подробнее в баг-трекере). Если таймаут всё ещё создает проблемы, то можно обойтись без него, используя drop-in файл, чтобы служба NetworkManager-dispatcher.service
оставалась активной после завершения работы:
/etc/systemd/system/NetworkManager-dispatcher.service.d/remain_after_exit.conf
[Service] RemainAfterExit=yes
Теперь запустите и включите изменённую службу NetworkManager-dispatcher
.
RemainAfterExit
предотвратит закрытие диспетчера. К сожалению, диспетчер нужно закрыть, прежде чем он сможет снова запустить ваши скрипты. С этой строкой диспетчер не будет завершать работу по таймауту, но и не будет закрываться, что означает, что скрипты будут выполняться только один раз за загрузку. Поэтому не добавляйте эту строку, если таймаут не вызывает проблем.Примеры диспетчерских скриптов
Автоматическая установка часового пояса
Установите tzupdateAUR и создайте такой скрипт (не забудьте сделать его исполняемым):
/etc/NetworkManager/dispatcher.d/update-timezone.sh
#!/bin/bash # Автоматическая установка часового пояса после подключения к сети iface=$1 action=$2 if [[ $iface != lo && $action == up ]]; then tz=$(tzupdate -s 1 -p 2>/dev/null) if [[ -n $tz && -r /usr/share/zoneinfo/$tz ]]; then timedatectl set-timezone $tz fi fi
Если нужно, обновите условие $iface != lo
на сравнение с нужным вам сетевым интерфейсом.
Монтирование удалённого каталога с помощью sshfs
Поскольку скрипт выполняется в очень ограниченной среде, вам нужно экспортировать SSH_AUTH_SOCK
, чтобы подключиться к SSH-агенту. Это можно сделать разными способами, подробности есть в этом сообщении. Пример ниже работает с GNOME Keyring и попросит вас ввести пароль, если он ещё не разблокирован. Если NetworkManager подключается автоматически при входе в систему, есть вероятность, что gnome-keyring ещё не будет запущен на момент запуска скрипта, и экспорт будет неудачным (поэтому здесь может пригодиться sleep). UUID
, который нужно использовать, можно узнать с помощью команды nmcli connection status
или nmcli connection list
.
#!/bin/sh USER='пользователь' REMOTE='пользователь@хост:/удалённый/путь' LOCAL='/локальный/путь' interface=$1 status=$2 if [ "$CONNECTION_UUID" = "''uuid''" ]; then case $status in up) # sleep 10 SSH_AUTH_SOCK=$(find /tmp -maxdepth 1 -type s -user "$USER" -name 'ssh') export SSH_AUTH_SOCK su "$USER" -c "sshfs $REMOTE $LOCAL" ;; down) fusermount -u "$LOCAL" ;; esac fi
Монтирование общих ресурсов SMB
Некоторые общие ресурсы SMB доступны только в определённых сетях или местах (например, дома). Можно использовать диспетчер для монтирования только тех ресурсов SMB, которые доступны в вашем текущем местоположении.
Следующий скрипт проверит, подключены ли мы к определённой сети, и соответственно смонтирует общие ресурсы:
/etc/NetworkManager/dispatcher.d/30-mount-smb.sh
#!/bin/sh # Найдите UUID нужного соединения с помощью команды «nmcli connection show». # Поддерживаются все типы соединений NetworkManager: беспроводные, VPN, проводные... if [ "$2" = "up" ]; then if [ "$CONNECTION_UUID" = "uuid" ]; then mount /ваша/точка/монтирования & # можно добавить другие ресурсы по необходимости fi fi
Следующий скрипт размонтирует все общие ресурсы SMB перед программным отключением от определённой сети:
/etc/NetworkManager/dispatcher.d/pre-down.d/30-umount-smb.sh
#!/bin/sh if [ "$CONNECTION_UUID" = "uuid" ]; then umount -a -l -t cifs fi
pre-down.d
, как показано выше, иначе он будет размонтировать все общие ресурсы при любом изменении состояния соединения.Следующий скрипт попытается размонтировать все общие ресурсы SMB после неожиданного отключения от определённой сети:
/etc/NetworkManager/dispatcher.d/40-umount-smb.sh
#!/bin/sh if [ "$CONNECTION_UUID" = "uuid" ]; then if [ "$2" = "down" ]; then umount -a -l -t cifs fi fi
- С версии NetworkManager 0.9.8 события pre-down и down не выполняются при выключении или перезапуске, более подробную информацию смотрите в этом баг-репорте.
- Эти umount-скрипты всё ещё могут привести к зависанию приложений, обращающихся к примонтированным ресурсам.
Также можно использовать скрипт, подобный описанному в разделе NFS#Using a NetworkManager dispatcher:
/etc/NetworkManager/dispatcher.d/30-smb.sh
#!/bin/sh # Найдите UUID нужного соединения с помощью команды «nmcli con show». # Поддерживаются все типы соединений NetworkManager: беспроводные, VPN, проводные... WANTED_CON_UUID="ИЗМЕНИ-МЕНЯ-9c7eff15-010a-4b1c-a786-9b4efa218ba9" if [ "$CONNECTION_UUID" = "$WANTED_CON_UUID" ]; then # Параметр скрипта $1: имя сетевого интерфейса, не используется # Параметр скрипта $2: отправленное событие case "$2" in "up") mount -a -t cifs ;; "down"|"pre-down"|"vpn-pre-down") umount -l -a -t cifs >/dev/null ;; esac fi
noauto
; удалите эту опцию или используйте auto
, чтобы позволить диспетчеру управлять ими.Создайте символическую ссылку в каталоге /etc/NetworkManager/dispatcher.d/pre-down/
, чтобы скрипт стал перехватывать события pre-down
:
# ln -s ../30-smb.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-smb.sh
Монтирование общих ресурсов NFS
Смотрите NFS#Using a NetworkManager dispatcher.
Использование диспетчера для переключения беспроводной сети в зависимости от состояния проводного соединения
Идея заключается в том, чтобы включать Wi-Fi только при отключении сетевого кабеля (например, при отсоединении ноутбука от док-станции), и отключать Wi-Fi после того, как только сетевой кабель снова подключен.
Создайте следующий диспетчерский скрипт, заменив ваш_Ethernet_интерфейс
на имя вашего проводного интерфейса.
nmcli d | grep ethernet
). Ethernet-интерфейсы начинаются с en
или eth
, например enp0s5
или eth0
.Не забудьте сделать скрипт исполняемым. Вы можете убедиться, что он работает, перезапустив службу NetworkManager.service
, выполнив ip a
и проверив, что интерфейс Wi-Fi (например, wlp3s0
) находится в state DOWN
. Если вы столкнулись с неожиданным поведением, проверьте журнал службы NetworkManager-dispatcher.service
.
/etc/NetworkManager/dispatcher.d/99-wifi-auto-toggle
#!/bin/sh LOG_PREFIX="WiFi Auto-Toggle" ETHERNET_INTERFACE="''ваш_Ethernet_интерфейс''" if [ "$1" = "$ETHERNET_INTERFACE" ]; then case "$2" in up) echo "$LOG_PREFIX ethernet up" nmcli radio wifi off ;; down) echo "$LOG_PREFIX ethernet down" nmcli radio wifi on ;; esac elif [ "$(nmcli -g GENERAL.STATE device show $ETHERNET_INTERFACE)" = "20 (unavailable)" ]; then echo "$LOG_PREFIX failsafe" nmcli radio wifi on fi
Использование диспетчера для подключения к VPN после появления сети
В этом примере мы хотим автоматически подключаться к определённому VPN-соединению после подключения к определённой сети Wi-Fi. Первое, что нужно сделать, это создать диспетчерский скрипт, который определяет, что делать после подключения к сети.
iwgetid
, для его работы нужно установить wireless_tools./etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh VPN_NAME="имя VPN-соединения, определённое в NetworkManager" ESSID="ESSID сети Wi-Fi (не имя соединения)" interface=$1 status=$2 case $status in up|vpn-down) if iwgetid | grep -qs ":\"$ESSID\""; then nmcli connection up id "$VPN_NAME" fi ;; down) if iwgetid | grep -qs ":\"$ESSID\""; then if nmcli connection show --active | grep "$VPN_NAME"; then nmcli connection down id "$VPN_NAME" fi fi ;; esac
Если вы хотите попытаться автоматически подключиться к VPN для всех сетей Wi-Fi, можете использовать следующее определение ESSID: ESSID=$(iwgetid -r)
.
Попытка подключения этим скриптом может закончиться неудачей, поскольку служба NetworkManager-dispatcher.service
будет жаловаться на 'no valid VPN secrets' из-за способа хранения VPN-секретов. К счастью, существуют варианты предоставить скрипту доступ к паролю VPN.
1: Один из них требует редактирования файла конфигурации VPN-соединения, чтобы заставить NetworkManager хранить секреты самостоятельно, а не в связке ключей, которая будет недоступна для root: откройте /etc/NetworkManager/system-connections/имя-VPN-соединения
и измените флаги password-flags
и secret-flags
с 1
на 0
.
Если это не поможет, возможно, вам придётся создать passwd-file
в безопасном месте с теми же правами и владельцем, что и у скрипта, со следующим содержимым:
/путь/к/passwd-file
vpn.secrets.password:ВАШ_ПАРОЛЬ
Измените скрипт, чтобы он получал пароль из файла:
/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh VPN_NAME="имя VPN-соединения, определённое в NetworkManager" ESSID="ESSID сети Wi-Fi (не имя соединения)" interface=$1 status=$2 case $status in up|vpn-down) if iwgetid | grep -qs ":\"$ESSID\""; then nmcli connection up id "$VPN_NAME" passwd-file /путь/к/passwd-file fi ;; down) if iwgetid | grep -qs ":\"$ESSID\""; then if nmcli connection show --active | grep "$VPN_NAME"; then nmcli connection down id "$VPN_NAME" fi fi ;; esac
2: В качестве альтернативы измените password-flags
и задайте пароль непосредственно в файле настроек, добавив раздел vpn-secrets
:
[vpn] .... password-flags=0 [vpn-secrets] password=ваш_пароль
Использование диспетчера для отключения IPv6 при подключении VPN
Многие коммерческие VPN-провайдеры поддерживают только IPv4. Это означает, что весь трафик IPv6 идёт в обход VPN, из-за чего VPN становится фактически бесполезным. Чтобы избежать этого, можно использовать диспетчер для отключения всего трафика IPv6 на время работы VPN-соединения.
/etc/NetworkManager/dispatcher.d/10-vpn-ipv6
#!/bin/sh case "$2" in vpn-up) echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 ;; vpn-down) echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6 ;; esac
В качестве альтернативы можно использовать диспетчер, чтобы временно установить IPv6-режим link-local
на устройстве, используемом для VPN-соединения. Это позволит избежать спама в журнале NetworkManager об отключенном IPv6. Этот скрипт не будет работать, если IPv6 предоставляют несколько устройств или соединений, но может быть адаптирован для итерации по нескольким устройствам. Обратите внимание, что любое изменение соединения (с помощью nmcli(1) или через среду рабочего стола) приведёт к повторному применению всего соединения к устройству и повторному включению IPv6 (если он включен в настройках соединения).
/etc/NetworkManager/dispatcher.d/10-vpn-ipv6
#!/bin/sh case "$2" in vpn-up) nmcli device modify "${DEVICE_IFACE}" ipv6.method link-local ;; vpn-down) nmcli device reapply "${DEVICE_IFACE}" ;; esac
OpenNTPD
Смотрите OpenNTPD#Using NetworkManager dispatcher.
Динамическая установка серверов NTP, полученных через DHCP, с использованием systemd-timesyncd
При перемещении между различными сетями (например, локальная сеть компании, домашний Wi-Fi, иногда другие Wi-Fi) вы можете захотеть установить NTP-сервер(ы), которые использует timesyncd, на те, которые предоставляются местным DHCP-сервером. Однако сам NetworkManager не способен взаимодействовать с systemd-timesyncd для установки серверов NTP.
Это можно обойти с помощью диспетчера.
Создайте каталог /etc/systemd/timesyncd.conf.d
, если его ещё нет, а затем в /etc/NetworkManager/dispatcher.d
создайте такой скрипт:
/etc/NetworkManager/dispatcher.d/10-update-timesyncd
#!/bin/sh [ -z "$CONNECTION_UUID" ] && exit 0 INTERFACE="$1" ACTION="$2" case $ACTION in up | dhcp4-change | dhcp6-change) [ -n "$DHCP4_NTP_SERVERS" ] || exit 0 mkdir -p /etc/systemd/timesyncd.conf.d cat <<-THE_END >"/etc/systemd/timesyncd.conf.d/${CONNECTION_UUID}.conf" [Time] NTP=$DHCP4_NTP_SERVERS THE_END systemctl restart systemd-timesyncd.service ;; down) rm -f "/etc/systemd/timesyncd.conf.d/${CONNECTION_UUID}.conf" systemctl restart systemd-timesyncd.service ;; esac
Каждый раз, когда NetworkManager устанавливает новое соединение (ACTION=up
) или получает обновление для существующего (ACTION=dhcp4-change
или ACTION=dhcp6-change
) и предоставленные данные соединения содержат информацию о NTP-сервере (DHCP4_NTP_SERVERS
), в каталог /etc/systemd/timesyncd.conf.d
записывается файл настроек, специфичный для соединения, содержащий предоставленные NTP-серверы. Каждый раз, когда соединение отключается (ACTION=down
), этот файл удаляется. После каждого изменения конфигурации systemd-timesyncd служба перезапускается, чтобы применить обновлённую конфигурацию. Файлы намеренно привязаны к конкретным соединениям, чтобы при параллельном управлении двумя или более соединениями NetworkManager различные имена NTP-серверов в конфигурации не перезаписывались, поскольку действия up
, dhcp4-change
, dhcp6-change
и down
могут происходить в произвольном порядке.
Тестирование
Апплеты NetworkManager загружаются при входе в систему, поэтому большинству пользователей не потребуется дополнительная настройка. Если вы уже отключили предыдущие сетевые настройки и отсоединились от сети, вы можете проверить, будет ли работать NetworkManager. В первую очередь запустите службу NetworkManager.service
.
Некоторые апплеты предоставляют файл .desktop
, чтобы апплет NetworkManager можно было загрузить через меню приложений. Если это не так, вам нужно либо найти команду для запуска, либо перелогиниться, чтобы сработал автозапуск апплета. После запуска апплет, скорее всего, начнёт опрашивать сетевые соединения на предмет автоматической настройки с помощью DHCP-сервера.
Чтобы запустить апплет GNOME в несовместимых с xdg оконных менеджерах, таких как awesome:
nm-applet --sm-disable &
Для статических IP-адресов нужно настроить NetworkManager для их понимания. Обычно это можно сделать правым щелчком мыши по апплету и выбора пункта про редактирование соединений.
Советы и рекомендации
Шифрование паролей Wi-Fi
По умолчанию NetworkManager хранит пароли открытым текстом в файлах соединений в каталоге /etc/NetworkManager/system-connections/
. Чтобы вывести сохранённые пароли, выполните следующую команду:
# grep -r '^psk=' /etc/NetworkManager/system-connections/
Пароли могут прочитать root и пользователи, имеющие доступ к настройкам (например, через nm-applet).
Лучше сохранять пароли в зашифрованном виде в связке ключей, а не открытым текстом. Недостатком использования связки ключей является то, что соединения должны быть настроены отдельно для каждого пользователя.
Для работы со связкой ключей должен быть доступен агент секретов. Это может быть:
nmcli
с опцией--ask
;- какой-нибудь графический интерфейс (смотрите раздел #Фронтенды).
Если агент недоступен, то аутентификация завершится с ошибкой no secrets: No agents were available for this request.
С помощью GNOME Keyring
Демон GNOME Keyring должен быть запущен, а связка ключей должна быть разблокирована, чтобы описанные ниже действия работали.
Кроме того, NetworkManager должен быть настроен так, чтобы не хранить пароль для всех пользователей. Запустите nm-connection-editor
(входит в состав пакета network-manager-applet), откройте редактирование нужного соединения, выберите вкладку Защита Wi-Fi, нажмите на значок справа в поле ввода пароля и выберите пункт Запомнить пароль только для этого пользователя.
С помощью KDE Wallet
Используя plasma-nm, нажмите на апплет сети, нажмите на значок Настроить сетевые соединения в правом верхнем углу, выберите нужное соединение, на вкладке Основные параметры снимите галочку Все пользователи могут подключаться к этой сети. При включенной галочке пароли будут храниться открытым текстом даже при запущенном демоне связки ключей.
Если галочка ранее стояла и вы сняли её, возможно, сначала придётся воспользоваться опцией сброса, чтобы пароль исчез из файла. В качестве альтернативы сначала удалите соединение и установите его снова.
Раздача интернета через Wi-Fi
Вы можете предоставить общий доступ к вашему интернет-соединению (например, 3G или проводному) всего в несколько кликов мышью. Обратите внимание, что межсетевой экран может помешать раздаче интернета.
Вам понадобится карта Wi-Fi, поддерживающая режим точки доступа; смотрите раздел Программная точка доступа#Поддержка режима AP устройством Wi-Fi.
Установите пакет dnsmasq, чтобы иметь возможность предоставить общий доступ к соединению. Обратите внимание, что NetworkManager запускает свой собственный экземпляр dnsmasq, независимый от dnsmasq.service
, в качестве DHCP-сервера. Смотрите предостережения в разделе #dnsmasq.
Создайте общее соединение:
- Откройте редактор сетевых соединений и создайте новую беспроводную сеть.
- Заполните все необходимые настройки (выберите WPA2 или новее для защиты Wi-Fi и используйте не менее 8 символов для пароля).
- В настройке Режим выберите Точка доступа (Hotspot) или Одноранговый (Ad-hoc).
Соединение будет сохранено и останется до следующего раза, когда оно вам понадобится.
Раздача интернета через Ethernet
Ситуация: ваше устройство подключено к Интернету через Wi-Fi, и вы хотите предоставить доступ к Интернету другим устройствам через Ethernet.
Требования:
- Установите пакеты dnsmasq и nm-connection-editor, чтобы иметь возможность предоставить общий доступ к соединению. Обратите внимание, что NetworkManager запускает свой собственный экземпляр dnsmasq, независимый от
dnsmasq.service
, в качестве DHCP-сервера. Смотрите предостережения в разделе #dnsmasq. - Ваше устройство, подключенное к Интернету, и другие устройства соединены друг с другом через подходящий кабель Ethernet (обычно это означает перекрёстный кабель или коммутатор между ними).
- Общий доступ в интернет не заблокирован межсетевым экраном.
Шаги:
- Запустите
nm-connection-editor
. - Добавьте новое Ethernet-соединение.
- Задайте какое-нибудь информативное имя, например «Раздача интернета».
- Перейдите на вкладку Параметры IPv4.
- Измените Метод на Общий с другими компьютерами.
- Сохраните.
Теперь в списке проводных соединений должна появиться «Раздача интернета».
Проверка работоспособности сети внутри задачи cron или скрипта
Некоторым задачам cron может понадобиться работающая сеть. Чтобы не выполнять их при отсутствии сети, добавьте проверку, запрашивающую статус сети у NetworkManager. Это может быть полезно для ноутбуков, которые не всегда подключены к сети.
if [ $(nm-tool|grep State|cut -f2 -d' ') == "connected" ]; then # Добавьте сюда команды для выполнения при работающей сети else # Добавьте сюда команды для выполнения при отсутствующей сети # Этот блок и строка else опциональны fi
Пример использования — скрипт cron.hourly
, который запускает fpupdate для обновления сигнатур вирусного сканера F-Prot. Другой способ, который может быть полезен, с небольшими изменениями — различать сети, используя различные части вывода nm-tool; например, поскольку активная беспроводная сеть обозначается звёздочкой, вы можете через grep получить строку с именем нужной сети, а через второй grep проверить наличие звёздочки.
Подключение к сети с паролем при загрузке системы
По умолчанию NetworkManager не будет автоматически подключаться к сетям, требующим пароль, при загрузке системы. Это происходит потому, что по умолчанию он закрепляет такие соединения за тем пользователем, который их создал, подключаясь только после входа пользователя в систему. Чтобы изменить это, выполните следующие шаги:
- Откройте редактирование сетевых соединений (например, через значок
nm-applet
в трее). - Выберите Wi-Fi соединение, к которому вы хотите автоматически подключаться, и откройте его редактирование.
- На вкладке Основное поставьте галочки Подключаться автоматически и Все пользователи могут подключаться к этой сети.
- На вкладке Защита Wi-Fi выберите пункт Запомнить пароль для всех пользователей (в nm-connection-editor он спрятан в небольшом значке справа от пароля).
Перелогиньтесь для завершения.
OpenConnect с паролем в KWallet
Хотя вы можете ввести оба значения во время подключения, plasma-nm 0.9.3.2-1 и новее способны получить имя пользователя и пароль OpenConnect непосредственно из KWallet.
Откройте Управление бумажниками (KWalletManager) и найдите ваше VPN-соединение OpenConnect в разделе «Network Management|Maps». Нажмите Показать содержимое и введите свои учётные данные в ключе «VpnSecrets» в этой форме (замените пользователь и пароль соответствующим образом):
form:main:username%SEP%пользователь%SEP%form:main:password%SEP%пароль
При следующем подключении имя пользователя и пароль должны появиться в диалоговом окне «VPN secrets».
Игнорирование определённых устройств
Иногда бывает нужно, чтобы NetworkManager игнорировал определённые устройства и не пытался настроить для них адреса и маршруты. Чтобы игнорировать устройства по MAC-адресу или имени интерфейса, пропишите их в файле /etc/NetworkManager/conf.d/unmanaged.conf
:
[keyfile] unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth0
После редактирования файла выполните nmcli general reload
от имени root. После это вы сможете вручную настроить указанные интерфейсы, и NetworkManager не будет изменять ваши настройки.
Рандомизация MAC-адреса
Рандомизация MAC-адреса скрывает от сети ваш реальный MAC-адрес, что можно использовать для повышения конфиденциальности.
NetworkManager поддерживает два типа рандомизации: для сканирования и для соединений. Оба режима могут быть настроены в файле /etc/NetworkManager/NetworkManager.conf
или путём создания отдельного файла настроек в /etc/NetworkManager/conf.d/
, что предпочтительнее, поскольку NetworkManager может перезаписывать вышеупомянутый файл настроек.
Рандомизация при сканировании Wi-Fi включена по умолчанию, но её можно отключить добавлением следующих строк в /etc/NetworkManager/NetworkManager.conf
или в отдельный файл настроек в /etc/NetworkManager/conf.d
:
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device] wifi.scan-rand-mac-address=no
Рандомизация MAC-адреса для соединений может быть установлена в разные режимы для беспроводных и проводных интерфейсов.
В плане рандомизации MAC наиболее важными режимами являются stable
и random
. Режим stable
генерирует случайный MAC-адрес, когда вы подключаетесь к новой сети, и связывает их друг с другом навсегда. Это означает, что вы будете использовать один и тот же MAC-адрес при каждом подключении к этой сети. Режим random
генерирует новый MAC-адрес каждый раз, когда вы подключаетесь к новой или ранее известной сети. Настроить рандомизацию можно добавлением настроек в /etc/NetworkManager/conf.d
:
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device-mac-randomization] # "yes" уже используется по умолчанию при сканировании wifi.scan-rand-mac-address=yes [connection-mac-randomization] # Генерирование нового случайного MAC при каждом подключении к проводному соединению ethernet.cloned-mac-address=random # Генерирование случайного MAC для каждого Wi-Fi при первом подключении и связывание их вместе wifi.cloned-mac-address=stable
Чтобы настроить рандомизацию MAC-адреса для конкретного соединения (например, если сети не нравятся случайные MAC-адреса), измените соединение, установив 802-11-wireless.cloned-mac-address
в один из режимов (например, stable
или random
).
Более подробная информация о режимах есть в блоге GNOME.
Включение IPv6 Privacy Extensions
Смотрите IPv6 (Русский)#NetworkManager.
Настройка уникального DUID для соединения
Уникальный идентификатор DHCPv6 (DHCPv6 Unique Identifier, DUID) — это значение, используемое клиентом DHCPv6 для идентификации себя на серверах DHCPv6. NetworkManager поддерживает 3 типа DUID:
- DUID-UUID (RFC 6355): генерируется из UUID.
- DUID-LL (RFC 3315): генерируется из адреса канального уровня (MAC-адреса).
- DUID-LLT (RFC 3315): генерируется из адреса канального уровня и метки времени.
Если используется встроенный DHCP-клиент NetworkManager (по умолчанию), он идентифицирует себя с помощью глобального и постоянного DUID-UUID, сгенерированного из machine-id (/etc/machine-id
). Это означает, что во всех соединениях используется один и тот же UUID, что может оказаться проблемой конфиденциальности.
К счастью, NetworkManager позволяет настроить уникальные DUID для каждого соединения, получаемые из stable-id соединения и уникального ключа для каждого хоста. Вы можете включить эту функцию, добавив следующую конфигурацию в /etc/NetworkManager/conf.d/
:
/etc/NetworkManager/conf.d/duid.conf
[connection] ipv6.dhcp-duid=stable-uuid
Также поддерживаются значения stable-ll
и stable-llt
. Дополнительная информация есть в описании dhcp-duid
в nm-settings(5) § ipv6 setting.
Работа с проводными соединениями
По умолчанию NetworkManager генерирует профиль соединения для каждого найденного Ethernet-адаптера. В момент создания соединения он не знает, будут ли доступны ещё какие-нибудь Ethernet-адаптеры, поэтому он называет первое проводное соединение «Проводное соединение 1». Вы можете избежать генерации этого соединения, настроив параметр no-auto-default
(смотрите NetworkManager.conf(5)) или просто удалив его. Тогда NetworkManager запомнит, что генерировать соединение для этого интерфейса не нужно.
Вы также можете отредактировать соединение (и сохранить его на диске) или удалить его. NetworkManager не будет повторно генерировать соединение. Затем вы можете изменить имя на любое другое. Для этой задачи можно использовать что-то вроде nm-connection-editor.
Использование iwd в качестве бэкенда Wi-Fi
- Не включайте
iwd.service
и не настраивайте iwd вручную. NetworkManager сам всё запустит и настроит. - Перед переходом на iwd ознакомьтесь со списком известных проблем.
Чтобы включить экспериментальный бэкенд iwd, сперва установите пакет iwd и создайте такой файл настроек:
/etc/NetworkManager/conf.d/wifi_backend.conf
[device] wifi.backend=iwd
Другой вариант — установить networkmanager-iwdAUR. Это модифицированный пакет, который собирает NetworkManager только с поддержкой iwd. Главное отличие в том, что это позволяет удалить вам wpa_supplicant.
Запуск в сетевом пространстве имён
Если вы хотите запустить NetworkManager в сетевом пространстве имён (например, для управления определённым устройством, которое должно использоваться выбранными приложениями), выключите устройство, прежде чем перемещать его в пространство имён:
$ ip link set dev УСТРОЙСТВО down $ ip link set dev УСТРОЙСТВО netns ПРОСТРАНСТВО_ИМЁН $ ip netns exec ПРОСТРАНСТВО_ИМЁН NetworkManager ... $ ip netns exec ПРОСТРАНСТВО_ИМЁН killall NetworkManager
В противном случае NetworkManager впоследствии не сможет установить соединение с ошибкой device is strictly unmanaged
.
Автоматическое подключение к VPN
NetworkManager можно настроить на автоматическое подключение к VPN при подключении к интернету или для отдельной сети. Само VPN-соединение можно добавить через фронтенд NetworkManager в GNOME, но для автоматического подключения нужно использовать nmcli
. В других фронтендах может не быть этого ограничения.
Сперва убедитесь, что VPN-соединение доступно всем пользователям. В GNOME для этого нужно установить флажок на вкладке details
. На вкладке Identity
в поле пароля нажмите на значок справа и выберите значение Store the password for all users
.
Затем найдите UUID нужного VPN-соединения и добавьте его в connection.secondaries
интернет-соединения:
# UUID=$(nmcli --get-values connection.uuid connection show название-VPN-соединения) # nmcli connection modify название-интернет-соединения connection.secondaries "$UUID"
Теперь после перезапуска NetworkManager и переподключения к настроенному интернет-соединению вы должны автоматически подключиться к VPN.
Решение проблем
Не запрашивается пароль Wi-Fi
Если при попытке подключиться к защищённой сети Wi-Fi не отображается запрос на ввод пароля и соединение не устанавливается, это может быть связано с тем, что не установлена программа для управления паролями. Простым решением является установка gnome-keyring. Если вы хотите, чтобы пароли хранились в зашифрованном виде, настройте gnome-keyring-daemon, как описано в статье GNOME (Русский)/Keyring (Русский).
Управление сетью отключено
Если после завершения работы NetworkManager файл pid (state) оказался не удалён, вы увидите сообщение Network management disabled
. В этом случае удалите файл вручную:
# rm /var/lib/NetworkManager/NetworkManager.state
Проблемы с внутренним клиентом DHCP
Если у вас возникли проблемы с получением IP-адреса при использовании встроенного клиента DHCP, попробуйте использовать другой клиент; смотрите раздел #Клиент DHCP. Это обходное решение может решить проблемы в больших беспроводных сетях, таких как eduroam.
Проблемы с DHCP при использовании dhclient
Если у вас возникли проблемы с получением IP-адреса через DHCP, попробуйте добавить в файл /etc/dhclient.conf
:
interface "eth0" { send dhcp-client-identifier 01:aa:bb:cc:dd:ee:ff; }
Где aa:bb:cc:dd:ee:ff
— это MAC-адрес вашей сетевой карты. Узнать его можно с помощью команды ip link show интерфейс
(пакет iproute2).
3G-модем не определяется
Смотрите Mobile broadband modem#NetworkManager.
Выключение беспроводной сети на ноутбуках
Иногда NetworkManager не работает, когда вы отключаете свой Wi-Fi адаптер с помощью переключателя на ноутбуке и после этого пытаетесь включить его снова. Часто это проблема с rfkill. Чтобы проверить, сообщает ли драйвер о состоянии беспроводного адаптера в rfkill, используйте:
$ watch -n1 rfkill list all
Если идентификатор остаётся заблокированным после включения адаптера, можно попробовать вручную разблокировать его с помощью (где X — номер идентификатора, указанный в выводе этой команды):
# rfkill event unblock X
Настройки статического IP-адреса сбрасываются на DHCP
Из-за бага при изменении стандартных подключений на статический IP-адрес nm-applet
может неправильно сохранить настройки и сбросить их на автоматический DHCP.
Чтобы решить эту проблему, нужно отредактировать подключение по умолчанию (например, «Auto eth0») в nm-applet
, изменить имя подключения (например, «Мой eth0»), снять флажок «Все пользователи могут подключаться к этой сети», изменить настройки статического IP-адреса по своему усмотрению и сохранить их.
Далее нужно сделать так, чтобы соединение по умолчанию не подключалось автоматически. Для этого запустите nm-connection-editor
(от имени обычного пользователя, не от root). Отредактируйте подключение по умолчанию (например, «Auto eth0»), снимите флажок «Подключаться автоматически» и сохраните изменения.
Не удаётся редактировать соединения от имени обычного пользователя
Смотрите раздел #Настройка разрешений PolicyKit.
Забыть скрытую беспроводную сеть
Поскольку скрытые сети не отображаются в списке выбора беспроводной сети, их нельзя забыть (удалить) через графический интерфейс. Можно вручную удалить соответствующие файлы:
# rm /etc/NetworkManager/system-connections/SSID
Это также работает с любыми другими соединениями.
VPN не работает в GNOME
При настройке соединений OpenConnect или vpnc в NetworkManager при использовании GNOME иногда не появляется диалоговое окно, а в /var/log/errors.log
появляется следующая ошибка:
localhost NetworkManager[399]: <error> [1361719690.10506] [nm-vpn-connection.c:1405] get_secrets_cb(): Failed to request VPN secrets #3: (6) No agents were available for this request.
Это происходит из-за того, что апплет GNOME NetworkManager ожидает, что диалоговые скрипты будут находиться в /usr/lib/gnome-shell
, в то время как пакеты NetworkManager помещают их в /usr/lib/networkmanager
. В качестве «временного» исправления (эта ошибка существует уже некоторое время) сделайте следующие символические ссылки:
- Для OpenConnect:
ln -s /usr/lib/networkmanager/nm-openconnect-auth-dialog /usr/lib/gnome-shell/
- Для VPNC (то есть Cisco VPN):
ln -s /usr/lib/networkmanager/nm-vpnc-auth-dialog /usr/lib/gnome-shell/
Это может потребоваться и для других VPN-плагинов NetworkManager.
Не удаётся подключиться к видимым европейским беспроводным сетям
Чипы беспроводной связи поставляются с регулятивным доменом по умолчанию. Если ваша точка доступа работает за пределами ограничений этого домена, вы не сможете подключиться к сети. Исправить это просто:
- установите пакет wireless-regdb;
- раскомментируйте строку с правильным кодом страны в файле
/etc/conf.d/wireless-regdom
; - перезагрузитесь — обновлённые настройки прочитаются при следующей загрузке системы.
Автоматическое подключение к VPN при загрузке системы не работает
Проблема возникает, когда система (то есть NetworkManager, запущенный от имени root) пытается установить VPN-соединение, но пароль недоступен, поскольку находится в хранилище паролей конкретного пользователя.
Решением является хранение пароля от VPN в открытом виде, как описано в шаге 2 раздела #Использование диспетчера для подключения к VPN после появления сети.
Использовать диспетчер, как описано в шаге 1, не нужно, если вы включили опцию «Автоматически подключаться к VPN» в графическом интерфейсе nm-applet
.
Замедление загрузки системы из-за журнала systemd
Некоторые пользователи замечали, что большой размер /var/log/journal
может повлиять на скорость загрузки системы при использовании NetworkManager; подробнее в разделе systemd (Русский)#Время загрузки системы увеличивается с течением времени.
Постоянные отключения беспроводной сети, задержки и потеря пакетов
NetworkManager выполняет сканирование каждые 2 минуты.
Некоторые драйверы Wi-Fi имеют проблемы при сканировании при наличии установленного подключения. Среди симптомов — отключение/переподключение VPN и потеря пакетов, веб-страницы не загружаются, а затем начинают загружаться без проблем.
Запуск journalctl -f
от имени root продемонстрирует, что это происходит: в журнале с регулярными интервалами будут появляться примерно такие сообщения:
NetworkManager[410]: <info> (wlp3s0): roamed from BSSID 00:14:48:11:20:CF (my-wifi-name) to (none) ((none))
Если роуминг беспроводных сетей не важен, периодическое сканирование можно отключить, заблокировав BSSID точки доступа в профиле подключения Wi-Fi.
Не удаётся включить Wi-Fi на ноутбуке Lenovo
Существует проблема с модулем ideapad_laptop
на некоторых моделях Lenovo, связанная с тем, что драйвер Wi-Fi неверно сообщает о наличии программной блокировки. Картой по-прежнему можно управлять с помощью netctl
, но менеджеры вроде NetworkManager ломаются. Вы можете убедиться, что проблема заключается именно в этом, проверив вывод rfkill list
после переключения аппаратного переключателя и убедившись, что программная блокировка сохраняется.
Выгрузка модуля ideapad_laptop
может помочь (осторожно, это также может отключить клавиатуру и тачпад ноутбука).
Отключение отправки имени хоста
По умолчанию NetworkManager отправляет имя хоста на DHCP-сервер. Отключить это можно только для отдельных соединений, а не глобально (Issue #584).
Чтобы отключить отправку имени хоста на DHCP-сервер для конкретного соединения, добавьте следующее в файл соединения:
/etc/NetworkManager/system-connections/''файл_нужного_соединения''
... [ipv4] dhcp-send-hostname=false ... [ipv6] dhcp-send-hostname=false ...
nm-applet пропадает в i3
Если вы используете xfce4-notifyd.service
, отредактируйте юнит, добавив следующее:
/etc/systemd/user/xfce4-notifyd.service.d/display_env.conf
[Service] Environment="DISPLAY=:0.0"
Затем выполните daemon-reload, перезагрузите службу xfce4-notifyd.service
и перезайдите в i3.
Unit dbus-org.freedesktop.resolve1.service not found
Если systemd-resolved.service
не запущен, NetworkManager попытается запустить его через D-Bus, но не сможет:
dbus-daemon[991]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.23' (uid=0 pid=1012 comm="/usr/bin/NetworkManager --no-daemon ") dbus-daemon[991]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.resolve1.service': Unit dbus-org.freedesktop.resolve1.service not found. dbus-daemon[991]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.23' (uid=0 pid=1012 comm="/usr/bin/NetworkManager --no-daemon ")
Это происходит потому, что NetworkManager будет пытаться отправить информацию о DNS в systemd-resolved независимо от настройки main.dns=
в NetworkManager.conf(5).
Это можно отключить в настройках:
/etc/NetworkManager/conf.d/no-systemd-resolved.conf
[main] systemd-resolved=false
Смотрите FS#62138.
Secrets were required, but not provided
Если при попытке подключиться к сети вы получаете ошибку:
$ nmcli device wifi connect ''SSID'' password ''пароль''
Error: Connection activation failed: (7) Secrets were required, but not provided
У этой ошибки может быть множество причин, и вам стоит почитать журнал службы (параметр -u NetworkManager
). Например, если NetworkManager слишком долго устанавливал соединение, он будет считать, что пароль неверен:
NetworkManager[1372]: <warn> [1643991888.3808] device (wlan0): Activation: (wifi) association took too long NetworkManager[1372]: <info> [1643991888.3809] device (wlan0): state change: config -> need-auth (reason 'none', sys-iface-state: 'managed') NetworkManager[1372]: <warn> [1643991888.3838] device (wlan0): Activation: (wifi) asking for new secrets
Также можно попробовать удалить соединение и создать новое:
$ nmcli connection delete SSID $ nmcli device wifi connect SSID password пароль
Ещё можно попробовать отключить рандомизацию MAC-адреса:
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device] wifi.scan-rand-mac-address=no
Подключение к сети WPA Enterprise с использованием iwd
Если вы попытаетесь подключиться к eduroam через NetworkManager с бэкендом iwd, вы получите следующую ошибку от NetworkManager:
Connection 'eduroam' is not avialable on device wlan0 because profile is not compatible with device (802.1x connections must have IWD provisioning files)
Это связано с тем, что NetworkManager не может настроить сеть WPA Enterprise. Поэтому вам нужно настроить её через файл настроек /var/lib/iwd/essid.8021x
, как описано в разделе iwd (Русский)#WPA Enterprise.
Failed to request VPN secrets
Если вы получаете ошибку:
Failed to request VPN secrets #1: No agents were available for this request.
Это может происходить из-за пустого пароля или из-за ненастроенных разрешений PolicyKit.
Соединения OpenVPN выдают ошибку «secrets: failed to request VPN secrets»
Если в настройках соединения не сохранён пароль, networkmanager-openvpn вынужден каким-то образом получить его от пользователя. Обычно это делается через графический интерфейс, для работы которого нужно установить опциональные зависимости libnma-gtk4 и/или libnma (GTK3). Если они не установлены, попытка подключения может привести к появлению такой ошибки:
NetworkManager[642]: <warn> [...] vpn[..."name_of_vpn_profile VPN"]: secrets: failed to request VPN secrets #3: No agents were available for this request.
Ошибка «ca md too weak» в соединениях OpenVPN
После обновления openssl до версии 3 сертификаты, созданные с использованием устаревших криптографических алгоритмов, по умолчанию отклоняются. Попытка использовать networkmanager-openvpn с такой настройкой может привести к появлению следующих ошибок в журнале:
nm-openvpn[14359]: OpenSSL: error:0A00018E:SSL routines::ca md too weak nm-openvpn[14359]: Cannot load certificate file /home/archie/.local/share/networkmanagement/certificates/my_issued_cert.crt nm-openvpn[14359]: Exiting due to fatal error
Самое правильное решение — попросить администратора сервера OpenVPN выпустить более безопасные сертификаты. Если это по каким-то причинам невозможно и требуется немедленное решение проблемы — OpenVPN требует tls-cipher "DEFAULT:@SECLEVEL=0"
, который нужно включить через nmcli. Также нужно включить провайдер legacy в настройках OpenSSL.
Сперва узнайте имя проблемного VPN-соединения:
$ nmcli connection show
Например, если имя vpn.example.com, выполните такую команду:
$ nmcli connection modify vpn.example.com +vpn.data tls-cipher=DEFAULT:@SECLEVEL=0
Она обновит настройки в файле /etc/NetworkManager/system-connections/vpn.example.com.nmconnection
.
Также нужно включить провайдер legacy в настройках OpenSSL, отредактировав /etc/ssl/openssl.cnf
как описано в OpenSSL wiki.
В конце раздела [provider_sect]
добавьте legacy = legacy_sect
, а в разделе [default_sect]
раскомментируйте activate = 1
. Затем добавьте раздел [legacy_sect]
со строкой activate = 1
. После внесения изменений файл должен содержать примерно такие настройки (другие настройки из этого файла опущены для краткости):
/etc/ssl/openssl.cnf
openssl_conf = openssl_init [openssl_init] providers = provider_sect [provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1
Перезапустите службу NetworkManager.service
для применения изменений.
Соединения WPA Enterprise не проходят аутентификацию с ошибкой OpenSSL «unsupported protocol»
После обновления openssl до версии 3 протоколы SSL 3, TLS 1.0, TLS 1.1 и DTLS 1.0 по умолчанию работают только на уровне безопасности 0. Попытка подключения к беспроводной сети, поддерживающей только более старые стандарты, приводит к появлению в журнале следующей ошибки:
wpa_supplicant[3320]: SSL: SSL3 alert: write (local SSL3 detected an error):fatal:protocol version wpa_supplicant[3320]: OpenSSL: openssl_handshake - SSL_connect error:0A000102:SSL routines::unsupported protocol wpa_supplicant[3320]: wlp3s0: CTRL-EVENT-EAP-FAILURE EAP authentication failed
Самое правильное решение — попросить администратора сети добавить поддержку TLS 1.3 и по возможности прекратить использование устаревших протоколов TLS 1.0/1.1, DTLS 1.0 и SSL 1-3. Если это по каким-то причинам невозможно и требуется немедленное решение проблемы — есть несколько способов разрешить TLS 1.0 и/или 1.1 по умолчанию. Один из способов — откат данного изменения в OpenSSL (). Поскольку это также снижает безопасность всех других программ, использующих уровень безопасности 1, этот способ не рекомендуется. Вместо этого можно напрямую установить уровень, используемый wpa_supplicant, как описано в BBS#286417. Чтобы изменить только затронутое соединение, в настройках соединения в разделе [802-1x]
пропишите phase1-auth-flags=32
или phase1-auth-flags=64
. Это нельзя сделать через графический интерфейс, но можно сделать через nmcli.
Сперва узнайте имя проблемного беспроводного соединения:
$ nmcli connection show
Например, если имя Example Wi-Fi и оно использует TLS 1.0, выполните такую команду:
$ nmcli connection modify 'Example Wi-Fi' 802-1x.phase1-auth-flags 32
А для TLS 1.1 укажите 64:
$ nmcli connection modify 'Example Wi-Fi' 802-1x.phase1-auth-flags 64
Команда обновит настройки в файле /etc/NetworkManager/system-connections/Example Wi-Fi.nmconnection
.
Перезапустите службу NetworkManager.service
для применения изменений.