DHCP server на Linux
Доброго времени, уважаемые! Сегодня на блоге выкладываю мини-HOWTO настройки DHCP-сервера на Linux. В статье хочу рассказать, как работает протокол DHCP? Как работает клиент DHCP? А так же как собственно, настроить сервер DHCP?
Чем же данный сервер может быть полезен в сети? Основная функция – это автоматическая выдача клиентским машинам информации о конфигурации сети (такой как IP-адрес, маска, шлюз и др.).
Протокол DHCP
Протокол DHCP (Dynamic Host Configuration Protocol – протокол динамического конфигурирования хостов) является протоколом клиент-серверной модели. То есть, есть сервер DHCP (демон dhcpd) отвечающий на запросы клиентов и есть клиент DHCP (dhclient) посылающий запросы и принимающий ответы от сервера. Передача данных производится при помощи протокола UDP, при этом сервер принимает сообщения от клиентов на порт 67 и отправляет сообщения клиентам на порт 68.
В общем случае, не размусоливая о структуре посылаемых пакетов, схему работы протокола можно представить следующим рисунком:
Градиентными овалами и стрелками на схеме обозначены широковещательные сообщения и направление сообщения соответственно. Линиями обозначены не широковещательные сообщения. Пунктиром обозначены, возможные сообщения (необязательные). На основании рисунка, рассмотрим пример процесса получения 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!
Другие материалы в категории Настройка сервера Linux
- SQUID настройка ACL и http_access
- squid, использование опции debug_options или диагностика компонентов squid
- Использование ramdisk в Linux (ramdisk, ramfs, tmpfs) или препарирование рамдисков
- Rsyslog на Debian, настройка сервера сбора логов
- HOWTO SAMBA на 2 интерфейса и 2 сети с разными smb.conf
- SQUID аутентификация (Kerberos и LDAP) на основе доменных групп Active Directory
- squid, настройка delay pools
- Аутентификация и авторизация squid (basic, Digest, NTLM, negotiate)
- Прокси-сервер SQUID, вводный пост
- SSH сервер на Debian
192.168.1.254 в качестве маршрутизатора/шлюза
вот этого я в конфиге не увидел как-то…
стоит
routers 192.168.1.1
Да, действительно, недочет. kroxa, Спасибо за дополнение. Поправил.
Всё это прекрасно, но у меня вопрос как у ламера, как DHCP серверу указать интерфейс куда ему адреса раздавать в eth0 или в eth1. ASPLinux Server 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.
Замечательная статья! Правда, я свой dhcp-сервер еще в мае настраивал, а этой статьи не нашёл (а жаль) но всё равно было интересно прочитать.
Я сейчас даже не представляю, как раньше мог обходится без оного – бесконеные проблемы с сетью.
————————————————–
Многие сталкиваются с такой проблемой, как создание “домашней сети” в Win7/Vista буквально между двумя компьютерами, но не могут изменить “расположение сети”, я знаю 100%-й способ решения этой проблемы – ставьте DHCP-сервер!
Спасибо за комментарий. Приходите еще!
Хорошая статья! Да и блог в целом отличный, спасибо! А с VLAN+DHCP вам сталкиваться не приходилось?
Спасибо за отзыв! С VLAN+DHCP сталкиваться не приходжилось… Но не думаю, что там будут какие-то загвоздки… На виртуальном интерфейсе есть такой же IP-адрес, как и на обычном интерфейсе, и DHCP сервер будет вещать в ту сеть, которая задана в конфиге DHCP сервера и в коняиге интерфейса.
может напиши по
broadcast-address subnet-mask а то тупой сильно
и может по конфигу network/interface
Уже все есть. Про
тут
а про
вот тут
у мну модем с сервером dhcp
поетому путаница
как правилно скофигуровать
серв на дебиане без сервера dhcp на модеме bridge ?
или оставить dhcp
не понял, где нужен dhcp, а где не нужен. И где расположен мост? можно поподробней?
да и спасибо за инфо неделю искал инфо по dhcp для баранов
доброго времени суток
а можно ли поподробнее узнать о связке DHCP с DNS сервером?
интересует именно параметр ddns-update-style
К сожалению, не доводилось на текущий момент реализовывать данную схему, но судя по яндексу материала в интернете достаточно )
спасибо за хорошую статью, но вот мне интересно как настроить dhcp на 2 подсети в плане скажем если запрос пришел с eth0 то выдать ip из подсети 192.168.10.0, а если с eth1 то из 192.168.20.0 ? можно конечно с привязкой по макам сделать но когда много хостов то удобней конечно динамически.
Если задать на eth0 адрес из подсетки 192.168.10.0, то DHCP и будет выдавать адрес из этой подсетки (если она задана в конфиге), если на eth1 задать из 192.168.20.0, то соответственно DHCP выдаст из подсетки 192.168.20.0. Аналогично и с другими интерфейсами. То есть заданную в конфиге подсетку DHCP сможет выдавать только с интерфейса, на котором задан статический IP из данной подсетки.
Ну нюансы все есть )) тут /etc/default/isc-dhcp-server указыветсЯ где слушать и с вланами могут быть нюансы )) Еще в /var/lib/dhcp/dhcpd.leases лежат аренды не нашел пока как сделать что бы для разных интерфесов он писал в разные файлы.
Я вроде и не утверждал, что нюансов быть не может )
За дополнение – спасибо.
Чтобы в разные dhcpd.leases писал, можно для разных интерфейсов запустить разные экземпляры сервиса. И указать ключ -lf /путь/к/dhcpd.leases.
эм елси не затруднит, не подскажите как запустить разные экземпляры сервиса ?
Можно поступить по аналогии с той схемой, которую я делал для samba https://www.k-max.name/windows/howto-samba-na-2-interfejsa-i-2-seti-s-raznymi-smb-conf/
В Gentoo дополнительный конфиг для запуска сервиса /etc/conf.d/dhcpd
DHCPD_IFACE=”eth1 tap0″
параметр указывает на каких интерфейсах слушать, должно быть и в других дистрибутивах так же.
Спасибо за информацию. Да, конечно, например в Debian есть файд /etc/default/dhcpd, в редхате /etc/sysconfig/dhcpd (если не ошибаюсь).