FreeBSD: DHCP-сервер для локальной сети на базе ISC DHCP Server [2011]
Рано или поздно каждый системный администратор задумывается о переводе вверенных ему компьютеров и сетевых устройств на автоматическое получение параметров протокола 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-сервера из портов следует выполнить команды:
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. Я предпочитаю создавать этот файл без использования вышеупомянутой заготовки, содержащей слишком много лишнего. В рассматриваемом случае файл конфигурации должен иметь такой вид:
В данном файле заданы следующие значения параметров: 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 строки:
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:
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:
syslogd_flags="... -l /var/db/dhcpd/var/run/log"
Для того, чтобы syslogd записывал сообщения DHCP-сервера в лог /var/log/dhcpd.log, нужно добавить в файл /etc/syslog.conf строку:
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 строку:
/var/log/dhcpd.log 644 7 * @T00 JC
Заключение
Я надеюсь, что не забыл ничего важного, и приведенной информации хватит для корректной настройки и последующей отладки DHCP-сервера от ISC на компьютере с операционной системой FreeBSD.