DHCP-сервер для локальной сети на базе ISC DHCP Server на FreeBSD


Рано или поздно любой системный администратор осознает необходимость перевода вверенных ему компьютеров и сетевых устройств на автоматическое получение параметров протокола TCP/IP с помощью DHCP (Dynamic Host Configuration Protocol). С учетом того, что большинство современных операционных систем имеет в своем составе включенные по умолчанию DHCP-клиенты, не нуждающиеся в дополнительной настройке, процедура внедрения DHCP сводится к установке и настройке DHCP-сервера.
Постановка задачи

Данная статья описывает простую, но достаточную для обслуживания небольших локальных сетей конфигурацию самого популярного DHCP-сервера для операционных систем семейства Linux / Unix от Internet Systems Consortium (далее - DHCP-сервера). Предложенная конфигурация обеспечивает динамическое распределение заданного диапазона IP-адресов, выделение фиксированных IP-адресов нескольким компьютерам (серверам), а также передачу клиентам всех параметров, необходимых для работы в сети TCP/IP. Для повышения безопасности DHCP-сервер запускается в chroot(8) от имени непривилегированных пользователя / группы, а для повышения удобства диагностики и мониторинга он интегрирован со штатными средствами управления логами syslogd(8) и newsyslog(8).
Исходные данные

Имеется сервер с FreeBSD, подключенный к локальной сети с IP-адресом 192.168.0.0/24 через интерфейс bge1 с IP-адресом 192.168.0.1. На него будет установлен DHCP-сервер. Имеется несколько десятков компьютеров и сетевых устройств, которым следует выдавать IP-адреса из диапазона 192.168.0.101 - 192.168.0.200, а также два сервера, которым нужно выдавать фиксированные IP-адреса 192.168.0.2 и 192.168.0.3. Кроме того, всем DHCP-клиентам необходимо сообщать имя DNS-домена company.local, IP-адреса DNS-серверов 192.168.0.2 и 192.168.0.3, а также IP-адрес шлюза по умолчанию 192.168.0.1. DHCP-сервер будет устанавливаться из портов, поэтому я рекомендую обновить их.
Установка и настройка DHCP-сервера

Для обеспечения работоспособности DHCP-сервера требуется поддержка устройств bpf(4) ядром FreeBSD. Стандартное ядро GENERIC поддерживает устройства bpf, а при использовании самосборного ядра придется убедиться в наличии строки device bpf в файле его конфигурации, и, если таковая отсутствует, добавить ее, пересобрать ядро и перезагрузить систему.
Для установки DHCP-сервера из портов следует выполнить команды:1
2 cd /usr/ports/net/isc-dhcp41-server
make config install clean

В окне конфигурации нужно отметить единственную опцию [X] DHCP_PARANOIA Enable support for chroot. Обратите внимание, что при установке DHCP-сервера будут созданы пользователь dhcpd, группа dhcpd и заготовка файла конфигурации /usr/local/etc/dhcpd.conf.sample.
По умолчанию конфигурация DHCP-сервера хранится в файле /usr/local/etc/dhcpd.conf. Я предпочитаю создавать этот файл без использования вышеупомянутой заготовки, содержащей слишком много лишнего. В рассматриваемом случае файл конфигурации должен иметь такой вид:1

option domain-name "company.local";
option domain-name-servers 192.168.0.2, 192.168.0.3;
option routers 192.168.0.1;
authoritative;
log-facility local7;
subnet 192.168.0.0 netmask 255.255.255.0 {range 192.168.0.100 192.168.0.200;}
host server2 {hardware ethernet 00:1c:c4:a5:07:ca; fixed-address 192.168.0.2;}
host server3 {hardware ethernet d8:d3:85:dc:df:bc; fixed-address 192.168.0.3;}


В данном файле заданы следующие значения параметров: option domain-name..., option domain-name-servers... и option routers... - имя DNS-домена, список IP-адресов и/или DNS-имен DNS-серверов и список IP-адресов и/или DNS-имен шлюзов (учтите, что перечисленные параметры относятся ко всем обслуживаемым подсетям, но их можно переопределить в секциях subnet для индивидуальной настройки отдельных подсетей); authoritative - признак авторитетности DHCP-сервера (авторитетный DHCP-сервер может инициировать прекращение существующих договоров аренды и запускать повторную процедуру получения IP-адресов); log-facility... - раздел системного журнала, в который будут перенаправляться сообщения DHCP-сервера; subnet... - обслуживаемая подсеть с диапазоном динамически выделяемых IP-адресов range...; host... - узлы с MAС-адресами сетевых карт hardware ethernet, которым необходимо выдавать предопределенные IP-адреса fixed-address (в случае корректно настроенного резольвинга в качестве fixed-address можно использовать не только IP-адреса узлов, но и их DNS-имена).
Более подробная информация о параметрах, которые можно задать в файле конфигурации DHCP-сервера, имеется в dhcpd.conf(5), а список всех опций DHCP (параметров TCP/IP-сети, которые можно сообщить клиентам) - в dhcp-options(5).
Для того, чтобы DHCP-сервер автоматически запускался при запуске операционной системы, следует добавить в файл /etc/rc.conf строки:1

dhcpd_enable="YES"
dhcpd_flags="-q -4"
dhcpd_conf="/usr/local/etc/dhcpd.conf"
dhcpd_ifaces="bge1"
dhcpd_withumask="022"
dhcpd_chuser_enable="YES"
dhcpd_withuser="dhcpd"
dhcpd_withgroup="dhcpd"
dhcpd_chroot_enable="YES"
dhcpd_devfs_enable="YES"
dhcpd_rootdir="/var/db/dhcpd"


