DHCP server на Linux

Январь 25th, 2011 Рубрики: DHCP, HOWTO, Linux, Настройка сервера Linux, основы Linux

настройка dhcp сервера на linuxДоброго времени, уважаемые! Сегодня на блоге выкладываю мини-HOWTO настройки DHCP-сервера на Linux. В статье хочу рассказать, как работает протокол DHCP? Как работает клиент DHCP? А так же как собственно, настроить сервер DHCP?

Чем же данный сервер может быть полезен в сети? Основная функция - это автоматическая выдача клиентским машинам информации о конфигурации сети (такой как IP-адрес, маска, шлюз и др.).

Протокол DHCP

Протокол DHCP (Dynamic Host Configuration Protocol - протокол динамического конфигурирования хостов) является протоколом клиент-серверной модели. То есть, есть сервер DHCP (демон dhcpd) отвечающий на запросы клиентов и есть клиент DHCP (dhclient) посылающий запросы и принимающий ответы от сервера. Передача данных производится при помощи протокола UDP, при этом сервер принимает сообщения от клиентов на порт 67 и отправляет сообщения клиентам на порт 68.

В общем случае, не размусоливая о структуре посылаемых пакетов, схему работы протокола можно представить следующим рисунком:

Схема работы DHCP протокола

Градиентными овалами и стрелками на схеме обозначены широковещательные сообщения и направление сообщения соответственно. Линиями обозначены не широковещательные сообщения. Пунктиром обозначены, возможные сообщения (необязательные). На основании рисунка, рассмотрим пример процесса получения IP-адреса клиентом от параллельно работающих серверов DHCP. Предположим, клиент ещё не имеет собственного IP-адреса. Процесс состоит из следующих этапов:

1. Обнаружение DHCP (DHCPDISCOVER)

На первом этапе, клиент выполняет широковещательный запрос по всей физической сети с целью обнаружить доступные DHCP-серверы. Он отправляет сообщение типа DHCPDISCOVER, при этом в качестве IP-адреса источника указывается 0.0.0.0 (так как компьютер ещё не имеет собственного IP-адреса), а в качестве адреса назначения — широковещательный адрес 255.255.255.255. Кроме IP источника и назначения, клиент в данном сообщении  посылает: уникальный идентификатор запроса, свой MAC, и, возможно, прошлый присвоенный IP.

2. Ответ DHCP - сервера (DHCPOFFER)

Получив сообщение от клиента, сервера определяют требуемую конфигурацию клиента в соответствии со своими указанными в конфигурационном файле настройками. Все сервера, получившие запрос, формируют ответ (DHCPOFFER), содержащий конфигурацию клиента, и отправляют его клиенту на MAC-адрес. В ответе содержится следующая информация: IP, назначенный хосту, и прочие параметры (такие, как адреса маршрутизаторов и DNS-серверов). Клиент получает ответы от всех серверов DHCP, функционирующих в сети, из них он должен выбрать тот, который его «устраивает» (а устраивает его скорее всего тот, который пришел первым).

3. Запрос DHCP-сервера (DHCPREQUEST)

Выбрав одну из конфигураций, предложенных DHCP-серверами, клиент отправляет запрос DHCP (DHCPREQUEST). Он рассылается широковещательно. В сообщении содержится информация из сообщения DHCPDISCOVER + специальная опция — идентификатор сервера — указывающая адрес DHCP-сервера. При этом, сервер, который не выбран в качестве "устраивающего" тоже видит, что он не выбран.

4. Подтверждение от DHCP-сервера (DHCPACK)

Наконец, сервер подтверждает запрос и направляет это подтверждение (DHCPACK) клиенту. После этого клиент должен настроить свой сетевой интерфейс, используя предоставленные опции.

При этом, кроме указанных сообщений, возможны и другие (на схеме указаны пунктиром):

Отказ от настроек, предоставленных DHCP-сервером (DHCPDECLINE)

Если после получения подтверждения (DHCPACK) от сервера клиент обнаруживает, что указанный сервером адрес уже используется в сети, он рассылает широковещательное сообщение отказа DHCP (DHCPDECLINE), после чего процедура получения IP-адреса повторяется.

