Настраиваем отказоустойчивый DHCP-сервер на базе ISC DHCP
DHCP-сервер является одним из ключевых элементов сетевой инфраструктуры любого размера и его нормальное функционирование является залогом стабильной работы сети. Одним из способов это обеспечить является создание отказоустойчивой структуры из двух серверов, которые в нормальном режиме балансируют нагрузку, а в случае недоступности одного из серверов обслуживание всех его клиентов переходит к партнеру. В данной статье мы расскажем, как настроить такой сервер на базе ISC DHCP на платформе Linux.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе
"Архитектура современных компьютерных сетей"
вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов.
На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
ISC DHCP - один из самых популярных пакетов DHCP-сервера для Linux и Unix-like систем, при этом он прост в настройке и нетребователен к ресурсам. В данной статье мы будем выполнять все действия в среде Debian, и инструкция подойдет для любой современной системы основанной на Debian или Ubuntu, а с поправкой на работу пакетного менеджера - для любых иных Linux дистрибутивов.
Для облегчения понимания настроек мы подготовили схему, на которой обозначили все ключевые элементы и используемую в примере адресацию.
Получение OMAPI-ключа
Для взаимодействия серверов между собой в составе отказоустойчивой структуры используется специальный интерфейс Object Management API (OMAPI), который позволяет получать доступ к объектам, расположенным в базе DHCP-сервера (данные об аренде, узлах, группах). в целях безопасности сервера производят взаимную аутентификацию и для этого нам понадобится специальный ключ.
Генерация ключа производится при помощи утилиты tsig-keygen, которая входит в состав DNS-сервера bind, но не будем же мы его ставить ради единственной, по сути, одноразовой операции. Кстати, если у вас есть установленный bind, то вы можете выполнить генерацию ключа на нем. Но мы пойдем другим путем. Создадим в домашней директории суперпользователя временную папку и перейдем в нее:
1mkdir /root/tmp
2cd /root/tmp
Теперь скачаем и распакуем содержимое пакета bind9, чтобы не вводить полное имя пакета во второй команде воспользуйтесь автоматической подстановкой по клавише Tab:
1apt download bind9
2dpkg-deb -xv bind9_1%3a9.16.27-1~deb11u1_amd64.deb /root/tmp
Перейдем в каталог с нужными бинарниками:
1cd usr/sbin
И выполним генерацию ключа:
1./tsig-keygen DHCP.OMAPI > /root/dhсp_omapi.key
После чего временную папку со всем содержимым можно удалить, она нам больше не понадобится:
1rm -rf /root/tmp
Посмотреть содержимое ключа можно командой:
1cat /root/dhсp_omapi.key
В выводе вы должны увидеть следующее:
1key "DHCP_OMAPI" {
2 algorithm hmac-sha256;
3 secret "3Vx8hd3OWNWudoJlq3bvvnnwv0H8n44ZdwCoTkFVPHo=";
4};
Здесь нас интересуют две вещи: алгоритм хеширования - HMAC-SHA256 и собственно ключ, который находится в кавычках в строке secret. Следует отметить, что многие инструкции в сети интернет предлагают использовать для получения ключа утилиту dnssec-keygen и алгоритм HMAC-MD5, не будем говорить за все дистрибутивы, но в последних версиях Debian / Ubuntu данная утилита не поддерживает хеш-алгоритмы. Про HMAC-MD5 мы даже говорить не будем, по сегодняшним меркам это слабый криптоалгоритм, поэтому мы будем делать все правильно.
Настройка первичного DHCP-сервера
Отказоустойчивый DHCP-сервер строится по схеме первичного и вторичного узлов, которые могут работать как в режиме балансировки нагрузки (рекомендуется), так и в режиме горячего резерва. Отвечающие за это настройки мы рассмотрим ниже, а пока установим сам пакет ISC DHCP:
1apt install isc-dhcp-server
После чего перейдем к редактированию конфигурационного файла, он в основном содержит некоторые общие параметры и закомментированные примеры, поэтому мы оставим в нем только общие настройки, а все остальные вынесем во внешние файлы. Откроем /etc/dhcp/dhcpd.conf, найдем и раскомментируем в нем следующую опцию:
1authoritative;
Она включает "авторитетность" сервера, в этом случае получив запрос на адрес, не принадлежащий текущей сети, сервер ответит сообщением DHCPNAK, которое предлагает клиенту отказаться от адреса и запросить новый. Это позволяет быстрее получать адреса мобильным клиентам, которые до этого были подключены к другой сети.
Затем в самый конец файла добавляем:
1omapi-port 7911;
2omapi-key omapi_key;
3key omapi_key {
4 algorithm hmac-sha256;
5 secret 3Vx8hd3OWNWudoJlq3bvvnnwv0H8n44ZdwCoTkFVPHo=;
6}
Вот здесь нам и понадобятся данные, полученные на предыдущем шаге, правильно указываем хеш-алгоритм и прописываем полученный ключ.
Также подключим внешние файлы конфигурации, мы разделили их на три части: конфигурация отказоустойчивости, настройки зоны и записи о резервировании. Хранить мы их будем в отдельной директории. Добавляем в конец файла еще три строки:
1include "/etc/dhcp/dhcpd.d/failover.conf";
2include "/etc/dhcp/dhcpd.d/subnet.conf";
3include "/etc/dhcp/dhcpd.d/static.conf";
Сохраняем файл и перейдем к созданию внешних файлов и директорий:
1mkdir /etc/dhcp/dhcpd.d
2cd /etc/dhcp/dhcpd.d
3touch failover.conf subnet.conf static.conf
Начнем с /etc/dhcp/dhcpd.d/failover.conf, в котором мы будем хранить конфигурацию отказоустойчивой группы, внесем в него следующий текст:
1failover peer "failover-dhcp" {
2 primary;
3 address 192.168.72.11;
4 port 647;
5 peer address 192.168.72.12;
6 peer port 647;
7 max-response-delay 60;
8 max-unacked-updates 10;
9 mclt 3600;
10 split 128;
11 load balance max seconds 3;
12}
Самой первой строкой мы указываем тип сервера - primary - первичный. Затем следует адрес и порт сервера, адрес и порт партнера. Для работы используется порт 647, который специально используется для DHCP-FAILOVER. опция max-response-delay указывает на максимально допустимое расхождение времени между двумя узлами.
Два следующих параметра должны быть указаны только на первичном сервере.
- mclt (максимальное время обслуживания клиента) - он показывает в течении какого времени сервер, находящийся в состоянии обработки отказа, будет ждать восстановления связи с партнером, по его истечении контроль за распределением IP-адресов полностью переходит под управление оставшегося сервера.
- split - задает параметры разделения пула адресов между серверами. Может иметь значения от 0 до 256, при значении в 128 пул будет разделен 50/50, и нагрузка будет равномерно балансироваться между серверами. Если указать 256, то весь пул будет управляться первичным сервером, а вторичный сервер перейдет в режим горячей замены.
Следующий конфигурационный файл /etc/dhcp/dhcpd.d/subnet.conf хранит в себе параметры области:
1subnet 192.168.72.0 netmask 255.255.255.0 {
2 option subnet-mask 255.255.255.0;
3 option routers 192.168.72.1;
4 option domain-name-servers 192.168.72.1;
5 default-lease-time 28800;
6 max-lease-time 86400;
7 pool {
8 failover peer "failover-dhcp";
9 range 192.168.72.100 192.168.72.199;
10 }
11}
Настройки области предельно просты, мы предлагаем клиентам самый базовый набор опций: маску сети, адрес маршрутизатора и адрес(а) DNS-серверов. С полным перечнем и синтаксисом всех доступных опций вы можете ознакомиться в данном разделе документации.
Отдельно обратим внимание на опции default-lease-time - время аренды, выдаваемое по умолчанию и max-lease-time - максимальное время аренды, которое может быть выдано по запросу клиента. Если клиент не запрашивает конкретное время аренды ему будет выдан адрес на время, указанное в параметре по умолчанию, иначе - желаемое время, но не превышающее максимальное. В нашем случае это 8 часов и сутки.
В секции pool указываем диапазон адресов к выдаче и ссылку на отказоустойчивую группу. Если пулов несколько - то указываем отказоустойчивые группы для каждого из них, при этом разные пулы могут обслуживать разные пары серверов.
И, наконец, последний файл /etc/dhcp/dhcpd.d/static.conf, здесь мы будем хранить резервирование IP-адресов, по мере надобности добавляем в него секции:
1host myhost {
2 hardware ethernet 08:45:32:00:00:23;
3 fixed-address 192.168.72.121;
4}
В данном случае мы зарезервировали за устройством с MAC-адресом 08:45:32:00:00:23 IP-адрес 192.168.72.121.
Проверим правильность конфигурации:
1dhcpd -t -cf /etc/dhcp/dhcpd.conf
И при отсутствии ошибок обязательно перезагрузим сервер.
Для управления службой используйте
1systemctl start|stop|restart|status isc-dhcp-server

