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: [email protected] 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~. И при проблемах с основным файлом вы можете его заменить резервным.