Отмена от DHCP-сервера (DHCPNAK)

Если по каким-то причинам сервер не может предоставить клиенту запрошенный IP-адрес, или если аренда адреса удаляется администратором, сервер рассылает широковещательное сообщение отмены DHCP (DHCPNAK). При получении такого сообщения соответствующий клиент должен повторить процедуру получения адреса.

Освобождение адреса DHCP (DHCPRELEASE)

Клиент может явным образом прекратить аренду IP-адреса. Для этого он отправляет сообщение освобождения DHCP (DHCPRELEASE) тому серверу, который предоставил ему адрес в аренду.

Информация DHCP (DHCPINFORM)

Сообщение информации DHCP (DHCPINFORM) предназначено для определения дополнительных параметров TCP/IP (например, адреса маршрутизатора по умолчанию, DNS-серверов и т. п.) теми клиентами, которым не нужен динамический IP-адрес (то есть адрес которых настроен вручную). Серверы отвечают на такой запрос сообщением подтверждения (DHCPACK) без выделения IP-адреса.

Клиент DHCP (dhclient) Linux

Для работы Linux в качестве DHCP-клиента необходимо установить пакет dhclient (в RedHat, возможно - dhcpcd). Данный клиент запрашивает у сервера параметры и применяет их к локальному хосту. dhclient использует конфигурационный файл /etc/dhclient.conf (иногда /etc/dhcp/dhclient.conf или /etc/dhcp3/dhclient.conf). А так же, хранит информацию об арендованных параметрах в файле /var/lib/dhcp/dhclient.leases. В общем случае, клиент DHCP устанавливается вместе с дистрибутивом ОС и создает файл конфигурации по умолчанию, который вполне работоспособен и не требует вмешательств. Для работы dhclient, необходимо в конфигурационных файлах сетевых интерфейсов вашего дистрибутива (на которых необходимо получение сетевых параметров по DHCP), указать параметр BOOTPROTO=dhcp (для RedHat) и iface eth_№_ dhcp (для Deb).

Сервер DHCP (dhcp-server / dhcpd) на Linux

Думаю функции сервера, из вышеописанного, вполне ясны - выдавать клиентам (хостам) параметры сетевого подключения. Для работы сервера необходимо установить пакет dhcp-server (в более старых версиях - dhcpd, иногда пакет имеет имя dhcp3-server). После установки, в системе появиться привидение демон - dhcpd. Данный демон должен быть разрешен для запуска на необходимых уровнях выполнения ОС (команда в RedHat - /sbin/chkconfig dhcpd on, в Debian - /usr/sbin/update-rc.d dhcpd defaults). Так же, необходимо, чтобы один из интерфейсов был настроен на статический адрес из той подсети, которую будет раздавать клиентам, иначе демон не будет работать корректно. После установки демон попытается запуститься, но у него ничего не получиться, потому что конфиг неверен.

Далее приведу пример типичного конфига для DHCP-server'a:

dhcp-server:~# cat /etc/dhcp3/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-name "mydomain.org";

subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.10 192.168.1.100;
        range 192.168.1.150 192.168.1.200;
}

host hostname {
        hardware ethernet 08:00:00:00:00:23;
        fixed-address 192.168.1.222;
}

По данному конфигу клиентам распределяются IP-адреса из диапазона 192.168.1.10-192.168.1.100 и 192.168.1.150-192.168.1.200. Если клиент не запрашивает временных рамок, сервер выдает адрес на 600 секунд (default-lease-time 600). В противном случае, максимально возможное время будет установлено в 7200 секунд (max-lease-time 7200). Сервер будет также "советовать" клиенту использовать 255.255.255.0 в качестве маски подсети (option subnet-mask 255.255.255.0), 192.168.1.255 для широкого вещания (broadcast) (option broadcast-address 192.168.1.255), 192.168.1.254 в качестве маршрутизатора/шлюза и 192.168.1.1 и 192.168.1.2 для DNS-сервера (option routers 192.168.1.254 и option domain-name-servers 192.168.1.1, 192.168.1.1 соответственно ). О чем нам как бы говорит клиент, получивший адрес:

host@host-VirtualBox1:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:fc:b4:ce
          inet addr:192.168.1.11  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fefc:b4ce/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2939 errors:0 dropped:0 overruns:0 frame:0
          TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:945634 (945.6 KB)  TX bytes:10373 (10.3 KB)

Так же, в конфиге есть такой параметр как host hostname, который говорит, что хост с именем hostname у которого сетевая карта имеет MAC  08:00:00:00:00:23 должен иметь постоянный адрес 192.168.1.222 (в Windows данная настройка называется резервирование). Поля options для данного раздела конфигурации так же приемлемы.

Кроме того, возможно "вкладывать" параметр host в параметр subnet для формирования более понятного конфигурационного файла:

dhcp-server:~# cat /etc/dhcp3/dhcpd.conf
.....
subnet 192.168.1.0 netmask 255.255.255.0 {
         range 192.168.1.10 192.168.1.100;
         range 192.168.1.150 192.168.1.200;
         host hostname {
                 hardware ethernet 08:00:00:00:00:23;
                 fixed-address 192.168.1.222;
         }
}

Балансировка и резервный DHCP-server

Ознакомившись с настройкой DHCP-сервера, можно настроить резервировный (он же балансирующий нагрузку на основной) сервер DHCP. Резервный DHCP-server настраивается как и основной. Отличие резервного от основного в том, что основным сервером выдаются 80% адресов, а резервным  - 20%. То есть параметр range в конфиге задается таким образом, чтобы поделить сеть в соотношении 80/20.

Что еще почитать:

man dhcpd.conf (5)
man dhcp-options(5)

Резюме

Итого, прочитав статью мы поняли, что такое DHCP протокол, как установить и настроить DHCP клиента на Linux, а так же, как настроить сервер DHCP на Linux. В общем, данная тема проста и понятна до безобразия и если кому-то не понятно, буду ждать Ваших комментариев!

С Уважением, Mc.Sim!




Теги: , , , , , ,

