Протокол
DHCP (Dynamic Host Configuration Protocol - протокол
динамического конфигурирования хостов) является протоколом
клиент-серверной модели. То есть, есть сервер DHCP (демон
dhcpd) отвечающий на запросы клиентов и есть клиент DHCP
(dhclient) посылающий запросы и принимающий ответы от
сервера.
Передача
данных производится при помощи протокола UDP, при этом сервер
принимает сообщения от клиентов на порт 67 и отправляет
сообщения клиентам на порт 68.Градиентными
овалами и стрелками на схеме обозначены широковещательные
сообщения и направление сообщения соответственно. Линиями
обозначены не широковещательные сообщения. Пунктиром
обозначены, возможные сообщения (необязательные). На основании
рисунка, рассмотрим пример процесса получения IP-адреса
клиентом от параллельно работающих серверов DHCP.
Предположим, клиент ещё не имеет собственного IP-адреса.
Процесс состоит из следующих этапов:
1. Обнаружение
DHCP (DHCPDISCOVER)
На первом этапе,
клиент выполняет широковещательный запрос по
всей физической сети с целью обнаружить доступные DHCP-серверы.
Он отправляет сообщение типа DHCPDISCOVER, при
этом в качестве IP-адреса источника указывается 0.0.0.0 (так
как компьютер ещё не имеет собственного IP-адреса), а в
качестве адреса назначения — широковещательный адрес
255.255.255.255. Кроме IP источника и назначения, клиент в
данном сообщении посылает: уникальный идентификатор
запроса, свой MAC, и, возможно, прошлый присвоенный
IP.
2. Ответ DHCP -
сервера (DHCPOFFER)
Получив сообщение от клиента,
сервера определяют требуемую конфигурацию клиента в
соответствии со своими указанными в конфигурационном файле
настройками. Все сервера, получившие запрос, формируют ответ
(DHCPOFFER), содержащий конфигурацию клиента,
и отправляют его клиенту на MAC-адрес. В ответе содержится
следующая информация: IP, назначенный хосту, и прочие
параметры (такие, как адреса маршрутизаторов и
DNS-серверов). Клиент получает ответы от всех серверов DHCP,
функционирующих в сети, из них он должен выбрать тот, который
его «устраивает» (а устраивает его скорее всего тот, который
пришел первым).
3. Запрос
DHCP-сервера (DHCPREQUEST)
Выбрав одну из конфигураций,
предложенных DHCP-серверами, клиент отправляет запрос DHCP
(DHCPREQUEST). Он рассылается
широковещательно. В сообщении содержится информация из
сообщения DHCPDISCOVER + специальная опция —
идентификатор сервера — указывающая адрес
DHCP-сервера. При этом, сервер, который не выбран в качестве
"устраивающего" тоже видит, что он не выбран.
4. Подтверждение
от DHCP-сервера (DHCPACK)
Наконец, сервер подтверждает
запрос и направляет это подтверждение
(DHCPACK) клиенту. После этого клиент должен
настроить свой сетевой интерфейс, используя предоставленные
опции.При этом, кроме указанных сообщений, возможны и
другие (на схеме указаны пунктиром):
Отказ от настроек,
предоставленных DHCP-сервером
(DHCPDECLINE)
Если после получения
подтверждения (DHCPACK) от сервера клиент
обнаруживает, что указанный сервером адрес уже используется в
сети, он рассылает широковещательное сообщение отказа DHCP
(DHCPDECLINE), после чего процедура получения
IP-адреса повторяется.
Отмена от DHCP-сервера (DHCPNAK)
Если по каким-то причинам
сервер не может предоставить клиенту запрошенный IP-адрес, или
если аренда адреса удаляется администратором, сервер рассылает
широковещательное сообщение отмены DHCP
(DHCPNAK). При получении такого сообщения
соответствующий клиент должен повторить процедуру получения
адреса.
Освобождение адреса DHCP
(DHCPRELEASE)
Клиент может явным образом
прекратить аренду IP-адреса. Для этого он отправляет сообщение
освобождения DHCP (DHCPRELEASE) тому серверу,
который предоставил ему адрес в аренду.
Информация DHCP
(DHCPINFORM)
Сообщение информации DHCP
(DHCPINFORM) предназначено для определения
дополнительных параметров TCP/IP (например, адреса
маршрутизатора по умолчанию, DNS-серверов и т. п.) теми
клиентами, которым не нужен динамический IP-адрес (то есть
адрес которых настроен вручную). Серверы отвечают на такой
запрос сообщением подтверждения (DHCPACK) без
выделения IP-адреса.
Клиент DHCP (dhclient) Linux
Для работы Linux в качестве
DHCP-клиента необходимо установить пакет dhclient (в RedHat,
возможно - dhcpcd). Данный клиент запрашивает
у сервера параметры и применяет их к локальному хосту.
dhclient использует конфигурационный
файл /etc/dhclient.conf (иногда
/etc/dhcp/dhclient.conf или
/etc/dhcp3/dhclient.conf). А так же, хранит информацию
об арендованных параметрах в файле
/var/lib/dhcp/dhclient.leases. В общем случае, клиент
DHCP устанавливается вместе с дистрибутивом ОС и создает файл
конфигурации по умолчанию, который вполне работоспособен и не
требует вмешательств. Для работы dhclient, необходимо
в конфигурационных файлах сетевых интерфейсов вашего
дистрибутива (на которых необходимо получение сетевых
параметров по DHCP), указать параметр
BOOTPROTO=dhcp (для RedHat) и iface eth_№_
dhcp (для Deb).
Сервер DHCP (dhcp-server / dhcpd) на Linux
Думаю функции сервера, из
вышеописанного, вполне ясны - выдавать клиентам (хостам)
параметры сетевого подключения. Для работы сервера необходимо
установить пакет dhcp-server (в более
старых версиях - dhcpd, иногда пакет
имеет имя dhcp3-server). После
установки, в системе появиться привидение
демон - dhcpd. Данный демон должен быть
разрешен для запуска на необходимых уровнях выполнения ОС
(команда в RedHat - /sbin/chkconfig dhcpd on, в Debian
- /usr/sbin/update-rc.d dhcpd defaults). Так же,
необходимо, чтобы один из интерфейсов был настроен на
статический адрес из той подсети, которую будет раздавать
клиентам, иначе демон не будет работать корректно. После
установки демон попытается запуститься, но у него ничего не
получиться, потому что конфиг неверен.Далее приведу пример типичного конфига
для DHCP-server'a:
dhcp-server:~# cat
/etc/dhcp3/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-name "mydomain.org";
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.100;
range 192.168.1.150 192.168.1.200;
}
host hostname {
hardware ethernet 08:00:00:00:00:23;
fixed-address 192.168.1.222;
}
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-name "mydomain.org";
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.100;
range 192.168.1.150 192.168.1.200;
}
host hostname {
hardware ethernet 08:00:00:00:00:23;
fixed-address 192.168.1.222;
}
По данному конфигу клиентам
распределяются IP-адреса из диапазона
192.168.1.10-192.168.1.100 и 192.168.1.150-192.168.1.200. Если
клиент не запрашивает временных рамок, сервер выдает адрес на
600 секунд (default-lease-time 600). В противном
случае, максимально возможное время будет установлено в 7200
секунд (max-lease-time 7200). Сервер будет также
"советовать" клиенту использовать 255.255.255.0 в качестве
маски подсети (option subnet-mask 255.255.255.0),
192.168.1.255 для широкого вещания (broadcast) (option
broadcast-address 192.168.1.255), 192.168.1.254 в качестве
маршрутизатора/шлюза и 192.168.1.1 и 192.168.1.2 для
DNS-сервера (option routers 192.168.1.254 и option
domain-name-servers 192.168.1.1, 192.168.1.1
соответственно). О чем нам как бы говорит клиент, получивший
адрес:
host@host-VirtualBox1:~$
ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:fc:b4:ce
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fefc:b4ce/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2939 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:945634 (945.6 KB) TX bytes:10373 (10.3 KB)
eth0 Link encap:Ethernet HWaddr 08:00:27:fc:b4:ce
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fefc:b4ce/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2939 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:945634 (945.6 KB) TX bytes:10373 (10.3 KB)
Так же, в конфиге есть такой
параметр как host hostname, который говорит, что хост
с именем hostname у которого сетевая карта имеет MAC
08:00:00:00:00:23 должен иметь постоянный адрес 192.168.1.222
(в Windows данная настройка называется
резервирование). Поля options для данного
раздела конфигурации так же приемлемы.
Кроме того, возможно
"вкладывать" параметр host в параметр subnet для формирования
более понятного конфигурационного файла:
dhcp-server:~# cat
/etc/dhcp3/dhcpd.conf
.....
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.100;
range 192.168.1.150 192.168.1.200;
host hostname {
hardware ethernet 08:00:00:00:00:23;
fixed-address 192.168.1.222;
}
}
.....
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.100;
range 192.168.1.150 192.168.1.200;
host hostname {
hardware ethernet 08:00:00:00:00:23;
fixed-address 192.168.1.222;
}
}
Балансировка и резервный DHCP-server
Ознакомившись с настройкой
DHCP-сервера, можно настроить резервировный (он же
балансирующий нагрузку на основной) сервер DHCP. Резервный
DHCP-server настраивается как и основной. Отличие резервного от
основного в том, что основным сервером выдаются 80% адресов, а
резервным - 20%. То есть параметр range в конфиге задается
таким образом, чтобы поделить сеть в соотношении 80/20.