dhcpcd (Русский) - ArchWiki

# dhcpcd (Русский)

Ссылки по теме

- Настройка сети
- Настройка беспроводной сети
- dhcpd (Русский)

dhcpcd — свободная реализация клиента DHCP и DHCPv6. На данный момент является наиболее развитым DHCP-клиентом с открытым исходным кодом. Полный список возможностей вы можете найти на домашней странице проекта.

Обратите внимание: Не путайте dhcpcd — DHCP-клиент и dhcpd, который является DHCP-сервером.

## Установка

Установите пакет dhcpcd, доступный в официальных репозиториях. Он является частью группы base, поэтому, скорее всего он уже установлен в вашей системе.

Также с пакетом dhcpcd-ui (доступен в AUR) вы можете установить графическую оболочку GTK+ для демона dhcpcd (и, опционально, для wpa_supplicant). Он предоставляет диалоговую панель для настройки и позволяет вводить данные для подключения к беспроводным сетям.

## Запуск

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

- служба `dhcpcd.service` запускает клиент для всех сетевых интерфейсов.
- служба `dhcpcd@.service` может использоваться для запуска клиента на отдельном сетевом интерфейсе, например: `dhcpcd@eth0.service`.

Чтобы запустить dhcpcd вручную, просто наберите:

    # dhcpcd eth0

    dhcpcd: version 5.1.1 starting
    dhcpcd: eth0: broadcasting for a lease
    ...
    dhcpcd: eth0: leased 192.168.1.70 for 86400 seconds

Совет: Если вы выбрали `dhcpcd.service` и он не запускается, смотрите раздел #dhcpcd.service конфликтует с udev при старте системы.

## Настройка

Основная часть настроек выполняется в файле `/etc/dhcpcd.conf`. Некоторые наиболее используемые опции описаны далее. Подробнее о структуре файла и его содержании смотрите в `man 5 dhcpcd.conf`.

### Статические маршруты

Если вы хотите, чтобы при подключении добавлялись статические маршруты, создайте новый хук-скрипт в `/usr/lib/dhcpcd/dhcpcd-hooks` и напишите в нем команды для добавления маршрутов. Например, чтобы добавить маршрут в подсети `10.11.12.0/24` через шлюз `192.168.192.5`:

    /usr/lib/dhcpcd/dhcpcd-hooks/40-vpnroute

    ip route add 10.11.12.0/24 via 192.168.192.5

Префикс `40` использован для того, чтобы данный скрипт отрабатывал после уже имеющихся хук-скриптов.

### Идентификатор клиента

Сервер DHCP может однозначно идентифицировать клиента посредством различных параметров:

- имя хоста (в частности то имя, которое отправляет клиент),
- MAC-адрес сетевого адаптера клиента через который проходит соединение,
- Identity Association ID (IAID),
- DHCP Unique Identifier (DUID).

Подробнее смотрите в RFC 3315.

В зависимости от настроек DHCP-сервера, какие-то из этих параметров могут быть обязательными, а другие — опциональными.

Обратите внимание: Стандартной конфигурации dhcpcd в большинстве случаев будет достаточно. Указанные параметры определяются автоматически и ручная настройка обычно требуется только при возникновении проблем.

Если при использовании стандартных настроек не удается получить IP, для настройки вы можете использовать следующие опции в `dhcpcd.conf`:

- `hostname` — отправляет имя хоста (берется из `/etc/hostname`).
- `clientid` — отправляет MAC-адрес интерфейса в качестве идентификатора.
- `iaid имя_интерфейса` — извлекает IAID для интерфейса, указанного в опции `interface имя_интерфейса`. Обе эти опции должны присутствовать одновременно, дополнительно смотрите это обсуждение.
- `duid` — указывает dhcpcd использовать из DUID и IAID в качестве идентификатора.

