FreeBSD: как установить сервер DHCP

В отличие от dhclient, в инсталляции по умолчанию сервер DHCP не представлен, и его надо устанавливать отдельно.

На FreeBSD доступно по крайней мере два порта (порт - имеется в виду ПО), которые позволяют настроить свой собственный DHCP сервер. Первый называется WIDE (http://www.wide.ad.jp/) или Widely Integrated Distributed Environment. По названию можно судить, что этот порт оптимизирован для очень больших сетей. Второй порт от ISC, или Internet Software Consortium, его можно найти здесь - http://www.isc.org/index.pl?/sw/dhcp/.

ПО dhclient для FreeBSD также пришел от ISC. Сайт ISC содежит ценную информацию по DHCP, включая FAQ и обучающие пособия. Мы рассмотрим именно установку DHCP-сервера от ISC. Процесс по шагам:

1. Перед компиляцией порта сервера DHCP надо убедиться, встроено ли устройство bpf в Ваше ядро. Если Вы используете ядро по умолчанию, сделайте поиск по файлу кофигурации ядра (если Вы не используется ядро по умолчанию, замените GENERIC на имя файла кофигурации Вашего собственного ядра):
$ grep bpf /usr/src/sys/i386/conf/GENERIC
# The `bpf' device enables the Berkeley Packet Filter.
device bpf # Berkeley packet filter

Если Вы не получили результана в ответ на команду grep, добавьте строку в файл конфигурации ядра и пересоберите ядро.

Если у Вас есть устройство bpf, соберите порт сервера DHCP:
# cd /usr/ports/net/isc-dhcp3-server/
# make install clean

Появится окно, где можно выбрать набор опций для компиляции. Лучше все оставить по умолчанию (просто выбрать Cancel). Далее пойдет процесс сборки и инсталляции (я оставил здесь только инетресные с точки зрения подсказки по настройке сообщения):
...
===> Installing rc.d startup script(s)
Added group "dhcpd".
Added user "dhcpd".

**** To setup dhcpd, you may have to copy /usr/local/etc/dhcpd.conf.sample
to /usr/local/etc/dhcpd.conf for editing.

**** This port installs dhcp daemon, but don't invokes dhcpd by default. If
you want to invoke dhcpd at startup, put these lines into /etc/rc.conf.

dhcpd_enable="YES" # dhcpd enabled?
dhcpd_flags="-q" # command option(s)
dhcpd_conf="/usr/local/etc/dhcpd.conf" # configuration file
dhcpd_ifaces="" # ethernet interface(s)
dhcpd_withumask="022" # file creation mask

**** If compiled with paranoia support (the default), the following lines
are also supported:

dhcpd_chuser_enable="YES" # runs w/o privileges?
dhcpd_withuser="dhcpd" # user name to run as
dhcpd_withgroup="dhcpd" # group name to run as
dhcpd_chroot_enable="YES" # runs chrooted?
dhcpd_devfs_enable="YES" # use devfs if available?
dhcpd_makedev_enable="YES" # use MAKEDEV instead?
dhcpd_rootdir="/var/db/dhcpd" # directory to run in
dhcpd_includedir="<some_dir>" # directory with config-
files to include
dhcpd_flags="-early_chroot" # needs full root

WARNING: -early_chroot requires a jail(8) like environment to work.

WARNING: dhcpd_devfs_enable and dhcpd_makedev_enable are mutually
exclusive
dhcpd_makedev_enable make NO sense on FreeBSD 5.x and up!

**** If compiled with jail support (the default), the following lines are
also supported (-early_chroot and dhcpd_chroot_enable=YES are implied):

dhcpd_jail_enable="YES" # runs imprisoned?
dhcpd_hostname="<hostname>" # jail hostname
dhcpd_ipaddress="<ip address>" # jail ip address

WARNING: dhcpd_rootdir needs to point to a full jail(8) environment.

**** WARNING: never edit the chrooted or jailed dhcpd.conf file but
/usr/local/etc/dhcpd.conf instead which is always copied where
needed upon startup.

**** WARNING: /usr/local/etc/rc.isc-dhcpd.conf is obsolete. rc.conf like
variables are still read there but should be moved /etc/rc.conf or
/etc/rc.conf.d/dhcpd instead. Also, the dhcpd_options variable must
be renamed dhcpd_flags if any.

===> Compressing manual pages for isc-dhcp3-server-3.0.5_2
===> Registering installation for isc-dhcp3-server-3.0.5_2
===> SECURITY REPORT:
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

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/

2. После установки появятся следующие файлы:
/usr/local/sbin/dhcpd это и есть сервер DHCP. Как большинство серверов или демонов, его имя оканчивается на "d".
/usr/local/bin/omshell это OMAPI command shell - программа, которая позволяет менять настройки DHCP "на лету", без необходимости stop или restart DHCP сервера с целью введения в действие настроек.

Пример конфигурации для сервера DHCP (его надо скопировать в /usr/local/etc/dhcpd.conf и отредактировать):
/usr/local/etc/dhcpd.conf.sample

Доступна документация:
man dhcpd
man dhcpd.leases
man dhcpd.conf

А также:
/usr/local/share/doc/isc-dhcp3-server/, файлы LICENSE, README и RELNOTES.

Итак, копируем файл конфигурации:
# cp /usr/local/etc/dhcpd.conf.sample /usr/local/etc/dhcpd.conf

3. Приступим к редактированию файла /usr/local/etc/dhcpd.conf. Как принято в *nix, строки начинающиеся с # являются комментариями и ни на что не влияют. Настроим опции имени домена и серверов домена ().
# option definitions common to all supported networks...
option domain-name "mydomain.ru";
option domain-name-servers 213.234.192.8, 85.21.192.3;

Порция информации, которую передает DHCP сервер вместе с арендой (lease) клиенту, называется опция (option). Некоторые опции являются глобальными, что означает - все клиенты сети получат эту опцию. Другие опции локальные (local), предназначены для отдельной подсети. Например, option для IP шлюза по умолчанию всегда local (для каждой подсети свой маршрутизатор). Две опции, которые приведены в этом примере, являются глобальными (DNS и имя домена могут быть общими).

Имя домена для домашнего компьютера может быть произвольным. IP адреса DNS я указал Корбиновские - те, что раздаются по DHCP сервером Корбины.

4. Опция authoritative. По умолчанию выключена, я включил:
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

Эта опция должна быть раскомментирована, чтобы позволить серверу DHCP отправлять сообщению DHCPNACK для ошибочно сконфигурированных клиентов. Например, компьютер физически переподключен в другую подсеть без освобождения lease.

5. Опция динамического обновления в DNS. По умолчанию выбрано ad-hoc. Я отключил, поставив none:
# ad-hoc DNS update scheme - set to "none" to disable dynamic DNS updates.
#ddns-update-style ad-hoc;
ddns-update-style none;

Этот параметр имеет 3 возможные велечины. ad-hoc устарела и не должна использоваться. interim позволяет Вашему DHCP серверу обновлять DNS сервер значениями аренд. В этом случае Ваш сервер DNS будет знать IP адреса компьютеров Вашей сети. Чтобы это работало, Ваш DNS сервер должен поддерживать DDNS (Dynamic DNS). Если Ваш сервер не поддерживает DDNS, или Вы не хотите обновлять динамически DNS, вы должны изменить значение этой опции на none (что я и сделал - мне пока дома незачем держать сервер DNS).

6. Настраиваем параметры раздачи адресов. Тут указана опция шлюза по умолчанию и диапазон адресов для раздачи (всего 11 адресов). Тут необязательно задавать опции DNS, шлюза - это все берется из предыдущих записей (option domain-name-servers и option routers):
subnet 192.168.8.0 netmask 255.255.255.0 {
range 192.168.8.10 192.168.8.20;
option routers 192.168.8.254;
}

У меня получился такой файл конфигурации:
option domain-name "mydomain.ru";
option domain-name-servers 213.234.192.8, 85.21.192.3;

default-lease-time 600;
max-lease-time 7200;

authoritative;
ddns-update-style none;

log-facility local7;

subnet 192.168.8.0 netmask 255.255.255.0 {
range 192.168.8.10 192.168.8.20;
option routers 192.168.8.254;
}

7. В /etc/rc.conf добавляем следующие строки:
dhcpd_enable="YES"
dhcpd_flags="-q" # отключаем вывод копирайта и прочего при старте dhcpd
dhcpd_ifaces="fxp1" # сетевой интерфейс на котором будет работать dhcpd

8. Теперь можно запускать демона:
# /usr/local/etc/rc.d/isc-dhcpd start
Starting dhcpd.

И проверить, как запустился:
# ps -ax | grep dhcpd
40817 ?? Ss 0:00.00 /usr/local/sbin/dhcpd -q -cf /usr/local/etc/dhcpd.conf -lf /var/db/dhcpd/dhcpd.leases
40840 p1 R+ 0:00.00 grep dhcpd

Видно, что скрипт запустил dhcpd в режиме демона (-q) и указал, где находятся файлы конфигурации и аренд адресов.

Перезапуск dhcpd:
# /usr/local/etc/rc.d/isc-dhcpd restart
Stopping dhcpd.
Starting dhcpd.
Необязательные опции для настройки.

default-lease-time 600;
max-lease-time 7200;

Тут можно оставить все без изменения. Некоторые DHCP клиенты запрашивают время аренды (lease time). Если клиент не запрашивает время аренды, сервер устанавливает его в default-lease-time (указана величина в секундах). Если клиент запросил время аренды, то сервер обслуживает запрос, но устанавливает время не более max-lease-time (также в секундах).

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

Эта опция определяет, куда пишется лог. local7 определяет локально заданный файл лога. Пока Вы не зададите файл лога, DHCP сервер будет писать события в system log (/var/log/messages).

Если Ваш сервер будет обслуживать несколько подсетей, то нужно определить общий диапазон адресов для этих сетей. Сервер DHCP нуждается в информации об ID Вашей сети. Дополнительно это нужно для каждой сети или подсети, чтобы определить, какой пул (pool) адресов допустим для выдачи аренд сегменту сети. Важно определить каждый сегмент Вашей сети, даже если сегмент не содержит клиентов DHCP. Декларация содержит маску, которая соответствует ID сети, и далее идут фигурные скобки {}.
# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.
subnet 10.254.0.0 netmask 255.255.0.0 {
}

Это декларация для подсети 10.254.239.0. Внутри фигурных скобок указан диапазон IP (range), доступных для аренды. Из 30 возможных (ограничено маской 255.255.255.224) для этой сети адресов выделено 11, от 10 до 20:
# This is a very basic subnet declaration.
subnet 10.254.239.0 netmask 255.255.255.224 {
range 10.254.239.10 10.254.239.20;
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}

После этой декларации подсети могут идти декларации других подсетей.

Для того, чтобы задать фиксированную конфигурацию для нужных компьютеров (постоянные ip адреса), добавляем в /usr/local/etc/dhcpd.conf строки:
host book { # имя хоста
hardware ethernet 00:c0:9f:1e:64:92; # MAC адрес сетевой карты хоста
fixed-address 10.254.8.53; # ip адрес для этого хоста
}
host general {
hardware ethernet 00:a0:cc:c9:5c:7d;
fixed-address 10.254.8.54;
}

Тут необязательно задавать опции DNS, шлюза - это все берется из предыдущих записей (option domain-name-servers и option routers).

Обновлено: 12.03.2015