Убедившись, что служба запущена и работает без ошибок, перейдем к настройке второго сервера.
Настройка вторичного DHCP-сервера
Настройки обоих серверов должны быть полностью идентичны, за исключением настроек отказоустойчивой группы, поэтому можете выполнить все настройки аналогично предыдущей части статьи или просто скопировать конфигурационные файлы с первичного сервера на вторичный. Все изменения также должны вноситься синхронно. Поэтому мы и разделили конфигурацию на несколько внешних файлов: если вы внесли изменения в настройки области или добавили новые резервирования - просто скопируйте соответствующий файл с первичного сервера на вторичный.
Внести изменения нам потребуется только в файл /etc/dhcp/dhcpd.d/failover.conf, он должен иметь следующее содержимое:
1failover peer "failover-dhcp" {
2 secondary;
3 address 192.168.72.12;
4 port 647;
5 peer address 192.168.72.11;
6 peer port 647;
7 max-response-delay 60;
8 max-unacked-updates 10;
9 load balance max seconds 3;
10}
Первая строка указывает что это вторичный сервер - secondary, затем следуют адрес и порт сервера и его партнера, за ними остальные опции, которые остаются без изменений.
Сохраняем настройки, проверяем их и перезагружаем сервер. Теперь нашу область будут обслуживать сразу оба сервера, балансируя нагрузку между собой. Для проверки по очереди выключаем сервера и убеждаемся, что оставшийся сервер берет на себя обслуживание клиентов.
Настройка брандмауэра
Если на ваших узлах включен брандмауэр iptables, то вам потребуется добавить в него два разрешающих правила:
1iptables -A INPUT -p udp -m state --state NEW -m udp --dport 67 -j ACCEPT
2iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 647 -j ACCEPT
Второе правило можно немного изменить, разрешив серверам принимать соединения только друг от друга:
1iptables -A INPUT -s 192.168.72.12 -p tcp -m state --state NEW -m tcp --dport 647 -j ACCEPT
Где -s 192.168.72.12 - адрес сервера-партнера. Данные правила должны располагаться выше правила, запрещающего все входящие соединения.
Дополнительно
В завершение заглянем в /etc/default/isc-dhcp-server, здесь нас будут интересовать две последние опции в файле:
1INTERFACESv4="eth0"
2#INTERFACESv6=""
В первой из них желательно задать интерфейс (можно несколько) на которых ваш DHCP-сервер будет принимать запросы, это важно, если интерфейсов более одного. Вторая опция отвечает за работу c IPv6, если вы не работаете с этим протоколом и не настраивали обработку IPv6 запросов, то просто отключите шестую версию закомментировав эту строку.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе
"Архитектура современных компьютерных сетей"
вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов.
На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще: