Компьютерные сети бывают разных видов и конфигураций: локальные (LAN), глобальные (WAN) и т.д. Если вы подключаетесь к локальной LAN сети или интернету, компьютеру присваивается собственный IP адрес. Он помогает идентифицировать любое устройство, подключенное к сети. В большинстве случаев, когда вы подключаетесь к LAN или интернету, вы можете заметить, что IP и другая информация, например маска подсети, присваиваются автоматически. Задумывались вы, как это происходит? В этой статье мы попробуем разобрать концепцию DCHP, на которой основываются принципы данного процесса.

Что такое DCHP?

DCHP — это протокол динамической настройки узла.

Как можно понять из названия, DCHP предназначен для настройки хоста через удаленный сервер. DCHP поддерживается по умолчанию большинством современных операционных систем, и этот протокол выступает в качестве отличной альтернативы рутинной ручной настройке параметров сети для сервера или подключаемого устройства.

Данный протокол работает на основе модели «Клиент-сервер». Являясь протоколом, DCHP имеет свой собственный метод обмена сообщениями между клиентом и сервером. Ниже представлен состав сообщения DHCP:
 

Поле

Длина (байты)

Описание

op

1

Тип сообщения

htype

1

Тип адреса аппаратной части

hlen

1

Длина адреса аппаратной части

hops

1

Используемое количество агентов ретрансляции. Клиенты устанавливают значение на 0.

xid

4

ID (уникальный идентификационный номер) транзакции используемой клиентом и серверов во время сессии

secs

2

Прошедшее время (в секундах) с момента запроса клиентом начала процесса

flags

2

Значение флагов

ciaddr

4

IP-адрес клиента (если имелся ранее).

 

    Дополнительные опции

Знание основ DCHP помогает в устранении различных проблем с сетью. В следующей части статьи мы затронем принципы работы протокола.

Как работает DCHP?

Перед изучением самого процесса, с помощью которого достигается поставленная цель, необходимо понять различные принципы обмена информацией, которые используются в данном процессе.

DHCPDISCOVER

Это сообщение обозначает начало DCHP взаимодействия между клиентом и сервером. Данное сообщение отправляется клиентом (компьютером или устройством), подключенным к сети. В этом сообщении используется 255.255.255.255 как IP-адрес доставки, тогда как исходным адресом является 0.0.0.0

DHCPOFFER

Это сообщение отправляется в ответ на DHCPDISCOVER от сервера DCHP для подключенных клиентов. В этом сообщении содержатся необходимые сетевые настройки.

DHCPREQUEST

Данное сообщение является ответом на DHCPOFFER, и обозначает, что клиент принял отправленные настройки.

DHCPACK

Данное сообщение отправляется на сервер протокола DCHP в ответ на DHCPREQUEST от клиента. Сообщение обозначает конец процесса, начатого с сообщения DHCPDISCOVER. Т.е. DHCPACK — это не что иное, как подтверждение от сервера начала авторизации клиента и принятие параметров конфигурации, полученных в самом начале от сервера.

DHCPNAK

Данное сообщение является противоположностью DHCPACK, описанного выше. Оно отправляется на сервер в случае, если невозможно удовлетворить параметры DHCPREQUEST клиента.

DHCPDECLINE

Сообщение отправляется клиентом на сервер в случае, если IP-адрес, присваиваемый в DCHP уже используется.

DHCPINFORM

Сообщение отправляется серверу в том случае, если клиенту DCHP присвоен статический IP-адрес, а по настройкам конфигурации необходим динамический адрес.

DHCPRELEASE

Сообщение отправляется клиентов в том случае, если он завершает процесс использования сетевого адреса.

Теперь, когда мы познакомились с различными сообщениями в DCHP, можно изучить весь процесс работы, чтобы получить более полное представление. Шаги ниже описываются исходя из того, что все настройки установлены по умолчанию.

Шаг 1.

