ISC-DHCP

DHCP - это расширение протокола BOOTP, который был придуман для того, чтобы бездисковые станции UNIX могли загружаться по сети. Подсистема BOOTP предоставляет клиентам IP-адреса, сетевые маски, стандартные шлюзы, а так же информацию, касающуюся начальной загрузки через TFTP. Протокол DHCP не ограничивается этими параметрами, вводя понятие аренды. Хватит пока теории - на практике любому сетевику средних и больших сетей необходима управляемая сетевая структура которая, будет динамично управляться и обновляться при необходимости. Для этого мы и используем протокол DHCP.

Воспользуемся эталонным ПО в реализации DHCP - демон организации Internet Systems Consortium. Мы опишем конфигурацию обеспечивающую, динамическое распределение указанного диапазона IP-адресов, фиксирование IP-адресов за сетевым устройствами, а также передачу клиентам разнообразных параметров необходимых, для работы в сети TCP/IP. А так же реализуем дополнительные трюки, к примеру - запуск в нескольких подсетях, ограничивание неизвестных клиентов, и, живя в эпоху сетевых дикарей, мы будем повышать безопасность демона путем запуска в песочнице (изменение корневого каталога chroot) и работой от имени непривилегированного пользователя. Но и на старуху бывает порнуха - предохраняйтесь и обновляетесь. =)

Содержание:

Установка

Установка проста, но не забывайте сначала обновить систему портов. Найдем необходимый нам порт.

# cd /usr/ports/
# make search name=isc-dhcp41-server
Port:   isc-dhcp41-server-4.1.e,2
Path:   /usr/ports/net/isc-dhcp41-server
Info:   The ISC Dynamic Host Configuration Protocol server
Maint:  douglas@douglasthrift.net
B-deps:
R-deps:
WWW:    http://www.isc.org/products/DHCP/

Начнем установку и не забудем, что мы параноики и включим поддержку песочницы.

# cd /usr/ports/net/isc-dhcp41-server
# make config
Options for isc-dhcp41-server 4.1.e,2
 
[X] DHCP_PARANOIA  Enable support for chroot
[ ] DHCP_LDAP      Experimental LDAP backend support
[ ] DHCP_LDAP_SSL  Support LDAP connection over SSL/TLS
 
# make install clean
~~~
    This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/sbin/dhcpd
/usr/local/bin/omshell
 
      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
/usr/local/etc/rc.d/isc-dhcpd
/usr/local/etc/rc.d/isc-dhcpd6
 
      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.
 
      For more information, and contact details about the security
      status of this software, see the following webpage:
http://www.isc.org/products/DHCP/
===>  Cleaning for isc-dhcp41-server-4.1.e,2

Конфигурация

На данном этапе необходимо откорректировать и дополнить конфигурационный файл демона своими параметрами.

# cd /usr/local/etc/
# chmod u+w dhcpd.conf
# cat dhcpd.conf

Этот конфиг разрабатывался с учетом смешанной сети (Windows серверы и клиенты) и некоторые параметры netbios и ntp-servers можно закомментировать.

## Глобальные параметры ##
# указываем доменное имя
option domain-name "firma.local";
# имя DNS сервера
option domain-name-servers ns1.firma.local;
# IP DNS сервер (предыдущая строчка взаимозаменяемая)
#option domain-name-servers 192.168.0.1;
 
# по умолчанию на сколько секунд выдаётся IP-адрес
default-lease-time 600;
# максимальное время на сколько выдаётся IP-адрес
max-lease-time 1200;
# минимальное время на сколько выдаётся IP
#min-lease-time 1000;
 
# указываем, что не будем обновлять DNS-таблицу
ddns-update-style none;
# указываем, что наш сервер будет единственным авторитетным для наших сетей
authoritative;
# отправка логов DHCP в журнал (необходимо изменить syslog.conf)
log-facility local7;
 
## Параметры подсети ##
# задаем нашу подсеть и ее маску
subnet 192.168.0.0 netmask 255.255.255.0 {
        # диапазон выдачи IP адресов (фиксированные IP адреса серверов
        # должны лежат вне этого диапазона)
	range 192.168.0.101 192.168.0.230;
        # маска подсети
	option subnet-mask 255.255.255.0;
        # шлюз по умолчанию
	option routers 192.168.0.3;
        # определяем широковещательный адрес
	option broadcast-address 192.168.0.255;
        # указываем сервер времени (доп.)
	option ntp-servers 192.168.0.1;
        # сообщаем клиенту, должен ли тот реализовывать 
        # широковещательный принцип преобразования адресов 
        # или обращаться к серверу WINS (доп.)
	option netbios-node-type 8;
        # адрес сервера для работы с WINS (доп.)
	option netbios-name-servers 192.168.0.1;
        # параметры для работы с WINS (доп.)
	option netbios-dd-server 192.168.0.1; 
        default-lease-time 6000;
        max-lease-time 72000;
        min-lease-time 72000;
 
}

