dhcpcd (Русский)
dhcpcd — свободная реализация клиента DHCP и DHCPv6. На данный момент является наиболее развитым DHCP-клиентом с открытым исходным кодом. Полный список возможностей вы можете найти на домашней странице проекта.
Contents
Установка
Установите пакет dhcpcd, доступный в официальных репозиториях. Он является частью группы base, поэтому, скорее всего он уже установлен в вашей системе.
Также с пакетом dhcpcd-uiAUR (доступен в AUR) вы можете установить графическую оболочку GTK+ для демона dhcpcd (и, опционально, для wpa_supplicant). Он предоставляет диалоговую панель для настройки и позволяет вводить данные для подключения к беспроводным сетям.
dhcpcd-ui-patchedAUR - патченная версия пакета dhcpcd-uiAUR. Она использует AppIndicator вместо GtkStatusIcon и компилируется с gtk3, благодаря чему имеет четкую иконку в трее при использовании с KDE.
Запуск
Вместе с 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
Настройка
Основная часть настроек выполняется в файле /etc/dhcpcd.conf
. Некоторые наиболее используемые опции описаны далее. Подробнее о структуре файла и его содержании смотрите в dhcpcd.conf(5).
Статические маршруты
Если вы хотите, чтобы при подключении добавлялись статические маршруты, создайте новый хук-скрипт в /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-сервера, какие-то из этих параметров могут быть обязательными, а другие — опциональными.
Если при использовании стандартных настроек не удается получить 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)
.
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, он может вновь включить сетевой интерфейс. Также, если вы используете 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 (Русский)#включен[broken link: invalid section] без указания сетевого интерфейса. Однако, это может создать т. н. состояние гонки (конфликт) с 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.