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

Jump to content

# dhcpcd (Русский)

From ArchWiki

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

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

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

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

Примечание DHCP-клиент dhcpcd (DHCP client daemon), разработанный Роем Марплесом (Roy Marples), не следует путать с DHCP-сервером dhcpd (DHCP (server) daemon) производства Internet Systems Consortium.

## Установка

Установите пакет dhcpcd.

dhcpcd-uiAUR — GTK-интерфейс для dhcpcd; в качестве альтернативы можно использовать wpa_supplicant. Среди возможностей — диалог настройки и выбор кодовой фразы для беспроводной сети.

dhcpcd-ui-patchedAUR[ссылка недействительна: package not found] — улучшенная версия dhcpcd-uiAUR. AppIndicator вместо GtkStatusIcon, поддержка gtk3, иконка трея для KDE.

## Запуск

Запустите/включите службу `dhcpcd.service`. Этот демон работает одновременно для всех сетевых интерфейсов.

Если необходим демон для одного конкретного интерфейса, запустите/включите юнит-шаблон `dhcpcd@интерфейс.service`. Узнать имена имеющихся в системе сетевых интерфейсов можно по рекомендациям в Настройка сети#Обнаружение сетевых интерфейсов.

Рекомендуется использовать юниты-шаблоны; подробнее см. #dhcpcd и сетевые интерфейсы systemd. В результате запуска любой из служб интерфейсу присваивается динамический IP-адрес. Привязка статического адреса рассмотрена в разделе #Статический профиль.

## Настройка

Основной файл настроек — `/etc/dhcpcd.conf`. Некоторые полезные опции описаны ниже, подробнее см. dhcpcd.conf(5).

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

Если необходимо создать статический маршрут на клиентской машине, добавьте его в файл `/etc/dhcpcd.exit-hook`. Ниже приведён пример хук-скрипта, который добавляет маршрут к VPN-подсети `10.11.12.0/24` через шлюз на адресе `192.168.192.5`:

    /etc/dhcpcd.exit-hook

    ip route add 10.11.12.0/24 via 192.168.192.5

В этом файле можно указать несколько машрутов одновременно.

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

Сервер опознаёт DHCP-клиент по одному из следующих идентификаторов:

1. Имя хоста.
2. MAC-адрес сетевого интерфейса, с которого устанавливается соединение.
3. Identity Association ID (IAID), который представляет из себя некую абстракцию для удобства работы с различными настройками и/или интерфейсами в пределах конкретного хоста.
4. DHCP Unique Identifier (DUID).

Более подробное описание можно найти в RFC 3315.

В зависимости от настроек DHCP-сервера те или иные параметры являются (не)обязательными в запросе на аренду адреса.

Примечание Стандартных настроек dhcpcd обычно вполне достаточно для корректной работы. Перечисленные выше идентификаторы определяются автоматически, и ручная настройка требуется только в случае каких-либо проблем.

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

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

Значение DUID задаётся в файле `/var/lib/dhcpcd/duid`. Чтобы DHCP-аренда завершилась успешно, DUID должен быть уникален в пределах системы и применяться ко всем интерфейсам, в то время как IAID задаётся для каждого сетевого интерфейса по отдельности (см. RFC 4361).

Отдельно необходимо упомянуть о сетях с динамическим DNS — убедитесь, что все три идентификатора являются уникальными. Если DNS-сервер получит два одинаковых DUID (например, в виртуальной машине уникальны имя хоста и MAC, но DUID такой же, как и у основной системы), то второй запрос удалит предыдущий из соответствующей DNS-записи.

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

Смысл параметров объясняется в статье Настройка сети. Чаще всего используются: название сетевого интерфейса, IP-адрес хоста, а также адреса сервера имён и маршрутизатора/шлюза.

Настройки статического профиля хранятся в файле `/etc/dhcpcd.conf`:

    /etc/dhcpcd.conf

    interface eth0
    static ip_address=192.168.0.10/24
    static routers=192.168.0.1
    static domain_name_servers=192.168.0.1 8.8.8.8

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

#### Резервный профиль