Данные строки запрещают вывод диагностических сообщений на консоль и отключают протокол IPv6, задают имя файла конфигурации, привязывают DHCP-сервер к интерфейсу bge1 (bge1 нужно заменить на имя используемого интерфейса, а при прослушивании нескольких интерфейсов придется перечислить их имена, используя пробел в качестве разделителя), устанавливают маску создаваемых файлов 022 (запрещают запись всем, кроме владельца), а также обеспечивают запуск в chroot-окружении с корневой папкой /var/db/dhcpd от имени пользователя dhcpd и группы dhcpd.
На этом настройка DHCP-сервера заканчивается. Можно запустить сервер командой /usr/local/etc/rc.d/isc-dhcpd start, а затем запросить его состояние командой /usr/local/etc/rc.d/isc-dhcpd status. Если последняя команда выдаст сообщение dhcpd is running as pid ..., все нормально, если же – dhcpd is not running, придется найти и устранить ошибки в файлах конфигурации.
Анализ состояния DHCP-сервера

Для включения вывода сообщений DHCP-сервера на консоль следует изменить определение переменной dhcpd_flags в файле /etc/rc.conf:1 dhcpg_flags="-4"


и перезапустить DHCP-сервер командой /usr/local/etc/rc.d/isc-dhcpd restart.
Признаком корректного запуска DHCP-сервера может служить примерно такое сообщение:Starting dhcpd.
Internet Systems Consortium DHCP Server 4.1.2
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Wrote 0 deleted host decls to leases file.
Wrote 0 new dynamic host decls to leases file.
Wrote 0 leases to leases file.
Listening on BPF/bge1/00:1c:c4:fa:7c:73/192.168.0.0/24
Sending on BPF/bge1/00:1c:c4:fa:7c:73/192.168.0.0/24
Sending on Socket/fallback/fallback-net


Выделение динамических IP-адресов DHCP-клиентам сопровождается примерно такими сообщениями:... dhcpd: DHCPDISCOVER from 90:21:55:bd:0b:36 via bge1
... dhcpd: DHCPOFFER on 192.168.0.101 to 90:21:55:bd:0b:36 (android_81b37c43c8cbaef2) via bge1
... dhcpd: DHCPREQUEST for 192.168.0.101 (192.168.0.1) from 90:21:55:bd:0b:36 (android_81b37c43c8cbaef2) via bge1
... dhcpd: DHCPACK on 192.168.0.101 to 90:21:55:bd:0b:36 (android_81b37c43c8cbaef2) via bge1


а выделение предопределенных IP-адресов по заданным MAC-адресам сетевых карт - примерно такими:... dhcpd: DHCPDISCOVER from 00:1c:c4:a5:07:ca via bge1
... dhcpd: DHCPOFFER on 192.168.0.2 to 00:1c:c4:a5:07:ca via bge1
... dhcpd: Dynamic and static leases present for 192.168.0.2.
... dhcpd: Remove host declaration server2 or remove 192.168.0.2
... dhcpd: from the dynamic address pool for 192.168.0.0/24
... dhcpd: DHCPREQUEST for 192.168.0.2 (192.168.0.1) from 00:1c:c4:a5:07:ca via bge1
... dhcpd: DHCPACK on 192.168.0.2 to 00:1c:c4:a5:07:ca via bge1


Рассмотренный способ наблюдения за состоянием DHCP-сервера прост и понятен (особенно при наличии под рукой документа RFC-2131), но очень неудобен в связи с необходимостью смотреть на консоль, на которую выдается огромное количество "лишней" информации.
Гораздо удобнее обеспечить запись сообщений DHCP-сервера в отдельный лог с помощью штатного демона syslogd. При этом нужно учесть, что из-за работы в chroot-окружении DHCP-сервер не может взаимодействовать с syslogd, сконфигурированным по умолчанию, т.к. сокет последнего находится за пределами chroot-окружения первого. Для исправления данного обстоятельства необходимо заставить syslogd слушать еще один сокет, имеющий имя /var/run/log относительно корневой папки chroot-окружения DHCP-сервера. Для автоматического создания такого сокета в процессе запуска syslogd, следует добавить соответствующий ключ -l к определению переменной syslogd_flags в файле /etc/rc.conf:1 syslogd_flags="... -l /var/db/dhcpd/var/run/log"


Для того, чтобы syslogd записывал сообщения DHCP-сервера в лог /var/log/dhcpd.log, нужно добавить в файл /etc/syslog.conf строку:1 local7.* /var/log/dhcpd.log


Для вступления изменений в силу необходимо создать пустой лог командой touch /var/log/dhcpd.log, а затем перезапустить syslogd командой /etc/rc.d/syslogd restart. Начиная с этого момента, все сообщения DHCP-сервера будут записываться в лог /var/log/dhcpd.log.
Для того, чтобы с течением времени лог DHCP-сервер не разрастался до бесконечности, следует включить его ротацию с помощью штатной утилиты newsyslog. Например, для ежесуточного усечения лога /var/log/dhcpd.log с сохранением семи предыдущих копий, сжатых архиватором bzip2(1), нужно добавить в файл /etc/newsyslog.conf строку:1 /var/log/dhcpd.log 644 7 * @T00 JC

Заключение

Я надеюсь, что не забыл ничего важного, и приведенной информации хватит для корректной настройки и последующей отладки DHCP-сервера от ISC на компьютере с операционной системой FreeBSD.

http://www.sergeysl.ru/freebsd-isc-dhcp-server/

Обновлено: 12.03.2015