Linux: получение адреса по DHCP и работа с dhclient

Автор: | 30/06/2014
 

dhcp-logoДля управления адресом интерфейса по протоколу DHCP (Dynamic Host Configuration Protocol — протокол динамической настройки узла) используется утилита dhclient.

Полезные опции dhclient

-q – не выводить данные в консоли и в лог, кроме ошибок;
-1 – отправить запрос только один раз; в случае ошибки будет exit 2;
-r – освободить текущий адрес;
-lf <lease-file> – файл базы данных аренды; если не указан будет использован файл по-умолчанию /var/lib/dhclient/dhclient.leases;
-pf <pid-file>PID-файл процесса; если не указан – будет использован /var/run/dhclient.pid;
-cf <config-file> – файл конфигурации dhcp-клиента; если не указан – будет использоваться /etc/dhcp/dhclient.confCentOS его всё-же надо создавать вручную);
-s <server> – указать сервер DHCP для отправки запроса; если не указан – запрос отправляет по всей сети  255.255.255.255;
-I <dhcp-client-identifier> – указание dhcp-идентификатора клиента;
-H <host-name> – указание опции host-name в запросе к DHCP-серверу; строка host-name должна содержать только префикс имени хсота клиента, к которому сервер добавит ddns или dns имя для полчения полного FQDN-имени; нельзя использовать с опцией -F;
-F <fqdn.fqdn> – указать опцию fqdn.fqdn для отправки серверу; нельзя использовать с опцией -H; опция fqdn.fqdn определяет полное имя хоста клиента, которое сервер будет использовать для оновления DDNS;
-R <option>[,<option>...] – указать список опций, которые клиент хочет получить от сервера;  список по умолчанию содержит такие опции:

subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name, nis-domain, nis-servers, ntp-servers, interface-mtu

опция -R не добавляет список запросов к запросу по-умолчанию, а перезаписывает его;
-timeout <timeout> – указать timeout запроса вручную;
-v – подробный режим;

Полный список опций dhclient можно посмотреть тут>>> (русс), тут>>> (eng) и тут>>> (eng).

Примеры работы с dhclient

Сбросить текущий адрес:

# dhclient -r eth0
...
Jun 30 11:13:23 main-home dhclient[24157]: Internet Systems Consortium DHCP Client 4.1.1-P1
Jun 30 11:13:23 main-home dhclient[24157]: Copyright 2004-2010 Internet Systems Consortium.
Jun 30 11:13:23 main-home dhclient[24157]: All rights reserved.
Jun 30 11:13:23 main-home dhclient[24157]: For info, please visit https://www.isc.org/software/dhcp/
Jun 30 11:13:23 main-home dhclient[24157]:
Jun 30 11:13:23 main-home dhclient[24157]: Listening on LPF/eth0/08:00:27:38:f0:04
Jun 30 11:13:23 main-home dhclient[24157]: Sending on LPF/eth0/08:00:27:38:f0:04
Jun 30 11:13:23 main-home dhclient[24157]: Sending on Socket/fallback
Jun 30 11:13:23 main-home dhclient[24157]: DHCPRELEASE on eth0 to 192.168.1.1 port 67 (xid=0x41155573)

Получить адрес:

# dhclient -v eth0
...
Jun 30 11:14:08 main-home dhclient[24173]: Internet Systems Consortium DHCP Client 4.1.1-P1
Jun 30 11:14:08 main-home dhclient[24173]: Copyright 2004-2010 Internet Systems Consortium.
Jun 30 11:14:08 main-home dhclient[24173]: All rights reserved.
Jun 30 11:14:08 main-home dhclient[24173]: For info, please visit https://www.isc.org/software/dhcp/
Jun 30 11:14:08 main-home dhclient[24173]:
Jun 30 11:14:08 main-home dhclient[24173]: Listening on LPF/eth0/08:00:27:38:f0:04
Jun 30 11:14:08 main-home dhclient[24173]: Sending on LPF/eth0/08:00:27:38:f0:04
Jun 30 11:14:08 main-home dhclient[24173]: Sending on Socket/fallback
Jun 30 11:14:11 main-home dhclient[24173]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8 (xid=0x1462dcbf)
Jun 30 11:14:11 main-home dhclient[24173]: DHCPOFFER from 192.168.1.1
Jun 30 11:14:11 main-home dhclient[24173]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x1462dcbf)
Jun 30 11:14:11 main-home dhclient[24173]: DHCPACK from 192.168.1.1 (xid=0x1462dcbf)
Jun 30 11:14:13 main-home NET[24218]: /sbin/dhclient-script : updated /etc/resolv.conf
Jun 30 11:14:13 main-home dhclient[24173]: bound to 192.168.1.104 -- renewal in 38008 seconds.

