Управляем сетевыми подключениями в Linux с помощью консольной утилиты nmcli

Original author: Dave McKay
  • Translation
  • Tutorial
Используйте все возможности инструмента управления сетевыми подключениями NetworkManager в командной строке Linux c помощью утилиты nmcli.



Утилита nmcli напрямую обращается к API для доступа к функциям NetworkManager.

Она появилась в 2010 году и для многих стала альтернативным способом настройки сетевых интерфейсов и соединений. Хотя кто-то до сих пор использует ifconfig. Так как nmcli — это инструмент интерфейса командной строки (CLI), предназначенный для использования в окнах терминалов и скриптах, он идеально подходит для системных администраторов, работающих без GUI.

Синтаксис команд nmcli


В общем виде синтаксис выглядит так:

$ nmcli <options> <section> <action>

  • options — это параметры, которые определяют тонкости работы nmcli,
  • section (секция) — определяет, какими возможностями утилиты пользоваться,
  • action (действие) — позволяет указать, что, собственно, нужно сделать.

Всего существует 8 секций, каждая из которых связана с каким-то набором команд (действий):

  • Help выдаёт справку о командах ncmcli и их использовании.
  • General возвращает статус NetworkManager и глобальную конфигурацию.
  • Networking включает команды для запроса состояния сетевого подключения и включения / отключения подключений.
  • Radio включает команды для запроса состояния подключения к сети WiFi и включения / отключения подключений.
  • Monitor включает команды для мониторинга активности NetworkManager и наблюдения за изменениями состояния сетевых подключений.
  • Connection включает команды для управления сетевыми интерфейсами, для добавления новых соединений и удаления существующих.
  • Device в основном используется для изменения параметров, связанных с устройствами (например, имени интерфейса) или для подключения устройств с использованием существующего соединения.
  • Secret регистрирует nmcli в качестве «секретного агента» NetworkManager, который прослушивает тайные сообщения. Эта секция используется редко, потому что nmcli при подключении к сетям по дефолту работает именно так.

Простые примеры


Перед началом работы убедитесь, что NetworkManager запущен и nmcli может общаться с ним:

$ nmcli general
STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN    
connected  full          enabled  enabled  enabled  enabled

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

$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3
Wired connection 2  2279d917-fa02-390c-8603-3083ec5a1d3e  ethernet  enp0s8
Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9

Это команда использует действие show для секции Connection.

На тестовой машине крутится Ubuntu 20.04. В данном случае мы нашли три проводных подключения: enp0s3, enp0s8, and enp0s9.

Управление подключениями


Важно понимать, что в nmcli под термином Connection мы подразумеваем сущность, которая содержит всю информацию о соединении. Другими словами, это конфигурация сети. Connection инкапсулирует всю информацию, связанную с соединениями, включая канальный уровень и информацию об IP-адресации. Это уровень 2 и уровень 3 в сетевой модели OSI.

Когда вы настраиваете сеть в Linux, вы обычно настраиваете соединения, которые в конечном итоге будут привязаны к сетевым устройствам, которые в свою очередь являются сетевыми интерфейсами, установленными на компьютере. Когда устройство использует соединение, оно считается активным или поднятым. Если соединение не используется, то оно неактивно или сброшено.

Добавление сетевых соединений


Утилита nmcli позволяет быстро добавлять и сразу же настраивать соединения. Например, чтобы добавить Wired connection 2 (с enp0s8), нужно от имени суперпользователя запустить следующую команду:

$ sudo nmcli connection add type ethernet ifname enp0s8
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added.

В опции type мы указываем, что это будет Ethernet-соединение, а в опции ifname (interface name) указываем сетевой интерфейс, который хотим использовать.

Вот что будет после запуска команды:

$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3
Wired connection 2  2279d917-fa02-390c-8603-3083ec5a1d3e  ethernet  enp0s8
Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9
ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  --  

Создано новое соединение, ethernet-enp0s8. Ему был назначен UUID, тип подключения — Ethernet. Поднимем его с помощью команды up:

$ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

Ещё раз проверяем список активных соединений:

$ nmcli connection show --active
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3
ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  enp0s8
Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9

Добавлено новое соединение ethernet-enp0s8, оно активно и использует сетевой интерфейс enp0s8.

Настройка подключений


Утилита nmcli позволяет легко менять параметры уже существующих подключений. Например, вам нужно сменить динамический (DHCP) на статический IP-адрес.

Пусть нам нужно установить IP-адрес равным 192.168.4.26. Для этого используем две команды. Первая непосредственно установит IP-адрес, а вторая переключит метод установки IP-адреса на значение «вручную» (manual):

$ nmcli connection modify ethernet-enp0s8 ipv4.address 192.168.4.26/24
$ nmcli connection modify ethernet-enp0s8 ipv4.method manual

Не забудьте также задать маску подсети. Для нашего тестового подключения это 255.255.255.0, или с /24 для бесклассовой маршрутизации (CIDR).

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

$ nmcli connection down ethernet-enp0s8
Connection 'ethernet-enp0s8' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
$ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveC

Если вам наоборот нужно установить DHCP, вместо manual используйте auto:

$ nmcli connection modify ethernet-enp0s8 ipv4.method auto

Работа с устройствами


Для этого мы используем секцию Device.

Проверка статуса устройств


$ nmcli device status
DEVICE  TYPE      STATE      CONNECTION        
enp0s3  ethernet  connected  Wired connection 1
enp0s8  ethernet  connected  ethernet-enp0s8    
enp0s9  ethernet  connected  Wired connection 3
lo      loopback  unmanaged  --  

Запрос информации об устройстве


Для этого используем действие show из секции Device (нужно обязательно указать имя устройства). Утилита показывает достаточно много информации, часто на нескольких страницах.
Давайте посмотрим на интерфейс enp0s8, который использует наше новое соединение. Убедимся, что оно использует ровно тот IP-адрес, который мы установили ранее:

$ nmcli device show enp0s8
GENERAL.DEVICE:                         enp0s8
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         08:00:27:81:16:20
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ethernet-enp0s8
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/6
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.4.26/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.4.0/24, nh = 0.0.0.0, mt = 103
IP6.ADDRESS[1]:                         fe80::6d70:90de:cb83:4491/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 103
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255

Информации достаточно много. Выделим главное:

  • Имя сетевого интерфейса: enp0s8.
  • Тип соединения: проводное Ethernet-соединение.
  • Мы видим MAC-адрес устройства.
  • Указан Maximum transmission unit (MTU) — максимальный размер полезного блока данных одного пакета, который может быть передан протоколом без фрагментации.
  • Устройство в данный момент подключено.
  • Имя соединения, которое использует устройство: ethernet-enp0s8.
  • Устройство использует тот IP-адрес, который мы установили ранее: 192.168.4.26/24.

Другая информация относится к дефолтным параметрам маршрутизации и шлюза соединения. Они зависят от конкретной сети.

Интерактивный редактор nmcli


У nmcli также имеется простенький интерактивный редактор, в котором кому-то работать может быть комфортнее. Чтобы запустить его, например, для соединения ethernet-enp0s8, используйте действие edit:

$ nmcli connection edit ethernet-enp0s8

У него также есть небольшая справка, которая, правда, уступает по размеру консольной версии:

===| nmcli interactive connection editor |===
Editing existing '802-3-ethernet' connection: 'ethernet-enp0s8'
Type 'help' or '?' for available commands.
Type 'print' to show all the connection properties.
Type 'describe [<setting>.<prop>]' for detailed property description.
You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy
nmcli>

Если вы введёте команду print и нажмёте Enter, nmcli отобразит все свойства соединения:

===============================================================================
                 Connection profile details (ethernet-enp0s8)
===============================================================================
connection.id:                          ethernet-enp0s8
connection.uuid:                        09d26960-25a0-440f-8b20-c684d7adc2f5
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              enp0s8
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
connection.auth-retries:                -1
connection.timestamp:                   1593967212
connection.read-only:                   no
connection.permissions:                 --
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 --

Например, чтобы задать для подключения свойство DHCP, введите goto ipv4 и нажмите Enter:

nmcli> goto ipv4
You may edit the following properties: method, dns, dns-search, 
dns-options, dns-priority, addresses, gateway, routes, route-metric, 
route-table, routing-rules, ignore-auto-routes, ignore-auto-dns, 
dhcp-client-id, dhcp-iaid, dhcp-timeout, dhcp-send-hostname, 
dhcp-hostname, dhcp-fqdn, dhcp-hostname-flags, never-default, may-fail, 
dad-timeout
nmcli ipv4>

Затем пропишите set method auto и нажмите Enter:

nmcli ipv4> set method auto
Do you also want to clear 'ipv4.addresses'? [yes]:

Если вы хотите очистить статический IP-адрес, нажмите Enter. В противном случае введите no и нажмите Enter. Вы можете сохранить его, если думаете, что он понадобится вам в будущем. Но даже с сохраненным статическим IP-адресом будет использован DHCP, если method установлен в значение auto.

Используйте команду save, чтобы сохранить изменения:

nmcli ipv4> save
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully updated.
nmcli ipv4>

Введите quit, чтобы выйти из Интерактивного редактора nmcli. Если передумали выходить — используйте команду back.

И это далеко не всё


Откройте Интерактивный редактор nmcli и посмотрите, сколько существует настроек и сколько свойств имеет каждая настройка. Интерактивный редактор — отличный инструмент, но, если вы хотите использовать nmcli в однострочниках или скриптах, вам понадобится обычная версия для командной строки.

Теперь, когда у вас есть основы, ознакомьтесь со справочной страницей nmcli, чтобы узнать, чем ещё она может вам помочь.



На правах рекламы


Эпичные серверы — это виртуальные серверы на Windows или Linux с мощными процессорами семейства AMD EPYC и очень быстрыми NVMe дисками Intel. Спешите заказать!

VDSina.ru
Серверы в Москве и Амстердаме

Comments 15

    0
    То есть вы написали огромную статью, а как подключиться к wifi-сети так и не написали? )
      –1
      Все хорошо, но сдается мне, что на станции без GUI NetworkManager — не нужен.

      netplan и ip — практически все что нужно.
        +1
        netplan — это нечто со странным синтаксисом, что используется в Ubuntu?
        А зачем использовать дополнительные программы, если у вас наверняка в качестве init Systemd?
        Создаем файл /etc/systemd/network/eth0.network, в нем пишем:
        [Match]
        Name=eth0

        [Network]
        DHCP=yes

        Затем sudo systemctl restart systemd-networkd и мы получили адрес по DHCP на интерфейс, вот и все. Если дать команду networkctl, можно увидеть, какие из интерфейсов управляются systemd.
          0
          Полностью согласен — можно и без netplan обойтись.

          Но речь то была в основном про то, что на терминал-онли машине NetworkManager — не нужен. Надеюсь по этому у вас возражений нет?
          0
          Есть ещё nmtui, да и netplan ваш не умеет в туннели, на кой он вообще нужен. Что на серверах: 4 интерфейса, 2 бондинга, линуксовые мосты, openvswitch мосты и подключения, vpnc, openconnect, openvpn, strongswan, ssh tunnel, pptp, sstp, fortisslvpn, wareguard, softether. Всем этим зоопарком подключений на серверах и рабочих станциях проще единообразно управлять.
            –3
            Если у вас на сервере такой зоопарк, то ИМХО у вас что-то не правильно в архитектуре сети…
            0

            Не согласен!
            "....NetworkManager — не нужен." — так правильно и GUI тут непричём.
            Меня откровенно бомбит когда делают всякие надстроечки, причиндалинки, костылики и прочее что ломает стройную и правильную логику работы через CLI; поясню, я согласен на всякие GUI дела, которые не ломают логику работы через CLI. Ну то-есть если человек не любит CLI он может пользоваться GUI… мы же все разные, не все любят в черный (/зеленый) экран смотреть… и наоборот, если человеку удобней при установленом GUI пользоваться консолью — ок, пользуйся.
            Но когда появляются какие-то "костыли" GUI которые влияют на работу в привычном CLI — я немного закипаю.
            "NetworkManager" — классический тому пример.

              0
              Ага, вы не разобрались, так же и системд хейтите.
            0
            Статья понравилось, спасибо.
            Есть какой-то универсальный способ узнать какой networking manager используется на машине?
              0
              Network Manager это название софта. Вы можете узнать его версию, запустив nmcli --version
              0
              «Синтаксис команд ncmli „
              “$ nmcli »
              «Help выдаёт справку о командах ncmcli и их использовании.»
              «Secret регистрирует nmcli в качестве»

              ну так вы с названием утилиты определились уже?
                +1

                Вот никогда бы не подумал, что буду пользоваться nmcli, и как раз несколько дней назад на новом месте жительства обнаружилась нестабильнось WiFi у моего ноутбука. Короче, пока разбирался с этой проблемой, то решал пропадание соединения вот таким образом:


                ~$ ping -c 1 8.8.8.8 || { nmcli c d <ssid> && nmcli c u <ssid> }

                (Здесь стоит упомянуть опущенный в статье нюанс, что nmcli, как утилита для реальных таких сетевиков, позволяет писать команды в сокращённом виде, т.е. c u|d = connection up|down.)


                В итоге выяснилось, что Qualcomm Atheros QCA6174 на моём Dell XPS 13 9370 плохо работает на 5GHz в жаркую летнюю погоду. В тот момент я переключил соединение на 2.4 GHz через графический nm-connection-editor. А теперь смотрю, что мог бы использовать тот же nmcli (см. ниже). При этом очень приятно удивляет, что как в bash, так и в самом nmcli работает автодополнение по [TAB] как команд nmcli, так и названий соединения, параметров и т.п. Ну просто ваще удобно!


                Короче, открыл для себя nmcli на практике. Спасибо! :)


                # Реальные SSID'ы / UUID'ы заменёны на `<ssid>`, а нажатия Tab для автодополнения обозначены как `[TAB]`):
                $ nmcli c e <ssid>
                
                ===| nmcli interactive connection editor |===
                
                Editing existing '802-11-wireless' connection: '<ssid>'
                
                Type 'help' or '?' for available commands.
                Type 'print' to show all the connection properties.
                Type 'describe [<setting>.<prop>]' for detailed property description.
                
                You may edit the following settings: connection, 802-11-wireless (wifi), 802-11-wireless-security (wifi-sec), 802-1x, ethtool, match, ipv4, ipv6, tc, proxy
                nmcli> s [TAB]
                802-11-wireless-security (wifi-sec)  connection
                802-11-wireless (wifi)               ethtool
                802-1x    
                nmcli> s wifi. [TAB]
                band                       mode
                bssid                      mtu
                channel                    powersave
                cloned-mac-address         rate
                generate-mac-address-mask  seen-bssids
                hidden                     ssid
                mac-address                tx-power
                mac-address-blacklist      wake-on-wlan
                mac-address-randomization 
                nmcli> s wifi.band [TAB]
                a   bg  
                nmcli> s wifi.band bg
                Warning: 802-11-wireless.band set to 'bg', but it might be ignored in infrastructure mode
                nmcli> sa
                Connection '<ssid>' (<uuid>) successfully updated.
                nmcli> q
                $
                  0

                  А управлять WireGuard через эту утилиту можно?

                    +1
                    Конечно, Нетворк менеджер поддерживает туннели wireguard.
                    0

                    Ну, nmcli это как скальпель, ни колбаски покрошить, не консерву не вскрыть. Великолепный инструмент сетевых хирургов. Если ты не сетевой хирург, то nmtui.

                    Only users with full accounts can post comments. Log in, please.