Настройка DHCP-сервера в Linux
Протокол динамической конфигурации узлов (Dynamic Host Configuration Protocol, DHCP) — это сетевой протокол, используемый для автоматического получения узлами IP-адресов и сетевой конфигурации с сервера.
IP-адрес, выделенный DHCP-клиенту DHCP-сервером, находится в «аренде», время аренды может отличаться в зависимости от того, сколько времени клиенту требуется соединение или конфигурация DHCP.
Как работает DHCP?
- После загрузки подключенный к сети клиент (на котором настроено использование DHCP) отправляет DHCP-серверу пакет DHCPDISCOVER.
- Получив пакет запроса DHCPDISCOVER, DHCP-сервер отвечает пакетом DHCPOFFER.
- Клиент принимает пакет DHCPOFFER и отправляет серверу пакет DHCPREQUEST, подтверждая готовность принять сетевую конфигурацию, предоставленную в пакете.
- Получив от клиента пакет DHCPREQUEST, сервер отправляет пакет DHCPACK, который разрешает клиенту использование выделенного IP-адреса.
В данном руководстве мы рассмотрим настройку DHCP-сервера в Ubuntu/Debian Linux, но большенство настроек будет работать и в других дистрибутивах. Для получения административных привилегий все команды будут выполняться через sudo.
Шаг 1: Установка DHCP-сервера
1. Для установки пакета DCHP-сервера, ранее известного как dhcp3-server, нужно выполнить следующую команду:
2. После завершения установки отредактируйте файл /etc/default/isc-dhcp-server для определения интерфейсов, которые будет использовать DHCPD для обработки DHCP-запросов, при помощи опции INTERFACES.
Например, если вам нужно, чтобы демон DHCPD прослушивал eth0, задайте следующее значение:
Для этого сетевого интерфейса нужно настроить статический IP-адрес.
Шаг 2: Настройка DHCP-сервера
3. Основной файл конфигурации DHCP — /etc/dhcp/dhcpd.conf, в него нужно внести всю информацию, отправляемую клиентам.
В файле конфигурации DHCP есть два типа данных:
- параметры – указывают, как выполнять задание (например, на какое время выделять адрес), выполнять ли его вообще (например, выделять ли адреса неизвестным клиентам) или какие параметры сетевой конфигурации отправлять DHCP-клиенту.
- декларации – определяют топологию сети, описывают клиентов и предоставляемые им адреса, или применяют группу параметров к группе деклараций.
4. Для определения настроек DHCP-сервера откроем и отредактируем файл конфигурации:
Установите в начале файла следующие глобальные параметры, они будут действовать для всех указанных ниже деклараций (измените их в соответствии с вашими задачами). Это имя домена domain-name, имена DNS-серверов domain-name-servers, время аренды по умолчанию в секундах default-lease-time (если клиент не запросил его сам), максимальное время аренды в секундах max-lease-time и параметр authoritative, означающий «авторитетность» сервера в сегменте сети. Данный параметр нужен на тот случай, если клиент запросит неправильный IP-адрес — в этом случае сервер ответит ему отказом и предложит получить новый адрес.
Обратите внимание, что перед некоторыми параметрами указано слово option, а перед некоторыми — нет. Это слово задает параметры, которые передаются клиенту в сетевой конфигурации.
5. Теперь нужно указать подсеть, в нашем примере мы будем использовать DHCP в локальной сети 192.168.10.0/24.
Здесь мы использовали следующие параметры:
routers — IP-адрес маршрутизатора по умолчанию
subnet-mask — маска подсети
domain-search — имя домена
domain-name-servers — имена DNS-серверов
range — диапазон IP-адресов, выделяемый клиентам (можно указывать несколько диапазонов, но обязательно указать хотя бы один)
Шаг 3: Настройка статических IP-адресов для машин клиентов
6. Для выделения конкретным клиентам фиксированного (статического) IP-адреса нужно добавить в файл конфигурации секции следующего вида, где явно указаны MAC-адрес и статически выделяемый IP-адрес:
7. Запустим службу DHCP и установим ее автоматический запуск при загрузке:
8. Далее нужно создать правило для службы DHCP в брандмауэре (Демон DHCPD прослушивает UDP-порт 67):
Шаг 4: Настройка машин клиентов
9. Теперь можно настроить клиентские компьютеры в сети для автоматического получения IP-адресов от DHCP-сервера.
Отредактируйте файл конфигурации интерфейса Ethernet на клиентской машине (обратите внимание на имя/номер интерфейса):
Укажите следующие опции:
Сохраните и закройте файл, а затем перезапустите сетевые службы или перезагрузите систему:
Если все настроено правильно, клиентская машина должна автоматически получать IP-адреса от DHCP-сервера.
Настройка DHCP-сервера завершена. Более подробную информацию о dhcpd и dhcpd.conf с описанием всех возможных опций можно получить в соответствующих man-страницах:
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Обнаружить DHCP
Доброго времени суток! Озадачили меня тут: надо проверить из программы (C++) работает ли dhcp или сеть сконфигурирована с постоянным адресом. Гуглеж дал лишь советы проверять leases в /var/lib/dhcpd/dhcpd.leases. Ubuntu 12.04,
Можно послать DHCPDISCOVER и найти таким образом DHCP-серверы.
Ещё можно узнать адрес сервера у NetworkManager, распарсив вывод команды:
($UUID — это UUID соединения).
Вместо запуска команды лучше получить нужную информацию напрямую через D-Bus.
лучше получить нужную информацию напрямую через D-Bus
а вот с этого места поподробнее, пожалуйста.
В общем случае это невозможно, так как настройки, полученные от DHCP, принципиально ничем не отличаются от настроек, заданных «руками».
А ещё наличие/отсутствие DHCP никак не коррелирует с «постоянством» IP-адреса.
А мне не надо настройки получать, нужно лишь определить наличие DHCP сервера.
А мне не надо настройки получать, нужно лишь определить наличие DHCP сервера.
- На клиентской машине: определить, получены ли настройки по DHCP, или заданы локально.
- На клиентской машине: определить, работает ли в локальной сети DHCP-сервер.
- На сервере: определить, работает ли DHCP-сервер на этой же системе.
Что именно из этого тебе нужно?
На клиентской машине: определить, работает ли в локальной сети DHCP-сервер
Именно это. Пардон муа, что не оговорил сразу.
Почитай описание работы DHCP, посмотри снифером какие пакеты шлют dhcp-клиенты при поиске серверов и посмотри исходники dhcp-клиентов.
Тебе нужно отправить в сеть DHCPDISCOVER (насколько я помню) и подождать ответа от сервера (или нескольких серверов). Если ответ придёт — DHCP-сервер работает.
а вот с этого места поподробнее, пожалуйста.
NetworkManager виден как org.freedesktop.NetworkManager. Сначала в /org/freedesktop/NetworkManager вызываем org.freedesktop.NetworkManager.GetDevices, получаем там список путей, соответствующих устройствам. Для каждого из этих путей вызываем org.freedesktop.NetworkManager.Device.Interface, находим, какому устройству соответствует нужный интерфейс. На нужном устройстве вызываем org.freedesktop.NetworkManager.Device.Dhcp4Config, получаем путь. Если это /, тогда DHCP не использовался, иначе на этом пути можно вызвать org.freedesktop.NetworkManager.DHCP4Config.Options и получить словарь с конфигурацией DHCP.
Это был вариант, если нужно проверить, использовался ли DHCP для конкретного интерфейса. Также можно раскрутить это через org.freedesktop.NetworkManager.ActiveConnections. Полное описание API здесь: http://projects.gnome.org/NetworkManager/developers/api/09/spec.html
Но если таки нужно определить наличие DHCP-сервера, а не факт его использования клиентом, но нужно посылать DHCPDISCOVER.
Спасибо!
и наилучшие пожелания 🙂
Премного благодарен! Кажется, это то, что мне надо.
А вот я не уверен. Если таки нужно это:
На клиентской машине: определить, работает ли в локальной сети DHCP-сервер
то нужно посылать DHCPDISCOVER и ждать ответа.
Если же сгодится и это:
На клиентской машине: определить, получены ли настройки по DHCP, или заданы локально.
тогда действительно можно опрашивать NetworkManager.
Я не говорил, что уверен. Там ведь «кажется», не?
А за помощь — спасибо. Я думаю, что смогу обойтись вариантом опроса NetworkManager.
думаю, что смогу обойтись вариантом опроса NetworkManager.
Не рекомендовал бы зацикливаться на NetworkManager’е, так как:
во-первых, существуют и другие менеджеры сети (например, wvdial),
во-вторых, сеть может работать и без менеджеров (в дебиане, например, может задаваться через /etc/network/interfaces).
Ну и в-третьих, даже если на этой машине стоит NetworkManager и настройки заданы вручную, в сети могут быть работоспособные dhcp-сервера.
Согласен
Ибо уже по граблям прошел. NetworkManager работает, а файла сервиса нет. Придется искать другие пути. Кстати, там где надо определяться, в /etc/network/interfaces практически пусто. С чем еще посоветуете повозиться?
Погуглируй по слову DHCPDISCOVER как и советовали.
Т.е. тебе нужно посылать в сеть по протоколу UDP специально сформированный широковещательный запрос. И слушать ответы на 67/68 портах UDP.
Возможно, тебе придется изучить работу с udp-пакетами, а также формат запросов. А может быть тебе повезет, и найдешь готовую C++ библиотеку для работы с DHCP. Ищи 😉
Спасибо.
Читал, читаю и буду читать. Только давайте посмотрим на задачу с другой стороны. В /etc/network/interfaces нет адреса, заданного явно. NeworkManager работает, в сети есть dhcp-сервер. Можно ли узнать (и как), какой ip у машины? Пропала связь, через некоторое время восстановилась, какой адрес получен?
В /etc/network/interfaces нет адреса, заданного явно
Эммм. Почему-то ты всё время говоришь о файлах и о службах.
Мне кажется тебе нужно делать упор на системные функции из системных библиотек.
Я не писал на C++, но уверен, что из «приплюснутых ссей» есть вызов сетевых системных функций, в том числе и определение поднятых на данный момент интерфейсов и ip-адресов.
Работай через системные функции.
p.s. Сам пишу на Ruby, тут всё проще 🙂
Работай через системные функции.
есть вызов сетевых системных функций
тогда действительно можно опрашивать NetworkManager.
Которого вполне может не быть
А ещё наличие/отсутствие DHCP никак не коррелирует с «постоянством» IP-адреса.
вообще-то коррелирует — если DHCP есть, то клиент от него получает IP, а если его нет, то использует свой IP из своих настроек. Конечно IRL возможны варианты.
Вот в этом и есть одна из проблем линукса — существует куча велосипедов, делающих одно и то же и конфликтующих друг с другом, и на компьютере пользователя запущен абсолютно произвольный набор программ, одинаковое будет только ядро. Как новой программе взаимодействовать с этим всем зоопарком, непонятно, потому что недостаточно стандартизированы уровни абстракции. Было бы гораздо лучше, если бы такие уровни абстракции существовали. Например, где-то был бы описан стандарт, каким должен быть API, через который настраивается сеть. Тогда программы, которым необходимо получить или изменить какие-либо настройки, связанные с сетью, использовали бы только этот API, а программа, делающая настройки сети, вызывая методы ядра, предоставляла бы этот API, и было бы гораздо проще разрабатывать программы. Но сейчас таких стандартов нет, есть только попытки создания подобных API (одна их этих попыток — NetworkManager, пример конкурирующих разных API для одной цели — logind и ConsoleKit). Конечно, есть небольшое число стандартизированных вещей (например, стандарты xdg и freedesktop), но они необязательны и их недостаточно. И одна из причин этого — свободное ПО, для которого очень трудно сделать такие стандарты, потому что тот, кто не захочет им подчиняться, может форкнуть проект и забить на эти стандарты (пример этому — два недавно появившихся форка udev), и это очень сильно тормозит развитие линукса.
Доктор, скажите мне.
где этот самый DHCP хранит полученный от сервера ip?
если DHCP есть, то клиент от него получает IP
Клиент не обязан получать адрес от DHCP, даже если в сети работает DHCP-сервер.
а если его нет, то использует свой IP из своих настроек
Динамический IPv4-адрес можно получить и без DHCP, например link local 169.254.0.0/16.
И, к тому же, адреса, выдаваемые по DHCP, не обязаны быть динамическими, они могут быть и жёстко завязаны на конкретных клиентов.
где этот самый DHCP хранит полученный от сервера ip?
зачем формировать DHCP запрос самостоятельно, если можно вызвать уже имеющуюся в системе программу-DHCP-клиент?
где этот самый DHCP хранит полученный от сервера ip?
зачем его где-то хранить? Он устанавливается при настройке интерфейса, у меня это делает /sbin/dhcpcd, ну а посмотреть его можно ip a или ifconfig.
Клиент не обязан получать адрес от DHCP, даже если в сети работает DHCP-сервер.
не обязан. А кто говорит, что обязан? Но на кой хрен ставить в сети DHCP сервер(ы), а потом статически прописывать IP?
Динамический IPv4-адрес можно получить и без DHCP, например link local 169.254.0.0/16.
И, к тому же, адреса, выдаваемые по DHCP, не обязаны быть динамическими, они могут быть и жёстко завязаны на конкретных клиентов.
я в курсе. Могут и не жёстко. dhcpd можно настроить так, что-бы он выдавал клиенту последний его IP, если это возможно. На практике это приводит к тому, что IP очень редко меняется, и почти постоянный (постоянный, если клиентов не очень много, и IP адресов всегда и на всех хватает. Если клиентов больше 64K, а пул в 64К, то очевидно, возникнет момент, когда 65536у клиенту придётся выдать чужой IP из пула.) К сожалению у нас ISP с эти не заморачиваются.
Озадачили меня тут: надо проверить из программы (C++) работает ли dhcp или сеть сконфигурирована с постоянным адресом.
кстати, а как же /var/log/message?
Но на кой хрен ставить в сети DHCP сервер(ы), а потом статически прописывать IP?
Совершенно типичная ситуация: DHCP только для клиентских машин.
Ага, тут ещё один вариант забыли предложить: вывести окошко «У вас сеть настроена по DHCP?» с кнопками Да/Нет 8).
А вообще, автор судя по всему сам не знает что он хочет и зачем ему это надо. То ему надо определить, что адрес получен по DHCP, то ему надо определить, что в сети работает DHCP-сервер.
Совершенно типичная ситуация: DHCP только для клиентских машин.
Источник