23 комментария к “DHCP server на Linux”

  1. kroxa
    Март 13th, 2011 at 18:58
    1

    192.168.1.254 в качестве маршрутизатора/шлюза
    вот этого я в конфиге не увидел как-то…
    стоит
    routers 192.168.1.1

    • Март 13th, 2011 at 20:43
      2

      Да, действительно, недочет. kroxa, Спасибо за дополнение. Поправил.

  2. Виктор
    Август 25th, 2011 at 17:06
    3

    Всё это прекрасно, но у меня вопрос как у ламера, как DHCP серверу указать интерфейс куда ему адреса раздавать в eth0 или в eth1. ASPLinux Server 4

    • Август 25th, 2011 at 21:41
      4

      Доброго времени, Виктор.
      Все просто. Сервер будет раздавать свою конфигурацию в тот интерфейс, который настроен на аналогичную подсеть с той, что указана в dhcpd.conf.
      То есть, например, если у вас в dhcpd.conf
      subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.10 192.168.1.100;
      range 192.168.1.150 192.168.1.200;
      }
      то DHCP будет вещать на интерфейсе, настроенном на подсеть 192.168.1.0/24.

  3. Keer
    Октябрь 21st, 2011 at 10:00
    5

    Замечательная статья! Правда, я свой dhcp-сервер еще в мае настраивал, а этой статьи не нашёл (а жаль) но всё равно было интересно прочитать. *BRAVO*
    Я сейчас даже не представляю, как раньше мог обходится без оного — бесконеные проблемы с сетью.
    —————————————————
    Многие сталкиваются с такой проблемой, как создание «домашней сети» в Win7/Vista буквально между двумя компьютерами, но не могут изменить «расположение сети», я знаю 100%-й способ решения этой проблемы — ставьте DHCP-сервер!

    • Октябрь 21st, 2011 at 10:39
      6

      Спасибо за комментарий. Приходите еще!

  4. greenfox82
    Октябрь 27th, 2011 at 00:08
    7

    Хорошая статья! Да и блог в целом отличный, спасибо! А с VLAN+DHCP вам сталкиваться не приходилось?

    • Октябрь 27th, 2011 at 12:16
      8

      Спасибо за отзыв! С VLAN+DHCP сталкиваться не приходжилось… Но не думаю, что там будут какие-то загвоздки… На виртуальном интерфейсе есть такой же IP-адрес, как и на обычном интерфейсе, и DHCP сервер будет вещать в ту сеть, которая задана в конфиге DHCP сервера и в коняиге интерфейса.

  5. Декабрь 30th, 2011 at 07:39
    9

    может напиши по
    broadcast-address subnet-mask а то тупой сильно %)
    и может по конфигу network/interface

    • Декабрь 30th, 2011 at 12:44
      10

      Уже все есть. Про

      broadcast-address subnet-mask

      тут
      а про

      network/interface

      вот тут

  6. Декабрь 30th, 2011 at 17:11
    11

    у мну модем с сервером dhcp
    поетому путаница
    как правилно скофигуровать
    серв на дебиане без сервера dhcp на модеме bridge ?
    или оставить dhcp

    • Декабрь 31st, 2011 at 16:17
      12

      не понял, где нужен dhcp, а где не нужен. И где расположен мост? :) можно поподробней?

  7. Декабрь 30th, 2011 at 17:13
    13

    да и спасибо за инфо неделю искал инфо по dhcp для баранов *PARDON*

  8. Артём
    Июнь 26th, 2012 at 00:13
    14

    доброго времени суток
    а можно ли поподробнее узнать о связке DHCP с DNS сервером?
    интересует именно параметр ddns-update-style

    • Июнь 28th, 2012 at 22:24
      15

      К сожалению, не доводилось на текущий момент реализовывать данную схему, но судя по яндексу материала в интернете достаточно )

  9. Igor
    Август 1st, 2013 at 15:12
    16

    спасибо за хорошую статью, но вот мне интересно как настроить dhcp на 2 подсети в плане скажем если запрос пришел с eth0 то выдать ip из подсети 192.168.10.0, а если с eth1 то из 192.168.20.0 ? можно конечно с привязкой по макам сделать =) но когда много хостов то удобней конечно динамически.

    • Август 16th, 2013 at 14:27
      17

      Если задать на eth0 адрес из подсетки 192.168.10.0, то DHCP и будет выдавать адрес из этой подсетки (если она задана в конфиге), если на eth1 задать из 192.168.20.0, то соответственно DHCP выдаст из подсетки 192.168.20.0. Аналогично и с другими интерфейсами. То есть заданную в конфиге подсетку DHCP сможет выдавать только с интерфейса, на котором задан статический IP из данной подсетки.

  10. Gunny
    Январь 4th, 2014 at 20:18
    18

    Ну нюансы все есть )) тут /etc/default/isc-dhcp-server указыветсЯ где слушать и с вланами могут быть нюансы )) Еще в /var/lib/dhcp/dhcpd.leases лежат аренды не нашел пока как сделать что бы для разных интерфесов он писал в разные файлы.

    • Январь 17th, 2014 at 15:21
      19

      Я вроде и не утверждал, что нюансов быть не может )
      За дополнение — спасибо.
      Чтобы в разные dhcpd.leases писал, можно для разных интерфейсов запустить разные экземпляры сервиса. И указать ключ -lf /путь/к/dhcpd.leases.

  11. Ванько
    Январь 24th, 2014 at 17:47
    22

    В Gentoo дополнительный конфиг для запуска сервиса /etc/conf.d/dhcpd
    DHCPD_IFACE=»eth1 tap0″
    параметр указывает на каких интерфейсах слушать, должно быть и в других дистрибутивах так же.

    • Январь 28th, 2014 at 10:17
      23

      Спасибо за информацию. Да, конечно, например в Debian есть файд /etc/default/dhcpd, в редхате /etc/sysconfig/dhcpd (если не ошибаюсь).

Написать комментарий