Файл списка базы данных адресов:

tail: /var/lib/dhclient/dhclient.leases: file truncated
lease {
interface "eth0";
fixed-address 192.168.1.104;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 10.0.10.3,8.8.8.8,193.41.60.8;
option dhcp-server-identifier 192.168.1.1;
renew 1 2014/06/30 08:16:15;
rebind 1 2014/06/30 08:16:15;
expire 1 2014/06/30 08:16:15;
}
lease {
interface "eth0";
fixed-address 192.168.1.104;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 10.0.10.3,8.8.8.8,193.41.60.8;
option dhcp-server-identifier 192.168.1.1;
renew 1 2014/06/30 18:50:07;
rebind 2 2014/07/01 05:16:28;
expire 2 2014/07/01 08:16:28;
}

Указать другой файл:

# dhclient -v eth0 -lf /tmp/dhcp.file
# cat /tmp/dhcp.file
lease {
interface "eth0";
fixed-address 192.168.1.104;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
option dhcp-lease-time 86400;
option dhcp-message-type 5;
option domain-name-servers 10.0.10.3,8.8.8.8,193.41.60.8;
option dhcp-server-identifier 192.168.1.1;
renew 1 2014/06/30 19:30:40;
rebind 2 2014/07/01 05:17:50;
expire 2 2014/07/01 08:17:50;
}

Указать имя клиента:

# dhclient -v eth0 -H testbox

После чего в логе DHCP-сервера:

testbox LAN 192.168.1.104 08:00:27:38:F0:04

Без указания опции -H – клиент вообще не отправляет своё имя, и идентифицировать его можно только по MAC-адресу:

# dhclient -v eth0
  LAN 192.168.1.104 08:00:27:38:F0:04

Вариант номер 1 – добавить строку:

DHCP_HOSTNAME=testbox-2

в файл /etc/sysconfig/network-scripts/ifcfg-eth0.

Пример файла dhclient.conf

Другой вариант – настроить конфигурацию dhcp-клиента с помощью файла /etc/dhcp/dhclient.conf.

Создаём файл с такой строкой:

# cat /etc/dhcp/dhclient.conf
send host-name "testbox-3";

Перезапускаем dhcient:

# dhclient -r eth0
# dhclient -v eth0

Проверяем:

testbox-3 LAN 192.168.1.104 08:00:27:38:F0:04

В данном случае пример выполняется на:

# cat /etc/redhat-release
CentOS release 6.5 (Final)

Возможны и другие места размещения файла:

/etc/dhclient-eth0.conf
/etc/dhclient.conf
/etc/dhcp/dhclient-eth0.conf

Немного усложним файл:

# cat /etc/dhcp/dhclient.conf
timeout 60;
retry 60;
reboot 10;
reject 192.33.137.209;

interface "eth0" {
  send host-name "testbox-4";
  prepend domain-name-servers 127.0.0.1;
  request subnet-mask,
      broadcast-address,
      time-offset,
      routers,
      domain-name,
      domain-name-servers,
      host-name;
  require subnet-mask,
      domain-name-servers;
}

Тут:

timeouttimeout для получения ответа; в случае ошибки – будет повторная попытка после retry секунд;
retry – время до повторной попытки запроса, если предыдущая не прошла по timeout;
reboot – после перезапуска dhclient сначала попытается использовать тот же адрес, который у него был ранее; если это не получится – он отправит новый запрос после reboot секунд;
reject – отклонять запросы от DHCP-сервера с указанным IP;
interface – указание, для какого интерфейса применять данные правила;
send – оператор, указыаеющий список параметров, которые клиент будет передавать серверу;
require – оператор, указывающий список требуемых клиенту опций;

Полный список доступен в:

# man dhcp-options.