
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;
}
}Из этого вам уже понятно, что мы сформировали две группы (для удобства работы и можно добавлять больше групп или вообще без них работать)
Для автоматического запуска при перезагрузке сервера внесем в /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" # необходимо для полного корня
#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" # доп. сетевой интерфейс через пробел
Иногда необходимо ограничивать работу неизвестных клиентов, о которых нет упоминания в 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;
}
}
}И так эта версия протокола накладывает свои ограничения на работу 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
В: Где DHCP хранит списки выданных адресов?
О: У DHCP есть файл базы данных по арендуемым параметрам называемый dhcp.leases также демон периодически делает резервную копию этого файла dhcp.leases~. И при проблемах с основным файлом вы можете его заменить резервным.