Некоторые параметры глобальных и субсетей можно менять, заменять и дополнять в зависимости от необходимого результата.

А теперь приступим к формированию групп и привязки IP к MAC адресу сетевого устройства.

group {
host PC0054 {
  hardware ethernet 00:26:5A:13:E7:5C;
  fixed-address 192.168.0.54;
}
host PC0055 {
  hardware ethernet 00:24:54:74:36:14;
  fixed-address 192.168.0.55;
}
}
 
group { 
host PC0060 {
  hardware ethernet 00:17:31:67:E0:29;
  fixed-address 192.168.0.60;
}
host PC0061 {
  hardware ethernet 00:1C:C0:1B:D1:2B;
  fixed-address 192.168.0.61;
}
}

Из этого вам уже понятно, что мы сформировали две группы (для удобства работы и можно добавлять больше групп или вообще без них работать)

Запуск и работа в chroot

rc.conf

Для автоматического запуска при перезагрузке сервера внесем в /etc/rc.conf опции и укажем специфичные параметры, такие как: запуск в песочнице, нужный сетевой интерфейс, путь до конфигурационного файла, необходимого пользователя и тп.

# cat /etc/rc.conf |grep dhcpd
dhcpd_enable="YES"                      # включить dhcpd сервер?
dhcpd_flags="-q"                        # командные опции (вкл. тихая работа)
dhcpd_conf="/usr/local/etc/dhcpd.conf"  # конфигурационный файл
dhcpd_ifaces="em0"                      # сетевой интерфейс
dhcpd_withumask="022"                   # маска создаваемых файлов
dhcpd_chuser_enable="YES"               # работать без привелегий?
dhcpd_withuser="dhcpd"                  # имя пользователя для запуска
dhcpd_withgroup="dhcpd"                 # группа для запуска
dhcpd_chroot_enable="YES"               # запускать в песочнице?
dhcpd_devfs_enable="YES"                # использовать devfs если есть?
#dhcpd_makedev_enable="YES"             # использовать MAKEDEV?
dhcpd_rootdir="/var/db/dhcpd"           # каталог работы
dhcpd_includedir="/usr/local/etc"       # включить каталог с конфигурационными файлами
dhcpd_flags="-early_chroot"             # необходимо для полного корня

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

Запустим демон.

# /usr/local/etc/rc.d/isc-dhcpd start
Starting dhcpd.
Internet Systems Consortium DHCP Server 4.1-ESV-R2
Copyright 2004-2011 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 31 leases to leases file.
Listening on BPF/em0/00:16:76:32:c8:a1/192.168.0.0/24
Sending on   BPF/em0/00:16:76:32:c8:a1/192.168.0.0/24
Sending on   Socket/fallback/fallback-net

Посмотрим, создалась ли ФС с песочницей для dhcpd.

#df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
/dev/mirror/gm0s1a    989M    442M    468M    49%    /
devfs                 1.0K    1.0K      0B   100%    /dev
/dev/mirror/gm0s1g     67G     14G     48G    22%    /ftp
/dev/mirror/gm0s1d     19G     15G    2.9G    84%    /usr
/dev/mirror/gm0s1e     19G    3.1G     15G    17%    /var
tmpfs                 2.3G     52K    2.3G     0%    /tmp 
devfs                 1.0K    1.0K      0B   100%    /var/db/dhcpd/dev

Созданная структура песочницы - ОС в миниатюре, и в ней есть всё, что необходимо для запуска этого демона.
# ls /var/db/dhcpd/
dev etc usr var

Запущен ли демон.

# ps -ax | grep dhcp
  975  ??  Ss     0:00,01 /usr/local/sbin/dhcpd -q -cf /usr/local/etc/dhcpd.conf -lf 
/var/db/dhcpd/dhcpd.
 1759   0  S+     0:00,00 grep dhcp

Остановить демон и запустить можно так.

