Bog BOS: Протокол BOOTP/DHCP
BOOTP (Bootstrap Protocol) как и RARP обеспечивает определение с помощью специального сервера IP адреса клиента по его MAC адресу (например, при загрузке устройства, не имеющего возможности хранить свой собственный IP адрес), а также позволяет клиентам узнавать другие параметры загрузки (например, имя программы, загружаемой затем с помощью TFTP) и использует UDP в качестве протокола канального уровня. Это позволяет использовать маршрутизаторы (bootp relay) для передачи запросов и ответов из одного сегмента локальной сети в другой. Протокол DHCP (Dynamic Host Configuration Protocol) является надстройкой над BOOTP (для совместимости с bootp relay) и позволяет серверу выделять IP адреса клиентам динамически на ограниченный срок.
Порт сервера — UDP/67 (BOOTPS), клиента — UDP/68 (BOOTPC). Клиент делает широковещательный (255.255.255.255 — всем в локальной сети, номера которой я не знаю) запрос bootrequest (один нефрагментированный пакет): обязательно содержит аппаратный MAC адрес клиента и может содержать преполагаемый IP-адрес клиента, имя сервера и обобщенное имя файла для загрузки. Сервер отвечает пакетом bootreply (обычно unicast, т.к. MAC и IP адреса клиента ему известны): IP-адрес клиента, обобщенное имя файла замещается на полное имя файла исходя из конфигурации сервера, типа и адреса клиента и др. Собственно загрузка файла осуществляется клиентом с помощью протокола TFTP. Клиент должен быть в состоянии ответить на ARP запросы, чтобы мог работать TFTP-сервер.
Формат пакетов (в скобках упомянуты тэги /etc/bootptab и /etc/dhcpd.conf):
- тип пакета: bootrequest или bootreply
- тип оборудования (ethernet 10 Mbit = 1, ht, hardware ethernet)
- длина MAC адреса (6)
- число пройденных прокси, каждый прокси добавляет 1 (не более 16?)
- номер транзакции (0 или случайное число, позволяет клиенту отличить ответ на свой запрос от чужого)
- число секунд после первого bootrequest (позволяет запасному BOOTP серверу заметить неработоспособность основного)
- требование к серверу отвечать широковещательным пакетом
- IP адрес клиента, предполагаемый самим клиентом (должен уметь отвечать на запросы ARP) или 0.0.0.0
- IP адрес клиента, возвращаемый сервером (ip, fixed-address)
- IP адрес следующего сервера (сюда же будет направлен TFTP запрос, sa, next-server)
- IP адрес прокси (это не обязательно маршрутизатор!)
- MAC адрес клиента (ha)
- имя сервера (64 байта)
- имя загрузочного файла (128 байт, filename)
- дополнительная информация (vendor-specific или options, 64 байта для BOOTP, переменная длина для DHCP)
Формат дополнительной информации (RFC 2132): первые 4 байта имеют значение 99.130.83.99, что позволяет определить ее наличие (может быть использовано другое согласованное значение, определяющее собственный формат этого поля). Далее расположен список элементов (имена и тексты в NVT ASCII). Каждый элемент имеет однобайтовую этикетку, описывающую его тип. Типы 0 и 255 состоят только из этикетки (0 — заполнитель, 255 — конец данных). Остальные типы элементов вторым байтом имеют длину элемента (в скобках упомянуты тэги /etc/bootptab и /etc/dhcpd.conf):
- маска подсети (sm, subnet-mask)
- смещение времени относительно UTC (в секундах, time-offset)
- список IP адресов маршрутизаторов (первый — предпочтительный, gw, routers)
- список IP адресов серверов времени (RFC 868, не NTP!)
- список IP адресов серверов имен (IEN 116, не DNS!)
- список IP адресов DNS серверов (domain-name-servers)
- список IP адресов серверов syslog (lg, log-servers)
- список IP адресов серверов «Quote of the Day» (RFC 865)
- список IP адресов серверов печати (LPR/LPD, RFC 1179)
- список IP адресов серверов Imagen Impress
- список IP адресов серверов поиска ресурсов (RFC 887)
- доменное имя хоста клиента, возможно только локальная часть (hn, host-name)
- число блоков в загрузочном файле (по 512 байт, до 64k, bs)
- имя файла для coredump
- имя домена клиента (domain-name)
- IP адрес swap сервера
- путь монтирования диска root
- имя файла (берется затем клиентом с помощью TFTP) с продолжением дополнительной информации
- должен ли клиент передавать пакеты с интерфейса на интерфейс, т.е. работать маршрутизатором (forwarding, ip-forwarding)
- разрешать ли source routing IP пакетов
- фильтры для source routing
- максимальный размер датаграммы для сборки клиентом (не менее 576)
- TTL для исходящих от клиента датаграмм
- время ожидания для алгоритма автораскрытия MTU (RFC 1191)
- таблица значений MTU для алгоритма автораскрытия MTU (RFC 1191)
- MTU интерфейса (не менее 68)
- все ли прямо подключенные подсети имеют одинаковый MTU
- широковещательный IP адрес локальной подсети
- использовать ли ICMP для автораскрытия маски подсети
- отвечать ли на ICMP запросы автораскрытия маски подсети
- использовать ли механизм поиска маршрутизаторов (RFC 1256, router-discovery)
- IP адрес сервера механизма поиска маршрутизаторов
- список статических маршрутов в виде списка пар: сеть (нельзя задавать 0.0.0.0), адрес маршрутизатора (а маска?)
- использовать ли «хвосты» в канальных кадрах (RFC 893)
- время жизни элементов ARP кеша (секунд)
- версия Ethernet: version 2 (RFC 894) или IEEE 802.3 (RFC 1042)
- TTL для исходящих от клиента TCP пакетов
- TCP keepalive interval
- TCP keepalive garbage option
- имя домена NIS
- список IP адресов серверов NIS
- список IP адресов серверов NTP (ntp-servers)
- информация в формате изготовителя оборудования
- список адресов серверов имен NetBIOS over TCP/IP (RFC 1001, RFC 1002)
- список адресов серверов NBDD NetBIOS over TCP/IP (RFC 1001, RFC 1002)
- тип узла NetBIOS over TCP/IP (RFC 1001, RFC 1002)
- область NetBIOS over TCP/IP (RFC 1001, RFC 1002)
- список IP адресов серверов шрифтов X Window System
- список IP адресов менеджеров дисплея (xdm) X Window System
- требуемый клиенту IP адрес (DHCPDISCOVER)
- запрашиваемое (DHCPDISCOVER, DHCPREQUEST) или предоставленное (DHCPOFFER) время аренды IP адреса (в секундах относительно момента запроса)
- использовать ли поля имени сервера и имени загрузочного файла для передачи дополнительных опций (DHCP)
- тип сообщения DHCP (DHCPDISCOVER, DHCPOFFER, DHCPREQUEST, DHCPDECLINE, DHCPACK, DHCPNAK, DHCPRELEASE, DHCPINFORM)
- идентификатор сервера DHCP (IP адрес), указывается сервером в DHCPOFFER, чтобы клиент мог различить предложения от различных серверов (возможно также указание в DHCPACK и DHCPNAK); указывается клиентом в DHCPREQUEST, чтобы показать, какое предложение он принял
- список кодов опций, значения которых клиент хочет узнать от сервера
- текст сообщения об ошибке (DHCPNAK, DHCPDECLINE)
- максимальный размер сообщения DHCP, которое клиент готов принять (DHCPDISCOVER, DHCPREQUEST)
- T1 — интервал времени (в секундах), через который клиент DHCP должен перейти в режим запроса подтверждения на право владения IP адресом (RENEWING), по умолчанию — 0.5 от срока аренды
- T2 — интервал времени (в секундах), через который клиент DHCP должен перейти в режим получения нового IP адреса (REBINDING), по умолчанию — 0.875 от срока аренды
- используется DHCP клиентом для указания варианта конфигурации (vendor class), сервер возвращает информацию только в формате изготовителя оборудования
- уникальный в подсети идентификатор клиента DHCP (например, MAC адрес или полное доменное имя), в протоколе BOOTP для идентификации клиента использовался его MAC адрес
- имя домена NIS+
- список IP адресов серверов NIS+
- имя TFTP сервера, если поле имени сервера использовано под дополнительные опции (DHCP)
- имя загрузочного файла, если поле имени загрузочного файла использовано под дополнительные опции (DHCP)
- список IP адресов Mobile IP Home Agent
- список IP адресов серверов SMTP (smtp-server)
- список IP адресов серверов POP3
- список IP адресов серверов NNTP
- список IP адресов серверов WWW (HTTP ?)
- список IP адресов серверов finger
- список IP адресов серверов IRC
- список IP адресов серверов StreetTalk
- список IP адресов серверов StreetTalk Directory Assistance
- тип пользователя (задаётся клиентом)
- информация от посредника (relay) о клиенте; содержит от 1 до 255 подопций: 1 — circuit ID, 2 — Remote ID
- системная архитектура клиента PXE
- версия универсального сетевого интерфейса PXE (UNDI)
- универсальный идентификатор клиента PXE (UUID)
- статические маршруты
- — 254: зарезервированы для локального использования (Tномер, option option-номер)
Средств обеспечения безопасности нет, в ответ клиент может получить фальшивый пакет. Поэтому на периферии сети порты UDP/67 и UDP/68 должны быть заблокированы сетевым экраном, а на сервере BOOTP должны быть проделаны дырки в ipchains (привожу формат /etc/sysconfig/ipchains):
Аналогичные дырки надо проделать для исходящих пакетов сервера и пакетов, пересылаемых DHCP прокси.
Если в ядре включена фильтрация поддельных IP-адресов (martian address filtering), то ее придется отключить (по крайней мере для адресов 0.0.0.0 и 255.255.255.255).
Экран можно усилить, заменив «универсальные» 0.0.0.0/0.0.0.0 на адреса ваших клиентов/сервера, но учитывайте, что исходящими IP адресами клиентов могут быть также 0.0.0.0, а входным — 255.255.255.255.
Протокол DHCP использует тот же самый формат пакетов и те же UDP порты для обмена сообщениями между серверами и клиентами. Это позволяет DHCP серверу обслуживать BOOTP клиентов и использовать исторически сложившуюся инфраструктуру BOOTP прокси. DHCP не определяет политику назначения IP адресов и прочих параметров, а лишь обеспечивает механизм её реализации. Адрес может выделяться на ограниченный срок (выражается в секундах относительно момента запроса) или навсегда. DHCP позволяет свести настройку сетевых параметров клиентов к минимуму. В сети может быть установлено несколько серверов. Сервер должен хранить выделенные параметры при перезагрузках клиентов и сервера, чтобы по возможности выделять один и тот же адрес. При запросах клиент может идентифицироваться не только своим MAC адресом, но и специальной опцией «уникальный идентификатор клиента» (UUID или GUID). Аналогично сервер указывает свой IP адрес в опции «идентификатор сервера». Пакеты от клиента DHCP (тип bootrequest) могут быть следующих видов (задаётся опцией «тип сообщения DHCP»):
- DHCPDISCOVER (1) — широковещательный запрос клиента при первоначальном поиске сервера, может содержать желаемый для получения IP адрес и время аренды
- DHCPREQUEST (3) — широковещательный ответ на DHCPOFFER (должен содержать идентификатор сервера), либо запрос на возобновление аренды адреса после перезагрузки клиента или истечения предыдущего интервала аренды; клиент может выбирать из нескольких предложений DHCPOFFER; может включать список требуемых параметров
- DHCPDECLINE (4) — ответ на DHCPOFFER с отказом принять адрес (например, клиент выяснил с помощью ARP или ICMP, что адрес занят); клиент начинает всё с начала
- DHCPRELEASE (7) — освобождение адреса
- DHCPINFORM (8) — клиент получил адрес с помощью другого механизма и нуждается только в прочих параметрах
Ответные пакеты от сервера DHCP (тип bootreply) могут быть следующих видов (задаётся опцией «тип сообщения DHCP»):
- DHCPOFFER (2) — ответ на DHCPDISCOVER, поле yiaddr содержит предлагаемый адрес (он пока не зарезервирован!)
- DHCPACK (5) — согласие на выделение адреса по DHCPREQUEST или DHCPINFORM (в этом случае сервер не проверяет допустимость адреса); клиент может пользоваться им оговоренное время
- DHCPNAK (6) — отказ на выделение адреса по DHCPREQUEST (например, в промежутке между DHCPOFFER и DHCPREQUEST адрес был выделен другому); клиент начинает всё с начала
Пакет bootp-2.4.3-7.i386.rpm (Red Hat Linux 5.2). Содержит программы bootpd и bootptest. Конфигурационный файл — /etc/bootptab (см. bootptab(8)):
Устанавливается и на нынешние версии Red Hat Linux, только надо создать файл /etc/xinetd.d (не забыть презапустить xinetd: «/etc/rc.d/init.d/xinetd reload»)
Сервер bootpd от HP в комплекте программ для JetDirect. Тестовая программа bootpquery делает запрос и выводит ответ BOOTP сервера. В качестве параметров можно указать MAC адрес клиента (если не совпадает с настоящим, то сервер д.б. возвращать широковещательный ответ) и имя сервера (ключ -s). Конфигурационный файл — /etc/bootptab (см. bootptab(8)):
rpc.bootparamd в Solaris использует данные из /etc/bootparams, реализует специфическую для Sun RPC версию сервера, обеспечивающего дополнительные параметры для загрузки. Скрипт /etc/init.d/nfs.server (AKA /etc/rc3.d/S15nfs.server) запускает «/usr/sbin/rpc.bootparamd», если существует директория /tftproot. Если у вас нет бездисковых станций Sun, то он вам не нужен.
Сервер bootparamd в Red Hat Linux поставляется в виде пакета bootparamd-0.17-7 (RH 7.2) и реализует ту же самую специфическую для Sun RPC версию сервера, обеспечивающего дополнительные параметры для загрузки.
Столкнулся с забавной «плюшкой» firmware JetDirect: все IP-адреса в списке дополнительных элементов должны быть выровнены на границу слова, поэтому строки переменной длины (имена хостов и файлов) должны быть в конце списка, либо иметь четную длину. bootpd из поставки JetDirect знает об этом, а для dhcpd и стандартного bootpd пришлось менять имена хостов.
Пакет dhcp-2.0pl5-8 (RH 7.2) или dhcp-3.0pl1-15 (RH 8.0) или dhcp-3.0.1-11 (FC3) или dhcp-3.0.5-7.el5 (CentOS5.1) содержит BOOTP/DHCP сервер dhcpd и прокси dhcrelay от ISC (имеются также пакеты dhclient и dhcp-devel). Поддерживается работа DHCP клиента, сервера и прокси. Обеспечивается динамическое изменение DNS. Перед выдачей динамического адреса клиенту запись об этом заносится в конец специального файла (dhcpd.leases(5), /var/lib/dhcp/dhcpd.leases) для страховки, т.е. правильным является последнее значение. Время от времени создаётся новый файл и переименовывается, чтобы размер файла не вырос до бесконечности. Файл содержит записи аренды, объявления хостов, групп и подгрупп в формате dhcpd.conf (объявления хостов, групп и подгрупп для объектов, динамически созданных с помощью OMAPI, см. ниже). Каждая запись аренды содержит выделенный IP-адрес, время начала и конца аренды в человеколюбивом формате (но в UTC), тип оборудования и MAC адрес, идентификатор клиента, host-name, abandoned (адрес нельзя было выдавать), текущее и следующее состояния аренды, agent.circuit-id и agent.remote-id (см. описание опций). В версии 3.0 убрана поддержка неизвестных серверу опций в виде «option-144», теперь их необходимо описывать явно. Журнал записывается на syslog, источник — DAEMON. Процедура запуска в файле /etc/rc.d/init.d/dhcpd (start, stop, restart, status). Параметры командной строки хранятся в файле /etc/sysconfig/dhcpd. Для обеспечения запуска при загрузке надо выполнить
После запуска номер процесса сохраняется в файле /var/run/dhcpd.pid. После изменения конфигурационного файла /etc/dhcpd.conf (описание — dhcpd.conf(5), dhcp-options(5), dhcp-eval(5)) необходимо перезапустить сервер. Кроме сервера протокола BOOTP обеспечивает сервер протокола DHCP, поэтому имеет множество параметров настройки, но для каждого клиента BOOTP достаточно иметь секцию host в /etc/dhcpd.conf (subnet, естественно, общий для всей подсети), например, обеспечение загрузки сетевого принтера HP JetDirect для dhcp-2.0:
Параметры запуска /usr/sbin/dhcpd:
- -p UDP-порт (по умолчанию — 67, клиентский порт принимается на 1 больше)
- -cf имя-конфигурационного-файла (/etc/dhcpd.conf)
- -lf имя-хранилища-выданных-адресов (/var/lib/dhcp/dhcpd.leases)
- -q (не выводить copyright при запуске)
- -t (только проверка синтаксиса конфигурационного файла)
- -T (только проверка синтаксиса хранилища выданных адресов)
- -tf имя-файла (записывать все транзакции в файл)
- -play имя-файла (проиграть все транзакции из файла)
- список интерфейсов, на которых слушать широковещательные пакеты (по умолчанию все активные широковещательные интерфейсы)
Протокол OMAPI позволяет подсоединяться к серверу по TCP/7911 (с аутентификацией, TSIG), чтобы проверить его состояние или изменить конфигурацию или содержимое БД (просмотр, создание, удаление, просмотр и изменение атрибутов для объектов типа аренда, хост, группа, управление). Имеется командная оболочка omshell(1).
Прокси dhcrelay(8) транслирует запросы клиентов и ответы серверов между сегментами сети (конфигурационного файла нет):
- -i интерфейс (интерфейс, на котором слушать широковещательные пакеты; можно задавать несколько раз; по умолчанию все активные широковещательные интерфейсы)
- -p UDP-порт (по умолчанию — 67, клиентский порт принимается на 1 больше)
- -q (не выводить copyright при запуске)
- -a (добавлять во все запросы и удалять из ответов опции прокси агента Circuit ID (имя интерфейса, на котором получен запрос) и Agent ID (поле giaddr) )
- -c число (отбрасывать пакеты, прошедшие более указанного числа промежуточных узлов; 10; защита от зацикливания)
- -m append | replace | forward | discard (что делать с пакетами, которые уже содержат опции прокси агента)
- -D (выбрасывать все ответа серверов, не содержашие наш Agent ID)
- адреса или имена серверов
Конфигурационный файл имеет свободный текстовый формат. Комментарии начинаются со знака ‘#’ и продолжаются до конца строки. Регистр ключевых слов значения не имеет. Файл состоит из утверждений двух типов: параметры и объявления. Объявления описывают топологию сети и группируют параметры. Объявления могут быть вложенными. Параметры и простые объявления завершаются точкой с запятой. Определяющие вложенную область действия объявления заключают её в фигурные скобки и не имеют завершающей точки с запятой. Параметры внутри объявления д.б. описаны до вложенных объявлений.
Для каждой подсети, к которой подключён DHCP сервер, должно быть объявление подсети subnet (даже если он её не обслуживает). Если подсети подключены к одному интерфейсу, то объявления этих подсетей д.б. помещены внутрь объявления shared-network. Кстати, с помощью bootp прокси через интерфейс могут быть видны сегменты, не подключённые непосредственно. Если адреса клиентам внутри подсети должны выделяться динамически, то необходимо объявить пул адресов внутри подсети pool (все пулы на одном интерфейсе — общие, невозможно определить к какой подсети на разделяемом интерфейсе принадлежит клиент). Для клиентов со статическими адресами необходимо поместить объявление host внутрь объявления подсети. Если требуется загружать клиента в различных подсетях, то для него можно описать несколько объявлений host (если ему необходимо назначить различные параметры в зависимости от подсети) или несколько параметров fixed-address в одном объявлении. Объявления различного типа с одинаковыми параметрами можно группировать внутри объявления group. Клиенты с динамически выделяемыми адресами могут быть сгруппированы согласно объявлению классов class (класс клиента определяется в момент запроса в соответствии с передаваемыми им опциями — например, идентификатором клиента). Имеется также грязный хак по распределению клиентов по подклассам исключительно с целью оптимизации времени работы сервера. Возможно объявление класса (spawning class), автоматически порождающего подклассы в зависимости от значения получаемого от клиента параметра. Имеются условные операторы. Перед объявлениями самого верхнего уровня могут быть указаны глобальные параметры. Пример смотри в предыдущем параграфе. Поиск параметров для клиента происходит в следующей последовательности (приоритет имеет более конкретная область действия):
- объявление host (по идентификатору клиента или MAC адресу; сначала просматриваются те, которые содержат фиксированный IP адрес, подходящий для подсети клиента, затем не содержащие фиксированных адресов)
- объявление class
- объявление pool (по IP адресу)
- объявление subnet (по IP адресу)
- объявление shared-network (по IP адресу)
Для управления доступом в любой области объявления могут быть использованы утверждения allow, deny или ignore (аналогично deny, но без записи сообщения в журнал), указаны значения по умолчанию:
- allow unknown-clients; (выделять ли адреса не упомянутым в объявлениях host клиентам)
- allow bootp; (обслуживать ли запросы BOOTP)
- allow booting; (обслуживать ли запросы клиента; использовать в host)
- allow duplicates; (рассматривать все запросы с одного MAC адреса как исходящие от одного клиента даже, если идентификаторы клиента не совпадают; полезно, если на одном компьютере установлено несколько ОС; нарушение стандарта)
- allow declines; (обрабатывать ли сообщения DHCPDECLINE от клиента)
Для управления выделением адресов из пула внутри объявления пула могут быть использованы утверждения allow и deny со следующими параметрами (они обрабатываются до выделения адреса):
- known-clients;
- unknown-clients;
- members of «имя-класса»;
- dynamic bootp clients; (выделять ли адреса из пула клиентам BOOTP)
- all clients;
Параметры (там, где возможно, приведены значения по умолчанию):
- always-broadcast off; (посылать ответы в широковещательном режиме даже, если клиент этого не запрашивал)
- always-reply-rfc1048 off; (всегда посылать ответы в формате rfc1048 клиентам BOOTP для задания опций)
- [ not ] authoritative; (по умолчанию сервер считается неуполномоченным — форма «защиты от дурака»; явно направленные запросы обрабатываются несмотря на «not»)
- boot-unknown-clients on;
- default-lease-time секунд; (1 день)
- dynamic-bootp-lease-cutoff W YYYY/MM/DD HH:MM:SS; (время в UTC; W — день недели, 0 — воскресенье; вообще-то клиенты BOOTP не знают, что время аренды адреса может закончиться, поэтому обычно адрес выдаётся им навсегда, но иногда бывает известно, что все компьютеры выключаются на ночь и т.п.)
- dynamic-bootp-lease-length секунд; (адрес освобождается, если за указанный период не было запросов; клиент дожен перезагружаться достаточно часто, чтобы его адрес не оказался выделен кому-то другому)
- filename «имя-загрузочного-файла»; (см. протокол BOOTP)
- fixed-address IP-адрес [, IP-адрес . ]; (используется в объявлении host; если указано несколько адресов, то клиенту выделяется адрес, соответствующий его подсети; если не подходит ни один, то клиент не соответствует объявлению host)
- get-lease-hostnames off; (использовать DNS для определения по IP-адресу значения опции hostname)
- hardware ethernet MAC-адрес (в формате 00:11:22:33:44:ff)
- lease-file-name /var/lib/dhcp/dhcpd.leases (имя файла для хранения информации о выделенных адресах; может указываться только в глобальной области)
- local-port 67; (UDP порт)
- log-facility источник-сообщения-syslog; (по умолчанию: daemon)
- max-lease-time секунд; (клиенты BOOTP не ограничиваются)
- min-lease-time секунд;
- min-secs секунд; (позволяет сконфигурировать запасной сервер, который вступает в работу, если клиент ждёт ответа более указанного количества секунд)
- next-server доменное-имя-или-IP-адрес; (по умолчанию — адрес DHCP сервера)
- omapi-port порт; (порт протокола OMAPI управления DHCP сервером)
- one-lease-per-client off; (при получении от клиента запроса DHCPREQUEST сервер освобождает адрес, ранее выданный этому клиенту; нельзя использовать для клиентов, имеющих несколько интерфейсов или помнящих старые адреса при пеермещении из одной подсети в другую)
- pid-file-name /var/run/dhcpd.pid;
- ping-check on; (проверять с помощью ICMP Echo динамически выделенный адрес перед тем как сообщить его клиенту; вносит задержку на запрос DHCPDISCOVER)
- ping-timeout 1; (секунд)
- server-identifier идентификатор-сервера; (первый IP адрес интерфейса, по которому пришёл запрос; то же самое можно задать опцией dhcp-server-identifier);
- server-name имя-сервера; (в кавычках)
- site-option-space имя; (из какого пространства опций брать локальные, т.е. с номером более 128, опции)
- stash-agent-options off; (запоминать данные о прокси, передавшем запрос от этого клиента при начальном выборе адреса, и использовать их при обновлении аренды; это бывает необходимо, т.к. при обновлении используются нешироковещательные запросы, которые могут приходить другим путём)
- use-host-decl-names off; (использовать имена, указанные в объявлениях host как значения опции host-name по умолчанию)
- use-lease-addr-for-default-route off; (вместо адреса шлюза посылать выделенный адрес; обход какой-то проблемы Win95)
- vendor-option-space строка; (какое пространство опций использовать)
- option имя значение; (флаг: on или off; устаревшие опции не упоминаю; значения опций используются как при создании ответов сервера, так и извлекаются из запросов клиентов при вычислении выражений, условий и поиске класса; смысл опций описан выше)
- option all-subnets-local флаг; (все подсетки имеют одинаковый MTU)
- option arp-cache-timeout uint32; (секунд)
- option bootfile-name строка;
- option boot-size uint16; (в блоках по 512 байт)
- option broadcast-address ip-address;
- option default-ip-ttl uint8;
- option default-tcp-ttl uint8;
- option dhcp-client-identifier строка; (используется в объявлении host для выбора нужного по входящему запросу; иногда в начале строки необходимо добавить \0)
- option dhcp-lease-time uint32; (используется в запросах; значение в ответах сервера устанавливается в соответствии с параметрами max-lease-time и default-lease-time)
- option dhcp-max-message-size uint16; (может посылаться клиентом)
- option dhcp-message text; (для сообщений DHCPNAK и DHCPDECLINE от клиента; установить нельзя)
- option dhcp-message-type uint8; (установить нельзя)
- option dhcp-option-overload uint8; (поля имени сервера и загрузочного файла использованы для передачи дополнительных параметров; установить нельзя)
- option dhcp-parameter-request-list uint16; (посылается клиентом или конфигурируется на сервере)
- option dhcp-rebinding-time uint32; (установить нельзя)
- option dhcp-renewal-time uint32; (установить нельзя)
- option dhcp-requested-address ip-address; (посылается клиентом; установить нельзя)
- option dhcp-server-identifier ip-address; (аналог параметра server-identifier)
- option domain-name text; (в кавычках)
- option domain-name-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option extensions-path text; (имя файла с дополнительной информацией, TFTP)
- option finger-server список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option font-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option host-name text;
- option ieee802-3-encapsulation flag;
- option interface-mtu uint16;
- option ip-forwarding flag;
- option irc-server список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option log-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option lpr-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option mask-supplier flag;
- option max-dgram-reassembly uint16;
- option mobile-ip-home-agent список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option nds-context string;
- option nds-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option nds-tree-name string;
- option netbios-dd-server список-IP-адресов-через-запятую; (приоритетный — вперёд; NBDD)
- option netbios-name-servers список-IP-адресов-через-запятую; (приоритетный — вперёд; NBNS (RFC 1001/1002) больше известен под именем WINS)
- option netbios-node-type uint8; (1 — использовать только широковещательные запросы, 2 — только WINS, 4 — сначала широковещательные запросы, затем WINS, 8 — сначала WINS, затем широковещательные запросы)
- option netbios-scope string;
- option nis-domain text;
- option nis-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option nisplus-domain text;
- option nisplus-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option nntp-server список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option non-local-source-routing flag;
- option ntp-servers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option nwip-domain string;
- option nwip-suboptions string; (RFC 2242)
- option path-mtu-aging-timeout uint32;
- option path-mtu-plateau-table uint16 [, uint16. ];
- option perform-mask-discovery flag;
- option pop-server список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option root-path text;
- option router-discovery flag; (RFC 1256)
- option router-solicitation-address IP-адрес;
- option routers список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option slp-directory-agent flag список-IP-адресов-через-запятую; (приоритетный — вперёд; иногда вместо SLP используется название NDS)
- option slp-service-scope boolean text;
- option smtp-server список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option space имя-пространства-опций; (задание нового пространства опций; см. определение новых опций и encapsulate)
- option static-routes адрес-подсети-назначения адрес-шлюза [, . ]; (нельзя задать маску подсети, только классовая маршрутизация — DHCP клиент Microsoft не использует)
- option subnet-mask IP-адрес
- option subnet-selection string; (посылается клиентом; RFC 3011)
- option swap-server IP-адрес
- option tcp-keepalive-garbage flag;
- option tcp-keepalive-interval uint32;
- option tftp-server-name text;
- option time-offset int32;
- option time-servers список-IP-адресов-через-запятую; (приоритетный — вперёд; RFC 868)
- option trailer-encapsulation flag;
- option uap-servers text; (User Authentication Protocol; HTTP 1.1 или SSLv3)
- option user-class string; (посылается клиентом)
- option vendor-class-identifier string; (посылается клиентом)
- option vendor-encapsulated-options string; (см. encapsulate при создании новых опций)
- option www-server список-IP-адресов-через-запятую; (приоритетный — вперёд)
- option x-display-manager список-IP-адресов-через-запятую; (приоритетный — вперёд)
- пространство опций agent (добавляется к запросам клиента прокси агентом; draft-ietf-dhc-agent-options-11.txt)
- option agent.circuit-id string; (поможет агенту определить канал для пересылки ответа сервера)
- option agent.remote-id string; (адрес клиента с точки зрения агента: caller ID и т.п.)
- пространство опций fqdn (ietf-dhc-fqdn-option-00.txt; см. ddns ниже)
- пространство опций NETWARE/IP (RFC 2242)
- option имя code номер = определение-структуры; (определение своих опций; можно использовать номера, зарезервированные для локального использования; определение структуры может быть следующим
- boolean
- [ unsigned | signed ] integer [ 8 | 16 | 32 ]
- ip-address
- text (ASCII)
- string (последвательность байт в виде строки или шестнадцатеричной последовательности вида 17:23:19:a6:42:ea)
- encapsulate имя-пространства (опция кодируется как список опций)
- array of тип-данных-фиксированной-длины
Условие в операторе if/elsif в зависимости от значения опций в запросе задаётся в виде булевского выражения (null в любой части выражения приводит к результату null для всего выражения)
- выражение-1 = выражение-2
- булевское-выражение-1 and булевское-выражение-2
- булевское-выражение-1 or булевское-выражение-2
- not булевское-выражение
- exists имя-опции
- known (т.е. имеется объявление host для этого клиента)
- static
Значение параметра может задаваться в виде выражения. Выражения также используются для условных описаний параметров. Имеются следующие выражения по извлечению данных:
- substring (выражение, смещение, длина)
- suffix (выражение, длина)
- option имя-опции-в-запросе
- config-option имя-опции-в-конфиге
- hardware
- packet (смещение, длина)
- строка в кавычках
- шестнадцатеричная последовательность вида 17:23:19:a6:42:ea
- concat (выражение, . выражение)
- reverse (размер-блока, выражение)
- leased-address
- binary-to-ascii (система-счисления, число-бит-в-числе, разделитель, выражение)
- encode-int (число, число-бит)
- extract-int (выражение, число-бит)
- pick-first-value (выражение-1, . )
- host-decl-name
- lease-time
- число
- client-state (только для конфигурации клиента)
- Booting
- Reboot
- Select
- Request
- Bound
- Renew
- Rebind (запрос будет широковещательным)
Сервер поддерживает протокол восстановления (failover, draft-ietf-dhc-failover-07.txt) — два DHCP сервера разделяют общий пул динамически распределяемых адресов и подменяют друг друга в случае падения. Протокол не стандартизован (и недодуман) до конца — чувствуйте себя бета-тестерами, если хотите. Описание опускаю.
Сервер поддерживает (описание опускаю) протокол динамического обновления DNS, используя следующие алгоритмы (задаётся параметром ddns-update-style — требуется указать хотя бы none, иначе сервер не запустится; TSIG и DNSSEC не реализованы):
- ad-hoc (экспериментальный) — нестандартный и признанный устаревшим
- interim (временный) — соответствует проектам стандартов draft-ietf-dhc-ddns-resolution-. txt, draft-ietf-dhc-fqdn-option-. txt и draft-ietf-dnsext-dhcid-rr-. txt, но не полностью
- не реализованный пока алгоритм, соответствующий будущему стандарту
Возможно назначить выполнение блока операторов при наступлении одного из типов событий: выделение адреса (commit), освобождение (release), истечение времени аренды (expiry).
Пакет dhclient-3.0.1-30_FC3 (FC3) содержит клиент протокола DHCP от ISC. Пытается настроить все активные широковещательные интерфейсы, делая широковещательные запросы на них к серверам DHCP. Конфигурационный файл — /etc/dhclient.conf (dhclient.conf(5)); список арендованных адресов — /var/lib/dhcp/dhclient.leases (dhclient.leases(5) и описание объявления lease в dhclient.conf), его можно подсунуть клиенту, если ожидается отсутствие DHCP сервера. Для управления клиентом можно использовать тот же OMAPI протокол, что и для управления сервером: приостановка работы, возобновление работы с переконфигурацией всех интерфейсов, завершение работы. Для обновления использует не широковещательный запрос, а непосредственный IP адрес сервера, выдавшего IP адрес. Параметры запуска:
- -p UDP-порт (по умолчанию — 68)
- -s IP-адрес-сервера (по умолчанию делается широковещательная посылка на 255.255.255.255)
- -g IP-адрес-прокси
- -q
- -cf имя-конфигурационного-файла (/etc/dhcpd.conf)
- -lf имя-хранилища-выданных-адресов (/var/lib/dhcp/dhcpd.leases)
- -pf /var/run/dhclient.pid
- -sf имя-скрипта (/sbin/dhclient-script)
- -r (отдать арендованный адрес и завершиться)
- -1 (делать только одну попытку)
- [-n] -w (не завершаться, если нет широковещательных интерфейсов; в дальнейшем можно использовать omshell, чтобы извещать клиента о появлении или исчезновении интерфейсов)
- список интерфейсов
Синтаксис файла конфигурации такой же, как и у файла конфигурации сервера. Параметры и объявления:
- права доступа и области действия:
- reject IP-адрес-плохого-сервера;
- interface имя-интерфейса < параметры и объявления . >(для разных интерфейсов могут потребоваться различные значения параметров; не может включать объявления lease и alias)
- pseudo имя-виртуального-интерфейса реальное-имя-интерфейса < параметры . >(отдельные параметры и машина состояний; необходимо обеспечить различные идентификаторы клиента для интерфейсов и dhclient-script-ы; необходим, если у клиента несколько подсетей на одном интерфейсе)
- media «параметр» [, параметр . ]; (для устройств, неспособных автоматически распознать режим работы, клиент по очереди устанавливает режим работы интерфейса (через ifconfig?) и пытается получить ответ сервера)
- значение опций
- supersede имя-опции значение; (заменить полученное от сервера значение данной опции)
- prepend имя-опции значение; (указанное значение добавляется перед значением, полученным от сервера; для опций типа список серверов и т.д.)
- append имя-опции значение; (указанное значение добавляется за значением, полученным от сервера; для опций типа список серверов и т.д.)
- request имя-опции [, имя-опции . ]; (имена желаемых от сервера опций; по умолчанию: subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name, nis-domain, nis-servers, ntp-servers)
- default имя-опции значение; (принять это значение, если сервер не вернул данную опцию)
- require имя-опции [, имя-опции . ]; (имена опций, которые сервер должен послать обязательно, иначе предложение будет отвергнуто)
- send имя-опции значение; (посылать при запросе на сервер)
- ожидания и прочее
- timeout 60; (секунд; при неудаче клиент пытается использовать статические адреса из конфигурационного файла или файла аренды)
- retry 300; (секунд ждать перед повтором цикла поиска)
- select-timeout 0; (секунд ждать лучшего предложения)
- reboot 10; (секунд ждать подтверждения старого адреса при перезагрузке)
- initial-interval 10; (секунд перед первым повтором запроса)
- что делать, если сервер отсутствует (аналогичный синтаксис и у файла dhclient.leases):
- bootp; (использовать сервер BOOTP)
- interface «имя-интерфейса»;
- fixed-address IP-адрес; (обязательное утверждение)
- filename «имя-загрузочного-файла»;
- server-name «имя-загрузочного-сервера»;
- option имя значение;
- script «имя-dhclient-script»;
- vendor option space «имя-пространства-опций»;
- medium «параметр»; (передаётся dhclient-script и далее ifconfig)
- renew дата; (время перехода в режим обновления аренды; время в формате: )
- rebind дата; (время перехода в режим получения новой аренды)
- expire дата; (время прекращения использования арендованного адреса)
- описание дополнительной подсети на том же интерфейсе, для которого запрашивается аренда:
Скрипт dhclient-script вызывается dhclient для установки интерфейса до выдачи запроса серверу, при проверка предложенного адреса, для полной установки интерфейса, при проверке предустановленой аренды при отсутствии сервера и при полном отсутствии информации об адресе. При вызове передаётся переменная окружения reason:
- MEDIUM (установка типа интерфейса, передаются параметры interface, medium)
- PREINIT (первоначальная установка интерфейса перед посылкой запроса, передаются параметры interface, medium и м.б. alias_ip_address, который необходимо удалить с интерфейса)
- BOUND (new_ip_address, interface, medium; каждая полученная опция передаётся через переменную, имя переменной делается из имени опции заменой «-» на «_» и добавления «new_» в начале; запятые в списках серверов заменяются на пробелы; alias_ip_address и alias_. )
- RENEW (в дополнение к переменым new_. передаются переменные old_. )
- REBIND (в дополнение к RENEW очищает таблицу ARP)
- REBOOT (аналогично BOUND)
- EXPIRE (удалить всё связанное со старыми параметрами как в RENEW)
- FAIL (связаться с сервером не удалось, параметры из lease тоже неверны)
- TIMEOUT (связаться с сервером не удалось, однако обнаружены параметры из объявления lease или старая аренда)
Если DHCP сервер раздаёт адреса NTP серверов, то на сервере NTP необходимо добавить в /etc/sysconfig/network строку PEERNTP=no, иначе dhclient будет «улучшать» /etc/ntp.conf.
Microsoft Windows 2000 Server запрашивает (идентификатор клиента — его MAC адрес; vendor class identifier — «MSFT 5.0»):
- Subnet Mask
- Router
- Domain Name Server
- Domain Name
- Perform Router Discovery
- Static Route
- Vendor Specific
- NetBIOS over TCP/IP Name Server
- NetBIOS over TCP/IP Node Type
- NetBIOS over TCP/IP Scope