# netctl (Русский)

netctl - это инструмент командной строки, используемый для настройки и управления сетевыми подключениями через профили. Это нативный проект, призванный заменить устаревшую утилиту netcfg.

## Установка

Пакет netctl доступен в официальном репозитории. Установка netctl заменит netcfg.

netctl и netcfg - конфликтующие пакеты. Есть вероятность потери соединения после установки netctl, если ваши профили некорректно настроены.

Обратите внимание: Чтобы убедиться, что не запущены другие сервисы по настройке сети, стоит выполнить `systemctl --type=service`. Различные сетевые сервисы будут конфликтовать

## Обязательно к прочтению

Перед началом использования netctl желательно прочитать следующие страницы:

- netctl
- netctl.profile
- netctl.special

## Настройка

Для управления сетевыми соединениями `netctl` использует профили, которые расположены в `/etc/netctl/`. Примеры профилей расположены в `/etc/netctl/examples/`. В общую конфигурацию включены:

- ethernet-dhcp
- ethernet-static
- wireless-wpa
- wireless-wpa-static

Чтобы использовать пример конфигурации просто скопируйте один из них из `/etc/netctl/examples/` в `/etc/netctl/` и отредактируйте необходимым образом:

    # cp /etc/netctl/examples/wireless-wpa /etc/netctl/

Tip: Для создания профиля беспроводного соединения в `/etc/netctl/` можно выполнить `wifi-menu -o`.

Как только вы создали профиль, попробуйте установить соединение:

    # netctl start profile

Обратите внимание: Здесь profile - это имя файла профиля, и указание полного пути к файлу приведет к ошибке

Если результат выполнения команды говорит о неудаче, выполните `journalctl -xn` и `netctl status profile` для выяснения причин. Выполните необходимую корректировку конфигурации и повторите попытку.

### Автоматизация

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

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

#### Основной метод

Этим методом можно запустить только один профиль на интерфейс. Сначала проверьте, может ли профиль быть запущен:

    # netctl enable profile

Эта команда создаст и активирует systemd-сервис, который будет автоматически запускать профиль при загрузке.

Обратите внимание: Соединение будет установлено только в том случае, если профиль запускается во время загрузки системы (или запуска сервиса). Это значит, что во время загрузки сетевой кабель должен быть подключен, а беспроводная сеть доступна
Tip: Чтобы запустить профиль со статическим IP на проводном интерфейсе независимо от того, подключен кабель или нет, добавьте `SkipNoCarrier=yes` в файл профиля

#### Автоматическое переключение профилей

Для автоматического переключения профилей netcl предоставляет два специальных systemd-сервиса:

- Для проводных соединений: `netctl-ifplugd@interface.service`. Профиль измненятся при отключении и подключении кабеля.
- Для беспроводных соединений: `netctl-auto@interface.service`. Порфиль изменятся при переходе из диапазона одной сети в диапазон другой.

Сначала установите необходимые пакеты:

- Пакет wpa_actiond требуется сервисом `netctl-auto@interface.service`
- Пакет ifplugd требуется сервисом `netctl-ifplugd@interface.service`

Обратите внимание: netcfg использовал `net-auto-wireless.service` и {{|net-auto-wired.service}} для этих целей.

Теперь настройте профили, которые должны будут запускаться в `netctl-auto@interface.service` и `netctl-ifplugd@interface.service` .

Если вы хотите, чтобы какой-то из беспроводных профилей не запускался автоматически сервисом `netctl-auto@interface.service`, то это можно явно указать в файле профиля, добавив в него `ExcludeAuto=yes`.

Приоритет запуска профиля можно установить с помощью `Priority=`. `netctl-ifplugd@interface.service` первым предпочтет профиль, который использует DHCP. Для того, чтобы сначала был запущен профиль, использующий статический IP, можно использовать `AutoWired=yes`. Подробную информацию смотрите в `netctl.profile(5)`.

Важно: С опцией `Security=wpa-config` невозможно автоматическое подключение к WPA профилю средствами netctl-auto. Вместо этого используйте `Security=wpa-configsection`

После того, как все профили настроены, активируйте сервисы с помощью systemctl:

    # systemctl enable netctl-auto@interface.service
    # systemctl enable netctl-ifplugd@interface.service

Важно:

- Юнит не запустится при загрузке системы, если один из профилей содержит ошибки, например пустую переменную `Key=`.
- Этот метод несовместим с Основным методом. Если вы ранее активировали профиль через netctl, запустите `netctl disable profile`, чтобы предотвратить запуск профиля дважды при загрузке.

### Переход с Netcfg

netctl хранит профили в `/etc/netctl/`, а не в `/etc/network.d/`, как это делал 'netcfg.

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

- Отключите сервисы ntcfg: `systemctl disable netcfg.service`.
- Удалите netcfg и установите netctl.
- Переместите файлы сетевых профилей в новую директорию.
- Переименуйте переменныей в соответствии с `netctl.profile(5)` (в основном надо привести переменные к `UpperCamelCase`, например `CONNECTION` переименовать в `Connection`)
- Убедитесь, что в переменной `Address` профиля со статическим IP прописана маска подсети после IP адреса (из образца файла профиля: `Address=('192.168.1.23/24' '192.168.1.87/24')`)
- Если вы настраиваете беспроводное соединение по образцу `wireless-wpa-configsection`, обратите внимание, что это перезапишет опции `wpa_supplicant`, определенные выше в скобках. Для подключения к скрытой беспроводной сети добавьте `scan_ssid=1` к опциям в `wireless-wpa-configsection`; `Hidden=yes` здесь не действует.
- На ваше усмотрение можно удалить кавычки у переменных, для которых кавычки не обязательны.
- Выполните `netctl enable profile` для каждого профиля в старом массиве `NETWORKS`. Если не сработало, смотрите `netctl.special(7)`.
- Вместо netcfg-menu используйте `netctl list` и/или `netctl start profile`. wifi-menu остался доступным.
- В отличие от netcfg по умолчанию netctl не поднимает сетевую плату, не подключеную к другой работающей сетевой плате. Чтобы обойти этот недостаток, добавьте `SkipNoCarrier=yes` в конец вашего `/etc/netctl/profile`. Тогда, даже если, например, кабель ethernet не подключен, сервис будет запущен.

### Шифрование пароля (256-битный Pre-Shared Key)

Обратите внимание: Не смотря на "зашифрованность", ключа, который вы добавите в конфигурацию профиля, будет вполне достаточно для подключения к сети WPA-PSK. Этот метод скроет человеко-читаемый пароль, но он не предотвратит от подключения к сети кого-либо с правом на чтение этого файла.

У пользователей, не желающих, чтобы их пароль хранился в простом тексте, есть возможность использовать 256-bit Encrypted PSK, вычисляемый на основе пароля и SSID сети стандартными алгоритмами. Реализовать шифрование можно двумя способами:

- Для генерации нужных настроек в `/etc/netctl/` использовать `wifi-menu -o`.
- Ручная настройка, описанная ниже.

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

    # chmod 600 /etc/netctl/<config_file>

Вычислите ваш ключ с помощью wpa_passphrase:

    $ wpa_passphrase your_essid passphrase

    network={
      ssid="your_essid"
      #psk="passphrase"
      psk=64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
    }

Обратите внимание: Не закрывайте терминал, эта информация будет нужна далее

Во втором окне терминала скопируйте файл-образец `wireless-wpa` из каталога `/etc/netctl/examples` в `/etc/netctl`:

    # cp /etc/netctl/examples/wireless-wpa /etc/netctl/wireless-wpa

Теперь следует отредактировать `/etc/netctl/wireless-wpa`, добавив в переменную `Key` ключ, сгенерированный ранее с помощью wpa_passphrase.

В итоге профиль `wireless-wpa` будет выглядеть примерно так:

    /etc/netctl/wireless-wpa

    Description='A simple WPA encrypted wireless connection using 256-bit PSK'
    Interface=wlp2s2
    Connection=wireless
    Security=wpa
    IP=dhcp
    ESSID=your_essid
    Key=\"64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a

Обратите внимание:

- Убедитесь, что корректно использованы специальные правила расстановки кавычек (special quoting rules) для переменной `Key`, которые описаны в конце netctl.profile(5).
- Если пароль не проходит проверку, попробуйте удалить `\"` из переменной `Key`.

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

### Аналог 'netcfg-current'

По состоянию на апрель 2013 в `netctl` нет альтернативы `netcfg current`. Если вы использовали эту возможность для чего-то, вроде статус-бара тайлового оконного менеджера, теперь вы можете использовать следующее:

    # netctl list | awk '/*/ {print $2}'

или, если для подключения использовался `netctl-auto`:

    # wpa_cli -i interface status | sed -n 's/^id_str=//p'

Обратите внимание: C версии netctl-1.3 (сейчас в [testing]), в `netctl-auto` можно использовать команду `current`

    # netctl-auto current

### Eduroam

Некоторые университеты используют систему Eduroam для управления беспроводной сетью. Для подключения к такой сети может быть полезен следующий файл конфигурации:

    /etc/netctl/wlan0-eduroam

    Description='Eduroam-profile for <user>'
    Interface=wlan0
    Connection=wireless
    Security=wpa-configsection
    IP=dhcp
    WPAConfigSection=(
     'ssid="eduroam"'
     'proto=RSN'
     'key_mgmt=WPA-EAP'
     'pairwise=CCMP'
     'auth_alg=OPEN'
     'eap=PEAP'
     'identity="<user>"'
     'password="<password>"'
    )

### Объединение сетевых интерфейсов (bonding)

Из документации ядра Linux:

  The Linux bonding driver provides a method for aggregating multiple network interfaces into a single logical "bonded" interface. The behavior of the bonded interfaces depends on the mode. Generally speaking, modes provide either hot standby or load balancing services. Additionally, link integrity monitoring may be performed.

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

#### Балансировка нагрузки

Для использования bonding с netctl требуются дополнительные пакеты: ifenslave