Значение DUID устанавливается в `/etc/dhcpcd.duid`. Для эффективной работы DHCP важно, чтобы это значение было уникальным для конкретной системы, и устанавливалось одинаковым на все сетевые интерфейсы. В свою очередь, IAID представляет собой уникальный идентификатор для каждого сетевого интерфейса в отдельности (смотрите подробнее в RFC 4361).

При использовании Dynamic DNS особенно необходимо удостовериться в уникальности этих идентификаторов. Если в сети находятся два DNS-клиента с одинаковыми DUID, они будут конфликтовать, поочередно отнимая друг у друга аренду DNS-записи. Это может произойти, например, в случае, если была сделана копия виртуальной машины с другими именем хоста и MAC-адресом адаптера, но DUID в настройках остался прежним.

### Ускорение DHCP отключением ARP-сканирования

dhcpcd, следуя рекомендациям стандарта DHCP (RFC2131, раздел 2.2), проверяет при помощи запросов ARP, что присвоенный IP-адрес не используется каким-нибудь другим устройством в сети. Как правило, для небольших домашних сетей в этом нет необходимости, поэтому вы можете ускорить соединение dhcpcd примерно на 5 секунд, добавив в `/etc/dhcpcd.conf` строку:

    noarp

Того же эффекта можно достичь, запуская dhcpcd с опцией `--noarp`.

### Запасной статический профиль

Вы можете настроить статические параметры IP в dhcpcd, которые будут использоваться в качестве резервных, если не удалось получить аренду от сервера. Это полезно для автономных устройств, к которым обычно есть доступ только по сети (например, Raspberry Pi) для того, чтобы не потерять возможность с ними соединиться.

В следующем примере создается профиль `static_eth0` с IP `192.168.1.1` и адресом шлюза и DNS `192.168.1.23`, который устанавливается как запасной для `eth0`:

    /etc/dhcpcd.conf

    # define static profile
    profile static_eth0
    static ip_address=192.168.1.1
    static routers=192.168.1.23
    static domain_name_servers=192.168.1.23

    # fallback to static profile on eth0
    interface eth0
    fallback static_eth0

Возможны также более сложные варианты настройки, например, совмещение с опцией `arping`. Подробнее смотрите в `dhcpcd.conf(5)`.

## Хуки

dhcpcd запускает все скрипты в каталоге `/usr/lib/dhcpcd/dhcpcd-hooks/` в последовательности, определенной стандартным порядком сортировки. Более подробно смотрите в `dhcpcd(5)` и `dhcpcd-run-hooks(8)`.

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

- Каждый скрипт можно отключить при помощи опции `nohook` в `dhcpcd.conf`.
- Опция `env` позволяет установить переменные окружения для всех хуков. Например, вы можете заставить хук `30-hostname` всегда устанавливать имя хоста, указав `env force_hostname=YES`.

Эта статья или раздел нуждается в расширении

Причина: Необходимо добавить описание стандартных хуков. (Обсудить)

### 10-wpa_supplicant

Хук `10-wpa_supplicant` автоматически запускает WPA supplicant для беспроводных интерфейсов. Это происходит только если:

- процесс wpa_supplicant еще не запущен на данном интерфейсе
- существует файл настроек wpa_supplicant. dhcpcd проверяет следующие пути:

    /etc/wpa_supplicant/wpa_supplicant-"$interface".conf
    /etc/wpa_supplicant/wpa_supplicant.conf
    /etc/wpa_supplicant-"$interface".conf
    /etc/wpa_supplicant.conf

в указанном порядке. Вы можете указать свой список путей, используя опцию `env wpa_supplicant_conf=путь` в `/etc/dhcpcd.conf`.

Обратите внимание: Хук использует первый файл настроек, который ему удастся найти, и не будет принимать во внимание остальные. Имейте это в виду, если у вас несколько файлов настроек wpa_supplicant.