Когда клиент (компьютер или устройство) загружается или подключается к сети, серверу отправляется сообщение DHCPDISCOVER. Если нет никаких дополнительных данных о конфигурации, то сообщение отправляется с адреса 0.0.0.0 к 255.255.255.255. Если сервер DHCP находится в локальной подсети, то она напрямую получает сообщение, если он находится в другой подсети, то используется агент ретрансляции для передачи запроса к серверу DCHP. Используется протокол передачи UDP через порт 67. Клиент на данном этапе начинает стадию авторизации.

Шаг 2.

В тот момент как сервер получил запрос DHCPDISCOVER, то он отправляет в ответ сообщение DHCPOFFER. Как говорилось ранее, в этом сообщении содержатся все необходимые параметры конфигурации, запрашиваемые клиентом. Например, IP-адрес, необходимый клиенту, а также значение маски подсети и информация о шлюзе. Также сервер сразу заполняет значения MAC-адреса в поле CHADDR. Сообщение отправляется клиенту от адреса 255.255.255.255 напрямую, а если сервер находится в другой подсети, то используются агенты ретрансляции, который отвечает за то, чтобы сообщение было доставлено. В этом случае для передачи применяется протокол UDP через порт 68. На этом этапе клиент начинает подбирать параметры.

Шаг 3.

Клиент формирует сообщение DHCPREQUEST, которое служит ответом на DHCPOFFER от сервера, указав, что он принимает параметры конфигурации, отправленные ему. Если бы было несколько серверов DCHP, то клиент бы получил также несколько сообщений DHCPOFFER, но клиент отвечает только одному серверу, заполняя параметры конфигурации для настройки. Таким образом, он проходит авторизацию с получением IP-адреса от одного конкретного сервера DCHP. Все сообщение от других серверов блокируются. Сообщение DHCPREQUEST по-прежнему будет содержать адрес источника 0.0.0.0, если клиенту все еще нельзя использовать IP-адреса, полученные в сообщении DHCPOFFER. В течение этого этапа клиент получает ответы на свои запросы.

Шаг 4.

Как только сервер получает DHCPREQUEST от клиента, он посылает DHCPACK сообщение о том, что теперь клиент может использовать IP-адрес, назначенный к нему. Клиент окончательно подключается к сети и с настроенными параметрами.

Концепция аренды

В дополнении к остальной необходимой информации о том, как работает DCHP, следует также знать IP-адрес, назначенный в DCHP сервером в аренду клиенту. После истечения срока аренды сервер DHCP может свободно присвоить этот IP-адрес другому компьютеру или устройству, запрашивающему то же самое. Например, сохранение срока аренды 8-10 часов полезно для компьютеров, которые обычно выключают в конце дня. Поэтому аренда должна продлеваться время от времени. После истечения половины срока аренды, DCHP клиент обычно пытается автоматически продлить данный срок. Это делается путем обмена DHCPREQUEST и DHCPACK сообщениями. Благодаря этому начинается стадия обновления данных для клиента.

 

 

 

Мы с вами и добрались до Linux-а, рассмотрим процесс установки DHCP сервера. В качестве дистрибутива, для демонстрации настройки будет использоваться Ubuntu 12 и 14. Процесс настройки в других дистрибутивах может иметь как незначительные отличия, так и полностью отличаться, от представленного здесь.

DHCP в Linux реализован в виде демона сервера (dhcpd) и демона клиента (dhcpcd или pump (в Red Hat)). Демон dhcpd запускается на сервере и непосредственно отвечает за назначение и отбор IP-адресов клиентам, при входе и выходе их из сети. Клиентский демон, как явствует из названия, запускается на стороне клиента.
DHCP при установке Linux обычно не устанавливается, однако входит в состав дистрибутивов. В любом случае вы всегда можете скачать последнюю версию с сайта www.isc.org.

Для того, чтобы превратить наш Ubuntu Linux в DHCP сервер достаточно одной команды:

sudo apt-get install isc-dhcp-server