Скопируйте `/etc/netctl/examples/bonding` в `/etc/netctl/bonding` и отредактируйте его. Например:

    /etc/netctl/bonding

    Description='Bond Interface'
    Interface='bond0'
    Connection=bond
    BindsToInterfaces=('eth0' 'eth1')
    IP=dhcp
    IP6=stateless

Теперь можно отменить старые настройки и установить запуск bonding по умолчанию. Переключитесь на новый профиль, например:

    # netctl switch-to bonding

Обратите внимание: По умолчанию для двайвера `bonding` используется политика цикличности (the round-robin policy). Что это значит можно посмотреть в документации
Tip: Чтобы проверить статус режима bonding, выполните:

    $ cat /proc/net/bonding/bond0

#### Подключение к беспроводной сети при отказе проводной

Этот пример демонстрирует, как можно использовать bonding, чтобы откатиться на беспроводную сеть при падении проводного соединения. Соединение на каждом интерфейсе обнаружено и dhcpcd срабатывает, когда производится подключение одного или обоих интерфейсов.

Потребуются дополнительные пакеты из официального репозитория: ifplugd, ifenslave и wpa_supplicant.

Сначала следует настроить драйвер `bonding` для работы с `active-backup`:

    /etc/modprobe.d/bonding.conf

    options bonding mode=active-backup
    options bonding miimon=100
    options bonding primary=eth0
    options bonding max_bonds=0

Опция `max_bonds` предотвращает ошибку `Interface bond0 already exists`.

Далее следует настроить профиль netctl для так называемого порабощения двух апаратных интерфейсов:

    /etc/netctl/failover

    Description='A wired connection with failover to wireless'
    Interface='bond0'
    Connection=bond
    BindsToInterfaces=('eth0' 'wlan0')
    IP='no'
    SkipNoCarrier='no'

Активация профиля при загрузке:

    # netctl enable failover

Настройте wpa_supplicant для ассоциации с известными сетями. Это можно сделать с помощью профиля netctl (не забывайте про `IP='no'`) и постоянного работающего сервиса wpa_supplicant, а также по запросу с использованием wpa_cli. Способы описаны на странице WPA_Supplicant_(Русский)

Создайте действие ifplugd для автоматического DHCP присвоения связанному интерфейсу:

    /etc/ifplugd/bond_dhcp.action

    #!/bin/sh

    case "$2" in
      up)
        systemctl start "dhcpcd@$1.service" && exit 0
        ;;
      down)
        systemctl stop "dhcpcd@$1.service" && exit 0
        ;;
      *)
        echo "Wrong arguments" > /dev/stderr
        ;;
    esac
    exit 1

и сделайте его исполняемым

    # chmod +x /etc/ifplugd/bond_dhcp.action

Потом создайте сервис systemd, который будет запускать ifplugd для `bond0`:

    /etc/systemd/system/net-auto-bonded@.service

    [Unit]
    Description=Provides automatic dhcp resolution for bonded failover connection
    Requires=netctl@failover.service
    After=netctl@failover.service

    [Service]
    ExecStart=/usr/bin/ifplugd -i %i -r /etc/ifplugd/bond_dhcp.action -fIns

    [Install]
    WantedBy=multi-user.target

Активируйте сервис и перезагрузите систему:

    # systemctl enable net-auto-bonded@bond0.service
    # reboot

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

## Характерные неисправности и методы их устранения

### Job for netctl@wlan(...).service failed

Иногда возникают проблемы с подключением к беспроводной сети с использованием netctl, сопровождаемые следующим сообщением:

    # netctl start wlan0-ssid

    Job for netctl@wlan0\x2ssid.service failed. See 'systemctl status netctl@wlan0\x2ssid.service' and 'journalctl -xn' for details.

При этом если сетевой интерфейс (в нашем примере wlan0) уже был запущен, в выводе journalctl -xn наблюдается следующее:

    network[2322]: The interface of network profile 'wlan0-ssid' is already up

Если сетевой интерфейс был остановлен, в выводе journalctl -xn наблюдается следующее:

    dhcpcd[261]: wlan0: ipv4_sendrawpacket: Network is down

Один из способов решения проблемы - ручная доработка проблемного профиля с указанием ForceConnect=yes и использованием dhclient в качестве клиента DHCP.

Устанавливаем dhclient:

    # pacman -S dhclient

Редактируем профиль:

    # vim /etc/netctl/wlan0-ssid

    /etc/netctl/wlan0-ssid

    ...
    ForceConnect=yes
    DHCPClient='dhclient'

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

    # netctl start wlan0-ssid

Должно заработать:)

Естественно, если используется нескольео профилей, их нужно подправить все. На свой страх и риск можно подправить также и /usr/bin/wifi-menu, чтобы вновь создаваемые им профили сразу содержали нужный патч (это аккуратно написанный и хорошо прокомментированный bash-скрипт, шаблон профиля там лежит где-то в районе 158-й строки).

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

- Анонс и официальная страница обсуждения

Categories:

- Русский
- Networking (Русский)