Если вы самостоятельно подключаетесь к беспроводным сетям с помощью wpa_supplicant, этот хук может приводить к нежелательным попыткам подключения. Например, если вы остановили wpa_supplicant, он может вновь включить сетевой интерфейс. Также, если вы используете netctl-auto, wpa_supplicant будет запускаться автоматически с использованием файла настроек `/run/network/wpa_supplicant_"$interface".conf`, поэтому запуск из хука будет излишним и приведет лишь к появлению ошибок в логе при чтении стандартного файла `/etc/wpa_supplicant/wpa_supplicant.conf`, который содержит лишь примеры и может не являться корректным с точки зрения программы.

Чтобы выключить хук, добавьте `nohook wpa_supplicant` в `dhcpcd.conf`.

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

### Освобождение арендованного IP-адреса

Файл аренды `/var/lib/dhcpcd/dhcpcd-имя_интерфейса.lease` (где `имя_интерфейса` — имя сетевого интерфейса, для которого имеется назначенный в аренду IP-адрес) содержит последний ответ на запрос аренды, полученный от DHCP-сервера. Он используется для того, чтобы сохранить адрес и срок аренды (атрибут `mtime`). По истечении срока IP-адрес из файла запрашивается снова у DHCP-сервера, и, если адрес свободен, он снова присваивается сетевому интерфейсу клиента. Если вы не хотите, чтобы использовался тот же IP-адрес, просто удалите этот файл и перезапустите dhcpcd.

## Решение проблем

### Client ID

Если у вас сеть с DHCPv4, которая фильтрует Client ID, основанные на MAC-адресах, вам скорее всего нужно изменить строку

    /etc/dhcpcd.conf

    # Use the same DUID + IAID as set in DHCPv6 for DHCPv4 Client ID as per RFC4361.
    duid

на

    /etc/dhcpcd.conf

    # Use the hardware address of the interface for the Client ID (DHCPv4).
    clientid

иначе вы не сможете получать аренду от DHCP, если он не может правильно прочесть ваш Client ID DHCPv6. Подробнее смотрите в RFC 4361.

### Освобождение аренды IP-адреса

Иногда происходит нежелательное присвоение IP-адреса. Например, когда два маршрутизатора соединены вместе через VPN-канал, и второй маршрутизатор через этот канал присваивает IP клиенту. Чтобы это исправить, освободите IP-адрес, выполнив:

    # dhcpcd -k

Теперь попробуйте снова:

    # dhcpcd

Вероятно, желаемого результата не удастся добиться с первого раза.

### Не удается подключиться к маршрутизатору

С некоторыми маршрутизаторами может возникать проблема, когда к ним не удается подключиться при помощи dhcpcd. Для того, чтобы это исправить, закомментируйте или удалите строку

    require dhcp_server_identifier

в файле настроек `/etc/dhcpcd.conf`. Обратите внимание, что это может вызвать новые проблемы, если в вашей сети находятся несколько DHCP-серверов; смотрите эту страницу для получения дополнительной информации.

### dhcpcd.service конфликтует с udev при старте системы

`dhcpcd.service` может быть Systemd (Русский)#включен без указания сетевого интерфейса. Однако, это может создать т. н. состояние гонки (конфликт) с systemd-udevd в момент загрузки системы, когда systemd-udevd пытается назначить интерфейсу постоянное имя:

    error changing net interface name wlan0 to wlp4s0: Device or resource busy

Чтобы избежать этого, запускайте dhcpcd для каждого конкретного сетевого интерфейса отдельно, как описано в разделе #Запуск.

### Время ожидания

Если dhcpcd работает на одном сетевом интерфейсе и ему не удается получить аренду в течение 30 секунд (например, если сервер еще не готов), процесс просто выведет сообщение об ошибке и завершится. Чтобы заставить dhcpcd ожидать бесконечно, добавьте опцию `timeout` со значением `0`:

    /etc/systemd/system/dhcpcd@.service.d/timeout.conf

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dhcpcd -w -q -t 0 %I

Не забудьте перезагрузить конфигурацию systemd.

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

- dhcpcd(8)
- dhcpcd.conf(5)

Categories:

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