С помощью данной команды, используя утилиту apt-get, вы сможете скачать и установить пакет isc-dhcp-server, который является демоном (аналог служб Windows в Linux) DHCP сервера.  Помните, что для корректного выполнения данной команды, вы должны иметь доступ к репозиториям. Команда sudo, перед apt-get install isc-dhcp-server, означает что все следующее за ней следует выполнить от имени суперпользователя.

После того как пакет isc-dhcp-server будет успешно установлен, можно будет перейти к конфигурации нашего сервера. Для этого откройте, в любом понравившемся вам текстовом редакторе (vi, nano и т.д.), для редактирования конфигурационный файл dhcpd.conf, расположенный в каталоге /etc/dhcp/  . Например это можно сделать командой:

sudo nano  /etc/dhcp/dhcpd.conf

Рассмотрим некоторые не за комментированные строки данного файла (строки в начале которых не стоит #, строки в начале которых стоит # не учитываются DHCP сервером, при чтении конфигурационного файла). Например, команда default-lease-time 600 данного файла указывает  DHCP серверу, на какой интервал времени в секундах выдавать IP адрес клиенту, max-lease-time – указывает на какой максимальный срок может быть выдан IP адрес.

Для того, чтобы назначать DHCP серверу интервал адресов (а так же другие параметры), которые он может раздавать клиентам, добавьте в конфигурационный файл dhcpd.conf следующий текст:
subnet 192.168.0.0 netmask 255.255.255.0 {
      option routers 192.168.0.1;
      option subnet-mask 255.255.255.0;
      option domain-name-servers 8.8.8.8;
      range 192.168.1.100 192.168.1.150;
}

Команда subnet 192.168.0.0 netmask 255.255.255.0 указывает DHCP серверу подсеть, в которой он должен работать. Опция option routers  задает основной шлюз, данный параметр, как и следующие два, передаются DHCP сервером, на все компьютеры, подключенные к нему. Опция option subnet-mask   указывает сетевую маску, которую необходимо будет назначить клиентам DHCP сервера.  Команда option domain-name-servers       позволяет задать адрес DNS сервера. С помощью команды range 192.168.1.100 192.168.1.150 задается раздаваемый диапазон IP адресов.После того, как вы внесли данные  изменения в конфигурационный файл dhcpd.conf, сохраните его.

Далее укажем, на каком сетевом интерфейсе, следует запустить DHCP сервер. Для этого выполняем команду:

sudo nano /etc/default/isc-dhcp-server

Для редактирования откроется еще один конфигурационный файл, ищем в нем строку INTERFACES=”” и заменяем ее на INTERFACES=”eth0”, где вместо eth0 может быть указан, необходимый вам интерфейс сервера. Сохраняем данный конфигурационный файл.

Далее выполняем команду:

sudo /etc/init.d/isc-dhcp-server restart

которая перезапустит наш DHCP сервер и позволит вступить новой конфигурации  в силу. После этого к DHCP серверу уже можно будет подключать клиентов, и они смогут получать от него адреса.

Как вы наверное помните, в DHCP серверах Windows, можно было резервировать определенные IP адреса, за определенными хостами. Наш DHCP сервер в Ubuntu, тоже не лишен такой возможности. Чтобы реализовать данную функцию добавьте в файл dhcpd.conf следующее:

host myserver{
     hardware Ethernet 00:00:00:11:11:11;
     fixed-address 192.168.1.65;
}

В данном случае host myserver задает описание определенного хоста (myserver может быть заменено на любое боле понятное вам название). Опция hardware Ethernet задает аппаратный адрес хоста, для которого требуется назначить ip адрес, указанный в опции fixed-address.

Вот и все, мы разобрали, как реализовать основные возможности DHCP сервера в Ubuntu Linux, теперь вы сами можете попробовать настроить свой сервер.

Установка и настройка DHCP на сервере Ubuntu 14.04.

И так, приступим. у нас установлен сервер Ubuntu 14.04 и он полностью обновлен. Теперь устанавливаем службу DHCP, выполнив команду:
sudo apt-get install isc-dhcp-server

Служб DHCP в ubuntu привиликое множество, я не буду рассказывать про них. Я предпочитаю именно isc-dhcp-server. После установки рекомендую остановить DHCP службу командой:
sudo service isc-dhcp-server stop

Это делается для того, что если у Вас сервер находится в рабочей сети, то чтоб не начал раздавать адреса. Теперь заходим в файл /etc/default/isc-dhcp-server
sudo nano /etc/default/isc-dhcp-server

В этом фале находим строку INTERFACES=”” и между кавычек вписываем название сетевого интерфейса на котором будут раздаваться адреса. Чтоб посмотреть какие названия сетевых интерфейсов у Вас есть, выполните команду:
ifconfig

После того как впишите название сетевого интерфейса, у Вас должно получится что то вроде этого:
# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/isc-dhcp-server by the maintainer scripts

#
# This is a POSIX shell fragment
#

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. «eth0 eth1».
INTERFACES=»eth0″

Далее идем в файл /etc/dhcp/dhcpd.conf, в котором нам необходимо прописать настройки.
sudo nano /etc/dhcp/dhcpd.conf

В этом файле нам необходимо указать диапазон адресов, которые будут выдавать нашим серверов. Сделайте по примеру

subnet 192.168.0.0 netmask 255.255.255.0 { //указываем подсеть
  range 192.168.0.2 192.168.0.254; //диапазон выдачи
  option domain-name-servers 192.168.0.1; //указываем DNS
  option domain-name «workgroup»; //Доменное имя
  option routers 192.168.0.1; //Шлюз по умолчанию
  option broadcast-address 192.168.0.255; //Широковещательный адрес
  default-lease-time 604800; //время аренды в секундах (7дней)
  max-lease-time 604800; //максимальное время аренды в секундах (7дней)
}

Всё готово, можем запустить:
sudo service isc-dhcp-server stop

Проверим что адреса выдаются, если всё в порядке, перейдем к связке с DNS. Для связки с DNS нам понадобится ключ. Ключ можно сгенировать следующей командой
dnssec-keygen -a HMAC-MD5 -b 128 -r /dev/urandom -n USER DHCP_UPDATER

Ключ сгенирован, и для того чтоб его увидеть воспользуемся командой:
cat Kdhcp_updater.*.private|grep Key

Ключ необходимо записать, он нам понадобится в двух конфигурационных файлах. Теперь открываем /etc/dhcp/dhcpd.conf и в любом месте добавляем:

key DHCP_UPDATER { //Описание ключа, его алгоритмы
        algorithm HMAC-MD5.SIG-ALG.REG.INT;
        secret «ЗДЕСЬ ЗАПИСАННЫЙ КЛЮЧ»;
}
zone workgroup. { //зона которую DHCP должен обновлять
        primary 127.0.0.1;
        key DHCP_UPDATER;
}
zone 0.168.192.in-addr.arpa. {//обратная зона которую DHCP должен обновлять
        primary 127.0.0.1;
        key DHCP_UPDATER;
}

Готово, теперь DHCP будет обновлять DNS. Теперь в файле DNS надо разрешить это обновление указав ключ. Открываем файл /etc/bind/named.conf.local и добавляем в него:

key DHCP_UPDATER { //Описание ключа, его алгоритмы
        algorithm HMAC-MD5.SIG-ALG.REG.INT;
        secret «ЗДЕСЬ ЗАПИСАННЫЙ КЛЮЧ»;
}

Ищем в этом же фале описание зон workgroup и 0.168.192.in-addr.arpa и в их описание добавляем строку allow-update { key DHCP_UPDATER; }; Должно получится примерно так:

zone «workgroup» {
        type master;
        file «/etc/bind/db.example.com»;
        allow-update { key DHCP_UPDATER; };
};

zone «0.168.192.in-addr.arpa» {
        type master;
        file «/etc/bind/db.0.168.192»;
        allow-update { key DHCP_UPDATER; };
};

Теперь перезапустим службы DNS и DHCP
sudo service isc-dhcp-server restart
sudo service bind9 restart

Всё готово, теперь все компьютеры получившие адреса от DHCP будут попадать в DNS.