DHCP (англ. Dynamic Host Configuration Protocol — протокол динамической конфигурации узла) — это сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к т. н. серверу DHCP, и получает от него нужные параметры. Сетевой администратор может задать диапазон адресов, распределяемых сервером среди компьютеров. Это позволяет избежать ручной настройки компьютеров сети и уменьшает количество ошибок.
Это вступлении к статьи о DHCP в Википедии. Рекомендую прочитать, возможно узнаете что-либо новенькое. Ну а я приступаю к описанию установки и настройки DHCP-сервера.
Устанавливать будем из портов (надеюсь они у вас в актуальном состоянии). Перед компиляцией порта сервера DHCP надо убедиться, встроено ли устройство bpf в ядро. Если нет - пересоберите ядро с поддержкой bpf.
# cd /usr/ports/net/isc-dhcp31-server && make install clean
Options for isc-dhcp31-server 3.1.3 [X] DHCP_PARANOIA add -user, -group and -chroot options [X] DHCP_JAIL add -chroot and -jail options [ ] DHCP_SOCKETS use sockets instead of /dev/bpf (jail-only) [X] OPENSSL_BASE use the base system OpenSSL (required by TLS) [ ] OPENSSL_PORT use OpenSSL from ports (required by TLS) |
Опции оставляю по дефолту.
По завершению установки порт уведомляет нас о создании пользователя и группы dhcp, а также выводит на экран информацию, которая по мнению разработчиков может пригодится при настройке.
После установки есть пример файла конфигурации: /usr/local/etc/dhcpd.conf.sample. Однако мы не ищем легких путей и будем "ваять" свой
Создадим конфигурационный файл:
# touch /usr/local/etc/dhcpd.conf |
Потом наполняем этот файл необходимыми параметрами, в зависимости от поставленых задач. В моем случае конфигурационный файл получился такой:
# *** Глобальные параметры *** #
# Какое доменное имя будем присваивать хостам # Описываем сроки аренды адреса # Делаем наш сервер "авторитетным" для обслуживаемых сетей # Указываем, что мы не используем динамически обновляемые ДНС # Указываем, как поступать серверу с неизвестными клиентами. В моем случае им будет # *** Описываем подсети *** #
# Задаем подсеть # Описываем диапазон, из которого будем выдавать IP # Указываем ДНС-сервера # Указываем шлюз для сети } # Вторая подсеть. Опции аналогичны первой subnet 10.16.33.0 netmask 255.255.255.0 { # Описываем отдельные хосты
|
Вот такой вот коротенький конфигурационный файл. Тем не менее - конфиг полностью рабочий. Более детально ознакомиться с возможностями можно на странице руководства dhcpd.conf.
Далее добавляем в rc.conf опции запуска dhcp-сервера. Их целый блок
# cat /etc/rc.conf | grep dhcp dhcpd_enable="YES" # dhcpd включен? dhcpd_flags="-q" # исполняемые опции dhcpd_conf="/usr/local/etc/dhcpd.conf" # Полный путь к конфигурационному файлу dhcpd_ifaces="vlan32 vlan33" # На каких интерфейсах "слушать" запросы dhcpd_withumask="022" dhcpd_chuser_enable="YES" # Запуск без привилегий? dhcpd_withuser="dhcpd" # От имени какого пользователя стартовать сервер dhcpd_withgroup="dhcpd" # От имени какой групы стартовать сервер dhcpd_chroot_enable="YES" # Запускать chroot? dhcpd_devfs_enable="YES" # Использовать devfs если доступно? dhcpd_rootdir="/var/db/dhcpd" # Директория для запуска dhcpd_flags="-early_chroot" |
Запускаем DHCP-сервер.
# sh /usr/local/etc/rc.d/isc-dhcpd start Starting dhcpd. Internet Systems Consortium DHCP Server V3.1.3 Copyright 2004-2009 Internet Systems Consortium. All rights reserved. For info, please visit https://www.isc.org/software/dhcp/ Wrote 0 leases to leases file. Listening on BPF/vlan33/00:14:5e:22:11:2a/10.16.33/24 Sending on BPF/vlan33/00:14:5e:22:11:2a/10.16.33/24 Listening on BPF/vlan32/00:14:5e:22:11:2a/10.16.32/24 Sending on BPF/vlan32/00:14:5e:22:11:2a/10.16.32/24 Sending on Socket/fallback/fallback-net |
Вуаля... Все получилось. Чего и вам желаю
Вопрос возник. Если в сети
Вопрос возник. Если в сети появится второй DHCP сервер, который будет выдавать, скажем, ip адреса из другой подсети. Как клиент будет устанавливать параметры сети, от кого первым получит ip тот и установит?
Протокол DHCP построен так,
Протокол DHCP построен так, что клиент может обращаться с запросом сразу к нескольким серверам.
Клиент DHCP, нуждающийся в адресе, посылает широковещательный пакет DHCPDISCOVER в поисках сервера. Пакет содержит аппаратный адрес запрашивающего клиента. Затем один или несколько серверов DHCP рассматривают запрос и посылают в ответ пакет DHCPOFFER, содержащий предлагаемый IP-адрес и "время аренды".
Клиент выбирает адрес из полученных пакетов DHCPOFFER. Выбор клиента зависит от его назначения - например, он может выбрать адрес с наибольшим временем аренды. Вслед за тем клиент посылает пакет DHCPREQUEST с адресом выбранного сервера.
Выбранный сервер посылает подтверждение (DHCPACK), и процесс согласования завершается. Пакет DHCPACK содержит оговоренные адрес и время аренды. Сервер помечает выделенный адрес как занятый - до окончания срока аренды этот адрес не может быть присвоен другому клиенту. Клиенту осталось только сконфигурировать себя в соответствии с назначенным адресом и можно приступать к работе в сети.
Итак, на запрос DHCPDISCOVER может ответить несколько серверов. Клиент должен выбрать одно из предложений и послать в ответ пакет DHCPREQUEST с идентификатором выбранного сервера. Другие серверы просматривают пакет DHCPREQUEST и заключают на основе идентификатора сервера, что их предложение было отвергнуто. Таким образом, они знают, что предложенные ими IP-адреса свободны для назначения другим клиентам.
Как упоминалось выше, выбранный сервер завершает согласование отсылкой пакета DHCPACK. В случае если сервер не может принять конфигурацию, он посылает пакет DHCPNAK (отказ в подтверждении), что вынуждает клиента начать процесс согласования заново.
Исходя из этого, если в сети два DHCP-сервера с разными конфигурациями, нету никакой гарантии, что клиент выберет именно ваш сервер.
Re: DHCP-сервер в сети: если неохота бегать от компьютера к ...
В конфиге ошибка
# *** Глобальные параметры *** #
# Какое доменное имя будем присваивать хостам
option domain-name "domain.com";
# Описываем сроки аренды адреса
default-lease-time 304400;
max-lease-time 604800;
# Делаем наш сервер "авторитетным" для обслуживаемых сетей
authoritative;
# Указываем, что мы не используем динамически обновляемые ДНС
ddns-update-style none;
# Указываем, как поступать серверу с неизвестными клиентами. В моем случае им будет
# отказано в обслуживании
deny unknown-clients;
# *** Описываем подсети *** #
# Задаем подсеть
subnet 10.16.32.0 netmask 255.255.255.0 {
# Описываем диапазон, из которого будем выдавать IP
range 10.16.32.2 10.16.32.254;
# Указываем ДНС-сервера
option domain-name-servers ns1.domain.com, ns2.domain.com;
# Указываем шлюз для сети
option routers 10.16.32.1;
# Описываем отдельные хосты
host User32-1 { hardware ethernet 00:0e:2e:a6:9f:ef; fixed-address 10.16.32.2; }
host User32-2 { hardware ethernet 00:1f:c6:d9:a3:e3; fixed-address 10.16.32.3; }
}
Скобка должна закрываться перед описанием хостов
В версии 4.2
Re: DHCP-сервер в сети: если неохота бегать от компьютера к ...
Исправил.
Сам уже давно использую пулы, которые как раз и вписываются в секцию subnet. А этот конфиг "перекочевал" еще с 3 ветки, где все работало в такой конфигурации.