# /usr/local/etc/rc.d/isc-dhcpd stop
Stopping dhcpd.
# /usr/local/etc/rc.d/isc-dhcpd start
Starting dhcpd.

Или так.

# kill `cat /var/db/dhcpd/var/run/dhcpd/dhcpd.pid`
# /usr/local/etc/rc.d/isc-dhcpd start
Starting dhcpd.

Для перечитывания конфигурационного файла можно просто перезапустить демон

# /usr/local/etc/rc.d/isc-dhcpd restart

Сложные вопросы конфигурации

Работа в двух подсетях

Иногда случается, что в одном физическом сегменте сосуществуют несколько IP подсетей. Например, в организации существует требование использовать 8-битные маски подсетей, но сеть разрослась до размеров, превышающих 254 хоста, в этом случае необходимо использовать две подсети с 8-битными масками. В этом случае секции subnet, описывающие две эти подсети, могут быть заключены в секцию shared-network.
Добавляем после указанных глобальных параметров:

# Указываем, что будем использовать разные подсети с названием <strong>mynet</strong>.
shared-network mynet {
### Локальные параметры подсети 192.168.1.0/24: ###
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.10 192.168.1.200;
option broadcast-address 192.168.1.255;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.1.1;
option routers 192.168.1.2;
}
 
### Локальные параметры подсети 192.168.2.0/24: ###
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.10 192.168.2.200;
option broadcast-address 192.168.2.255;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.2.1;
option routers 192.168.2.2;
}
 
host DC23 {
    hardware ethernet 6c:f0:49:e3:92:9d;
    fixed-address 192.168.1.11;
}
 
host RM54 {
    hardware ethernet 0:13:8f:24:a4:d9;
    fixed-address 192.168.2.22;
} 
 
} 

В /etc/rc.conf не забудем внести нужные нам интерфейсы для прослушки - это нужно при использовании к примеру разных сетевых карт.

# cat /etc/rc.conf |grep dhcpd_ifaces
dhcpd_ifaces="em0 em1"   # доп. сетевой интерфейс через пробел

Если у вас alias на сетевой карте - ничего менять не нужно.

Разрешить или запретить неизвестных клиентов

Иногда необходимо ограничивать работу неизвестных клиентов, о которых нет упоминания в dhcp.conf, или использовать разные конфигурации сетей в зависимости от клиента - это делается двумя параметрами.

shared-network “net” {
# подсеть для известных клиентов
subnet 192.168.1.0 netmask 255.255.255.0
pool {
range 192.168.1.10 192.168.1.200;
option routers 192.168.1.2;
deny unknown-clients;
}
}
 
# подсеть для не известных клиентов
subnet 192.168.2.0 netmask 255.255.255.0
pool {
range 192.168.2.190 192.168.2.200;
allow unknown-clients;
}
}
}

В данном примере в подсети №1 мы запрещаем получать настройки неизвестным клиентам и разрешаем их работу в подсети №2.

IPv6

И так эта версия протокола накладывает свои ограничения на работу DHCP во-первых вы должны сконфигурировать свою сетевую карту на работу с IP6, во-вторых, создать отдельный конфигурационный файл dhcp6.conf, а в в-третьих, запустить отдельный демон для IP6. Небольшой FAQ.
Я пока пропущу данный раздел за ненадобностью мне.

Логи

Обязательно включим логгирование - без этого бывает очень тяжело разобраться в появившейся проблеме. Укажем демону syslogd, чтобы он записывал сообщения DHCP-сервера в лог /var/log/dhcpd.log. Необходимо добавить в /etc/syslog.conf строку:

# cat /etc/syslog.conf |grep dhcp
#local7.*                                        /var/log/dhcpd.log
!dhcpd
*.*                                             /var/log/dhcpd.log
 
# /etc/rc.d/syslogd restart

Создадим лог и дадим права для записи.

# touch /var/log/dhcpd.log
# chown dhcpd:dhcpd /var/log/dhcpd.log
# ll /var/log/dhcpd.log
-rw-r--r--  1 dhcpd  dhcpd     0B 22 апр 21:41 /var/log/dhcpd.log

FAQ

В: Где DHCP хранит списки выданных адресов?
О: У DHCP есть файл базы данных по арендуемым параметрам называемый dhcp.leases также демон периодически делает резервную копию этого файла dhcp.leases~. И при проблемах с основным файлом вы можете его заменить резервным.


Источник статьи