Долгие годы стандартным DHCP-сервером в Linux был ISC DHCP (пакет isc-dhcp-server, файл dhcpd.conf). Его разработка прекращена, и на смену пришёл Kea от того же разработчика. Для маленькой сети, лаборатории или домашнего маршрутизатора проще dnsmasq - лёгкий сервер, совмещающий DHCP и DNS. Разберём оба.

Инструкция подходит для Ubuntu 22.04/24.04, Debian 12/13, Fedora и RHEL 9/10 и родственных дистрибутивов.

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

Kea

Установка

bash
sudo apt install kea-dhcp4-server     # Debian, Ubuntu
sudo dnf install kea                  # Fedora, RHEL и родственные

Служба называется kea-dhcp4-server в Debian и Ubuntu и kea-dhcp4 в Fedora и RHEL. Для IPv6 есть отдельный сервер kea-dhcp6.

Конфигурация

Файл /etc/kea/kea-dhcp4.conf в формате JSON (комментарии разрешены). Минимальный рабочий пример:

json
{
  "Dhcp4": {
    "interfaces-config": {
      "interfaces": [ "eth0" ]
    },
    "lease-database": {
      "type": "memfile",
      "persist": true,
      "name": "/var/lib/kea/kea-leases4.csv"
    },
    "valid-lifetime": 86400,
    "renew-timer": 43200,
    "rebind-timer": 75600,

    "subnet4": [
      {
        "id": 1,
        "subnet": "192.168.10.0/24",
        "pools": [ { "pool": "192.168.10.100 - 192.168.10.200" } ],
        "option-data": [
          { "name": "routers", "data": "192.168.10.1" },
          { "name": "domain-name-servers", "data": "192.168.10.1, 192.168.10.2" },
          { "name": "domain-name", "data": "office.example" }
        ],
        "reservations": [
          {
            "hw-address": "52:54:00:12:34:56",
            "ip-address": "192.168.10.20",
            "hostname": "printer-1"
          }
        ]
      }
    ],

    "loggers": [
      {
        "name": "kea-dhcp4",
        "output-options": [ { "output": "/var/log/kea/kea-dhcp4.log" } ],
        "severity": "INFO"
      }
    ]
  }
}

Что здесь:

  • interfaces - на каких интерфейсах слушать запросы. Укажите только внутренние, иначе сервер начнёт раздавать адреса провайдеру.
  • lease-database - где хранить аренды. Для небольшой сети достаточно файла, для крупных можно использовать MySQL или PostgreSQL.
  • valid-lifetime - срок аренды в секундах (в примере сутки), renew-timer и rebind-timer - когда клиент начнёт продлевать аренду.
  • subnet4 - подсети с уникальным id, пулами адресов и параметрами.
  • reservations - постоянные адреса по MAC-адресу. Адрес резервирования лучше брать вне пула, чтобы его не выдали кому-то другому до первого подключения устройства.

Параметры, указанные вне subnet4, действуют для всех подсетей.

Проверка и запуск

bash
sudo kea-dhcp4 -t /etc/kea/kea-dhcp4.conf
sudo systemctl restart kea-dhcp4-server
sudo systemctl enable kea-dhcp4-server
sudo systemctl status kea-dhcp4-server

Первая команда проверяет синтаксис, не запуская сервер. Выданные аренды записываются в /var/lib/kea/kea-leases4.csv, одна строка на аренду, с адресом, MAC-адресом, именем и временем окончания.

Если клиенты находятся в других подсетях, на маршрутизаторах настраивают ретрансляцию DHCP на адрес сервера, а в конфигурацию Kea добавляют соответствующие подсети.

dnsmasq

dnsmasq подходит, когда сеть небольшая и хочется одной программой закрыть и DHCP, и локальный DNS: клиенты автоматически становятся доступны по имени.

Установка

bash
sudo apt install dnsmasq
sudo dnf install dnsmasq

Конфигурация

Основной файл - /etc/dnsmasq.conf, но удобнее положить свой файл в /etc/dnsmasq.d/:

text
# /etc/dnsmasq.d/lan.conf
interface=eth0
bind-interfaces

dhcp-range=192.168.10.100,192.168.10.200,255.255.255.0,12h
dhcp-option=option:router,192.168.10.1
dhcp-option=option:dns-server,192.168.10.1
domain=office.example

dhcp-host=52:54:00:12:34:56,192.168.10.20,printer-1
dhcp-authoritative
  • dhcp-range - диапазон, маска и срок аренды.
  • dhcp-option - шлюз, DNS-серверы и другие параметры.
  • dhcp-host - резервирование: MAC-адрес, IP-адрес, имя.
  • dhcp-authoritative - сервер считает себя единственным в сети и быстрее отвечает клиентам, вернувшимся с чужим адресом.

Конфликт с локальным DNS

dnsmasq по умолчанию запускает и DNS-сервер на порту 53. В дистрибутивах, где этот порт уже занят службой systemd-resolved, dnsmasq не запустится с ошибкой «Address already in use». Варианты:

  • нужен только DHCP - добавьте в конфигурацию port=0, DNS-часть отключится;
  • нужен и DNS - оставьте bind-interfaces и interface=eth0, чтобы dnsmasq слушал только внутренний интерфейс, а systemd-resolved - свой локальный адрес.

Проверка и запуск

bash
sudo dnsmasq --test
sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq

Аренды хранятся в /var/lib/misc/dnsmasq.leases (в некоторых дистрибутивах - в /var/lib/dnsmasq/).

Что выбрать

Большой сервер со схемой связей и маленький с простым набором

  • Kea - для офисной сети, нескольких подсетей, большого числа клиентов, отказоустойчивой пары серверов и управления через API.
  • dnsmasq - для небольшой сети, лабораторного стенда, виртуальных машин, домашнего сервера или маршрутизатора, когда нужны DHCP и DNS в одной простой настройке.

Файрвол и проверка с клиента

Сервер принимает запросы на UDP-порт 67. Если на нём включён файрвол, откройте этот порт на внутреннем интерфейсе:

bash
sudo ufw allow in on eth0 to any port 67 proto udp
sudo firewall-cmd --add-service=dhcp --permanent && sudo firewall-cmd --reload

На клиенте Linux получить адрес заново:

bash
sudo nmcli connection down "Проводное подключение 1" && sudo nmcli connection up "Проводное подключение 1"
sudo dhclient -v eth0       # в системах, где используется dhclient

На Windows - ipconfig /release и ipconfig /renew.

Частые проблемы

  • Клиенты не получают адрес, в журнале сервера пусто - сервер слушает не тот интерфейс или запросы не доходят из-за файрвола либо отсутствия ретрансляции между подсетями.
  • Сервер не запускается - ошибка в конфигурации (проверьте командой kea-dhcp4 -t или dnsmasq --test) или занят порт.
  • Сервер получает запрос, но не отвечает - подсеть в конфигурации не совпадает с адресом интерфейса, на который пришёл запрос.
  • Клиенты получают адреса от другого сервера - в сети есть ещё один DHCP-сервер. Найти его можно на клиенте: sudo nmap --script broadcast-dhcp-discover покажет все ответившие серверы.