Помимо статического профиля можно создать также запасной профиль на случай, если запрос DHCP-аренды завершится неудачно. Это особенно полезно для headless-систем, когда статический профиль выступает в качестве профиля "режима восстановления", чтобы гарантировать доступ к машине в любой ситуации.

В примере ниже сначала настраивается профиль `static_eth0` для адреса `192.168.1.23`, с шлюзом и сервером имён `192.168.1.1`; затем профиль объявляется резервным для интерфейса `eth0`.

    /etc/dhcpcd.conf

    # настройки статического профиля
    profile static_eth0
    static ip_address=192.168.1.23/24
    static routers=192.168.1.1
    static domain_name_servers=192.168.1.1

    # резервный профиль для интерфейса eth0
    interface eth0
    fallback static_eth0

## Хуки

dhcpcd исполняет сценарии из каталога `/usr/lib/dhcpcd/dhcpcd-hooks/` в лексическом порядке. Подробнее см. dhcpcd.conf(5) и dhcpcd-run-hooks(8).

Примечание

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

### 10-wpa_supplicant

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

    # ln -s /usr/share/dhcpcd/hooks/10-wpa_supplicant /usr/lib/dhcpcd/dhcpcd-hooks/

Хук `10-wpa_supplicant` автоматически запускает wpa_supplicant для беспроводного интерфейса, если:

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

    /etc/wpa_supplicant/wpa_supplicant-интерфейс.conf
    /etc/wpa_supplicant/wpa_supplicant.conf
    /etc/wpa_supplicant-интерфейс.conf
    /etc/wpa_supplicant.conf

Можно также добавить свой файл настроек параметром `env wpa_supplicant_conf=путь_к_файлу_нестроек` в файле `/etc/dhcpcd.conf`.

Примечание Учитите, что хук воспользуется первым подходящим файлом из списка и не станет проверять остальные.

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

Чтобы отключить хук, удалите созданную ранее символическую ссылку или добавьте строку `nohook wpa_supplicant` в файл `dhcpcd.conf`.

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

### Отключение ARP-зондирования для ускорения DHCP

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

    noarp

Того же можно добиться опцией `--noarp` при запуске dhcpcd. ARP-зондирование будет отключено и соединения в DHCP-сетях станут создаваться быстрее.

### Удаление DHCP-аренды

Файл `/var/lib/dhcpcd/интерфейс.lease` содержит текущую аренду, выданную интерфейсу DHCP-сервером. В случае беспроводного интерфейса файл будет называться `/var/lib/dhcpcd/интерфейс-ssid.lease`, где `ssid` — название беспроводной сети. Время предоставления аренды определяется по параметру файла `mtime` (время последнего изменения). Информация о последней аренде нужна, чтобы заправшивать один и тот же IP-адрес при каждой аренде — при условии, конечно, что он не был выдан другой машине на момент запроса. Если такое поведение DHCP-клиента вам не нужно, просто удалите данный файл.

Если после удаления файла DHCP-сервер продолжает выдавать тот же IP-адрес, причина может быть в том, что он настроен опознавать клиентские машины по идентификатору DUID (см. #Идентификатор DHCP-клиента). Чтобы это проверить, остановите dhcpcd и удалите/переименуйте файл `/var/lib/dhcpcd/duid`. dhcpcd сгенерирует новый при следующем запуске.

Имейте в виду, что DUID — постоянный идентификатор машины, он не меняется при перезагрузках и даже в случае смены сетевых интерфейсов. Если при переносе системы на другой компьютер скопировать файл `/var/lib/dhcpcd/duid`, то DHCP-сервер опознает машину как предыдущую.

### Разные IP-адреса на машине с несколькими ОС

Если на вашей машине помимо Arch установлена OS X или Windows и вы хотите, чтобы IP-адреса в этих операционных системах были разные, то необходимо в каждой ОС задать отдельный DUID.

В Windows (после XP) DUID хранится в ключе реестра

    \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Dhcpv6DUID

В OS X он доступен непосредственно в `Network\adapter\dhcp preferences panel`.

Если вы используете DHCP-сервер dnsmasq, разные DUID можно настроить правилами `dhcp-host=` в настройках.

### /etc/resolv.conf

Если работает resolvconf, то вся DNS-информация будет пересылаться ему. В противном случае dhcpcd внесёт некоторые изменения в файл `/etc/resolv.conf`.

Чтобы предотвратить перезапись файла `/etc/resolv.conf`, отключите хук `/usr/lib/dhcpcd/dhcpcd-hooks/20-resolv.conf`. Для этого добавьте следующую строку в конец файла `/etc/dhcpcd.conf`:

    nohook resolv.conf

В качестве альтернативы можно создать файл `/etc/resolv.conf.head` со списком необходимых DNS-серверов. dhcpcd вставит этот файл в начало `/etc/resolv.conf`.

Также можно настроить dhcpcd на постоянное использование одних и тех же DNS-серверов. Добавьте следующую строку в `/etc/dhcpcd.conf`, заменив `ip_адреса_dns_серверов` списком разделённых пробелами адресов:

    static domain_name_servers=ip_адреса_dns_серверов

Например, DNS-сервера Google:

    static domain_name_servers=8.8.8.8 8.8.4.4

Совет При работе через openresolv можно также настроить DNS-сервера в файле `/etc/resolvconf.conf`. В этом случае они не будут перезаписаны никакими другими программами, использующими resolvconf.

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

### Client ID

Если вы работаете в DHCPv4-сети с фильтрацией Client ID по MAC-адресам, возможно, придётся изменить строку

    /etc/dhcpcd.conf

    # Связка DUID + IAID (DHCPv6) по RFC4361.
    duid

на

    /etc/dhcpcd.conf

    # Client ID на основе аппаратного адреса интерфейса (DHCPv4).
    clientid

В противном случае вы не получите аренду, поскольку сервер не распознает DHCPv6-идентификатор. Подробнее см. RFC 4361.

### Отказ от IP-адреса

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

    # dhcpcd -k

после чего запросить новый:

    # dhcpcd

Возможно, эти две команды придётся повторить несколько раз.

### Проблемы с нестандартными маршрутизаторами

Некоторые (нестандартные) маршрутизаторы не смогут устанавливать соединения, если не закомментирована строка

    require dhcp_server_identifier

в файле `/etc/dhcpcd.conf`. Если в сети несколько DHCP-серверов (что встречается редко), то указанная проблема не проявляется; подробнее см. здесь.

### dhcpcd и сетевые интерфейсы systemd

Удобство службы `dhcpcd.service` заключается в том, что она включается не для конкретного указанного интерфейса, а для всех интерфейсов сразу. С другой стороны, это может создать ситуацию гонок при загрузке, если systemd-udevd попытается присвоить предсказуемые имена интерфейсам:

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

Чтобы этого избежать, следует запускать dhcpcd для отдельных интерфейсов как описано в разделе #Запуск. Следует помнить, однако, что юнит-шаблон не поддерживает "горячее подключение" проводных соединений и завершится неудачно, если сетевой кабель не воткнут. Обходное решение описано в разделе #Отмена тайм-аута.

Кроме того, можно использовать параметры `denyinterfaces` и `allowinterfaces` в файле dhcpcd.conf(5), чтобы запретить dhcpcd выполнять привязку к интерфейсам, имена которых установлены ядром, а не udev:

    denyinterfaces wlan* eth*

### Отмена тайм-аута

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

Чтобы dhcpcd ожидал бесконечно при каждом запуске, отредактируйте юнит, установив параметр `timeout` в значение `0`:

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

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

Чтобы dhcpcd ожидал аренду вообще всегда, настройте перезапуск юнита после завершения работы:

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

    [Service]
    Restart=always

## Известные проблемы

### Медленная загрузка из-за dhcpcd@.service

По умолчанию служба `dhcpcd@.service` ожидает выдачи IP-адреса перед переходом в фоновый режим (флаг `-w` команды dhcpcd). Если юнит включён, то загрузка системы может затянуться из-за ожидания IP-адреса. Чтобы это исправить, создайте drop-in файл юнита следующего содержания:

    /etc/systemd/system/dhcpcd@.service.d/no-wait.conf

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dhcpcd -b -q %I

См. также FS#49685.

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

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

Categories:

- DHCP (Русский)
- Commands (Русский)

Hidden category:

- Pages with broken package links

dhcpcd (Русский)
Add topic