ISC-DHCP

Аватар пользователя Raven2000

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;
}
}

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

  • host - имя сетевого устройства
  • hardware ethernet - его MAC адрес
  • fixed-address - привязанный за ним IP адрес

Запуск и работа в 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, или использовать разные конфигурации сетей в зависимости от клиента - это делается двумя параметрами.

  • deny unknown-clients - запретить неизвестных клиентов
  • allow unknown-clients - разрешить неизвестных клиентов

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

Дополнительные материалы
Ваша оценка: Нет Средняя: 5 (6 голосов)

я себе ещё добавил

я себе ещё добавил это:

(pts/0)[ttys@ttys:~]> grep dhcpd /etc/newsyslog.conf
/var/log/dhcpd.log			600  7	   100	*     JC

Спасибо. Очень грамотно.

Спасибо. Очень грамотно.

# по умолчанию на сколько

# по умолчанию на сколько секунд выдаётся IP-адрес
default-lease-time 600;

это слишком мало для нормальной производственной ситуации. даже тотже антивирусник у вас не будет обновляться, постоянно будет сбрасываться ИП. выдавайте лучше на день, или на 8-ми часовой рабочий день.

rc.conf

Хорошая статья, все что мог охватил :).
У меня такое замечание:

dhcpd_enable="YES" # включить dhcpd сервер?
dhcpd_flags="-q" # командные опции (вкл. тихая работа)
#dhcpd_conf="/usr/local/etc/dhcpd.conf" # конфигурационный файл
dhcpd_ifaces="em0" # сетевой интерфейс
#dhcpd_withumask="022" # dhcpd_withumask=${dhcpd_withumask:-022}
dhcpd_chuser_enable="YES" # работать без привелегий?
#dhcpd_withuser="dhcpd" # dhcpd_withuser=${dhcpd_withuser:-${name}}, name=dhcpd
#dhcpd_withgroup="dhcpd" # dhcpd_withgroup=${dhcpd_withgroup:-${name}}
dhcpd_chroot_enable="YES" # запускать в песочнице?
#dhcpd_devfs_enable="YES" # dhcpd_devfs_enable=${dhcpd_devfs_enable:-"YES"}
#dhcpd_makedev_enable="YES" # использовать MAKEDEV?
dhcpd_rootdir="/var/db/dhcpd" # dhcpd_rootdir=${dhcpd_rootdir:-/var/db/${name}}
dhcpd_includedir="/usr/local/etc" # включить каталог с конфигурационными файлами
+-dhcpd_flags="-early_chroot" # это можно засунуть сюда # dhcpd_flags="" # -q -early_chroot # command option(s)

То что я комментировал, в дефолтном конфиге определенно точно так же.

dns =)

можно вместо ипов указать имена, при условии, что в днс всё правильно настроено =)

host ttys.loc {
    hardware ethernet 00:1b:fc:8b:fa:5d;
    fixed-address ttys.loc;
    }

ЗЫ ещё я бы добавил о dhcp-failover

RE:dns

Можно и по именам. Можно добавить и о dhcp-failover кстати ты это пробовал?

Если хочешь разобраться... Так иди и разбирайся!
[ igNix.ru | Технология жизни - технологии будущего ] [ Forum.igNix.ru ]

Диапазон исключений

Плохо, что у isc-dhcp нету диапазона исключений, как в виндовом (я не нашел..)
Например, задаем диапазон для аренды - 50 по 70-й, далее определяем для бухгалтерии 50 по 60й, дирекция 61-70. В бухгалтерии на данный момент 6 компов (50-55 айпи, резервация по маку), дирекция заняты все. В бухгалтерии пока 6 айпи свободны. Так вот диапазон исключения дает возможность их исключить, чтоб кто-то случайно не захватил из этого диапазона айпишник (например, настройка доступа для бухов на фаерволе - банк-клиенты, все такое). Если появляется новый бух, изменяем диапазон исключения и даем айпи новому буху. Как-то так...А тут надо подумать как реализовать..Например мелкими диапазонами распределять

Для этого вполне можно

Для этого вполне можно использовать те же самые пулы

## класс для бухгалтерии
class "accounting" { match hardware; }
subclass "accounting" 1:xx:xx:xx:xx:xx:xx;  # PC-1
subclass "accounting" 1:xx:xx:xx:xx:xx:xx;  # PC-2
subclass "accounting" 1:xx:xx:xx:xx:xx:xx;  # PC-3
......
 
shared-network 50-200 {
 
	subnet 192.168.100.0 netmask 255.255.255.0 {
 
		default-lease-time 7200;
		max-lease-time 86400;
		option broadcast-address 192.168.100.255;
 
		pool {
			range 192.168.100.50 192.168.100.60;
			option domain-name-servers 192.168.10.1;
			allow members of "accounting";
			deny members of "deputy";
			...
		}
		pool {
			range 192.168.100.61 192.168.100.70;
			option domain-name-servers 192.168.10.2;
			allow members of "deputy";
			deny members of "accounting";			
			...
		}
		....
	}
	....	
}

нету rc.conf

Походу в новых версиях Debian нету rc.conf и где прикажете те настройки заливать?

нету rc.conf

Походу в новых версиях Debian нету rc.conf и где прикажете те настройки заливать?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <p> <span> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <tr> <td> <em> <b> <u> <i> <strong> <font> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike> <caption>
  • Строки и параграфы переносятся автоматически.
  • Вы можете использовать подсветку исходного кода следующими тегами: <code>, <blockcode>, <apache>, <bash>, <c>, <cpp>, <mysql>, <perl>, <php>, <python>, <text>. The supported tag styles are: <foo>, [foo].
  • Glossary terms will be automatically marked with links to their descriptions. If there are certain phrases or sections of text that should be excluded from glossary marking and linking, use the special markup, [no-glossary] ... [/no-glossary]. Additionally, these HTML elements will not be scanned: a, abbr, acronym, code, pre.

Подробнее о форматировании

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
6 + 3 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.

Последние статьи

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer