dhcpcd (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

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

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

Установка

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

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

dhcpcd-ui-patchedAUR — улучшенная версия 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.

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