dhcpcd (Русский)

Ссылки по теме
Настройка сети
Настройка беспроводной сети
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-ui
AUR
—
GTK
-интерфейс для
dhcpcd
; в качестве альтернативы можно использовать
wpa_supplicant
. Среди возможностей — диалог настройки и выбор кодовой фразы для беспроводной сети.
dhcpcd-ui-patched
AUR
[
ссылка недействительна
: package not found]
— улучшенная версия
dhcpcd-ui
AUR
. 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-клиент по одному из следующих идентификаторов:
Имя хоста.
MAC-адрес сетевого интерфейса, с которого устанавливается соединение.
Identity Association ID (IAID), который представляет из себя некую абстракцию для удобства работы с различными настройками и/или интерфейсами в пределах конкретного хоста.
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)