Андрей Смирнов
Время чтения: ~9 мин.
Просмотров: 35

Два DHCP сервера на Centos7 с failover, dhcp-relay и динамическим обновлением зон

Приветствую всех хабраюзеров. Мой первый опыт написания статей на Хабре, так что любая конструктивная критика приветствуется. Написать решил только лишь потому, что недавно столкнулся с задачей, решения которой «в лоб» не нашел. Суть задачи в том, что в большой организации нужен был отказоустойчивый DHCP-сервер, с dhcp-relay и возможностью быстро синхронизировать конфигурацию. Основной момент, что в большинстве найденных мной руководствах рассматривается либо вариант failover, либо dhcp-relay и нигде оба варианта не рассматривались вместе да ещё и с удобным методом синхронизации конфигурации. Вдруг кому моя статья немного поможет? Суть задачи в следующем: есть большое предприятие, сеть на >1000 компов, единственный vlan, 2 контроллера домена, в сети dhcp отсутствует(!). Предыдущие админы умели только так, но это отдельный рассказ и не для Хабра. Понятно, что первой же задачей стала модернизация сети, а именно сегментация на vlan и внедрение dhcp. При анализе задачи были выработаны следующие требования:

  • Отказоустойчивость — независимость от какого-либо железа
  • Учитывая планы по сегментации сети — необходимо, чтоб сервер знал, в какой vlan какую адресацию отдавать
  • «Репликация» — учитывая, что планируется широко использовать dhcp «привязки» по MAC, нужно чтоб эти «привязки» работали всегда (например, сетевые принтеры)
  • Автоматическое ведение обратных DNS зон

Не буду описывать долгие размышления и чтения различных статей и мануалов, привожу итоговое рабочее решение:

  • Две виртуальные машины на двух разных гипервизорах
  • На машинах стоит centos7 и isc-dhcpd
  • На dhcp настроены failover, динамическое обновление зон и распознавание option 82
  • Option 82 меткой того VLAN, из которого пришел запрос, серверу отдают центральные коммутаторы L3+, на которых все VLAN и разруливаются
  • Так как большинство админов плохо ориентируются в linux и vim, нужна автоматизация процесса добавления статических привязок и механизм репликации конфига

Схема сети:760aee1d17064d6a99b068388529366a.png Имеем:

  • DC0 и DC1 с настроенными DNS серверами, 10.1.2.2 и 10.1.2.3
  • DHCP0 и DHCP1, 10.1.2.4 и 10.1.2.14
  • VLAN’ы пользователей: 10, 11, 20, 21
  • Домен corp.example.ru
  • Дополнительную DNS зону (для linux серверов) — example.lan
  • Маршрутизаторы на базе L3 коммутаторов с поддержкой dhcp option 82. Во всех VLAN’ах они имеют 1-й IP адрес, связаны через OSPF

Так как некоторые вещи достаточно тривиальны и описаны в интернете не раз, подробно их расписывать не буду.

  1. Настраиваем DHCP-relay на интерфейсах управляемых коммутаторов. При этом в качестве circuit-id приходит строка «VLAN10» и т.п.
  2. Редактируем /etc/dhcp/dhcpd.conf
    # DHCP Server Configuration file. #   see /usr/share/doc/dhcp*/dhcpd.conf.example #   see dhcpd.conf(5) man page # # ddns-update-style interim;# Тип обновлений ddns-domainname "corp.example.ru";# Имя нашего домена update-static-leases on;# На всякий случай  local-address 10.1.2.4;# Адрес сервера   # Логгинг информации, если запрос пришел от DHCP-relay if exists agent.circuit-id { log ( info, concat( " Accepted DHCP RELAY request for ", binary-to-ascii (10, 8, ".", leased-address), " Network segment: ", option agent.circuit-id, " DHCP Agent: ", option agent.remote-id)); }   # this DHCP server to be declared valid authoritative;   # Настройка безотказности failover peer "dhcp-failover" { primary;# Этот сервер главный address 10.1.2.4;# Его адрес port 519;# Его порт peer address 10.1.2.14;# Адрес второго DHCP peer port 520;# Порт второго DHCP # Дополнительные параметры настройки max-response-delay 30; max-unacked-updates 10; load balance max seconds 3; mclt 1800; split 128; # эта опция позволяет оставшемуся в работе DHCP серверу # использовать ту половину пула адресов, # которая осталась от "упавшего" сервера через Х секунд. auto-partner-down 86400;#за эту опцию спасибо @baf28 }  # Сообщаем этот суффикс всем клиентам option domain-name "corp.example.ru"; # DNS-сервера option domain-name-servers10.1.2.2, 10.1.2.3; # Дополнительные DNS-суффиксы. Не работает для Windows-клиентов option domain-search"example.lan corp.example.ru"; # Настройка времени аренды default-lease-time604800;# 7 days max-lease-time2419200;# 4 weeks   # default netmask /24 option subnet-mask 255.255.255.0;  # Servers vlan - без DHCP subnet 10.1.2.0 netmask 255.255.255.0 { }   # Дополнительные файлы конфигурации для VLAN'ов include "/etc/dhcp/dhcpd.d/vlan10.conf"; include "/etc/dhcp/dhcpd.d/vlan11.conf"; include "/etc/dhcp/dhcpd.d/vlan20.conf"; include "/etc/dhcp/dhcpd.d/vlan21.conf";
  3. Теперь добавляем файл конфигурации для каждого VLAN (на примере /etc/dhcp/dhcpd.d/vlan10.conf)
    # Объявление зон для безболезненного динамического обновления zone 10.1.10.in-addr.arpa. {  primary 10.1.2.2; secondary 10.1.2.3; }   # Описываем класс для фильтрации запросов от DHCP-relay class "VLAN10" { match if option agent.circuit-id = "VLAN10"; }   # Объявляем саму нашу сеть subnet 10.1.10.0 netmask 255.255.255.0 { option routers  10.1.10.1; pool { failover peer "dhcp-failover";# Указание на то, какой failover использовать range 10.1.10.51 10.2.56.254;# Диапазон allow members of "VLAN10";# Привязка к классу }  # === Static hosts # Admin host admin { hardware ethernet 01:23:45:67:89:ab; fixed-address 10.1.10.20; } # Admin's printer host admin { hardware ethernet cd:ef:01:23:45:67; fixed-address 10.1.10.21; } # Строчка ниже используется самописным скриптом как маркер того, # что ниже нужно вставить текст для статической привязки очередного устройства # Insert automatic text above this } 
  4. Для второго DHCP сервера создаем аналогичные конфиги, только исправляем в основном файле:
    failover peer "dhcp-failover" { secondary;# Этот сервер запасной address 10.1.2.14;# Его адрес port 520;# Его порт peer address 10.1.2.4;# Адрес главного DHCP peer port 519;# Порт главного DHCP # Дополнительные параметры настройки max-response-delay 30; max-unacked-updates 10; load balance max seconds 3; # эта опция позволяет оставшемуся в работе DHCP серверу # использовать ту половину пула адресов, # которая осталась от "упавшего" сервера через Х секунд. auto-partner-down 86400;#за эту опцию спасибо @baf28 }

Получились у нас 2 dhcp сервера, в случае отключения одного из них его функции подхватывает второй, при этом оба отвечают на запросы от dhcp relay agent и на основании установленной в dhcp option 82 circuit-id строки (в нашем случае имя VLAN) выдает каждому сегменту его диапазон. Для репликации серверов достаточно написать скрипт, который синхронизирует файлы в каталоге «/etc/dhcp/dhcpd.d/» и перезапускает dhcp-демон после этого. Сам скрипт приводить не буду из-за очень «костыльного» кода, который писался на коленке и на очень скорую руку. Возможно синхронизировать конфиги с помощью утилиты типа csync2 или rsync. Для добавления статических привязок также был написан отдельный скрипт, который мне стыдно приводить тут по тем же причинам. Каждый может порезвиться с этим сам либо добавлять статические привязки «ручками». Единственное «но» — при добавлении нового VLAN основной файл конфигурации «/etc/dhcp/dhcpd.conf» придется править ручками, так как у меня не получилось сделать include на весь каталог, только на конкретные файлы. Возможно это можно обойти двойным include: сначала в основном файле на вспомогательный, а во вспомогательном уже на конкретные файлы VLAN, а затем синхронизировать и вспомогательный, но я заморачиваться не стал. Повторюсь ещё раз — большинство информации, описанной мной, в интернете навалом, но нигде я не нашел как совместить failover, dhcp-relay и сделать это удобным для синхронизации. Жду ваших замечаний и предложений

Протокол динамической конфигурации узлов (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, нужно выполнить следующую команду:

$ sudo apt install isc-dhcp-server

2. После завершения установки отредактируйте файл /etc/default/isc-dhcp-server для определения интерфейсов, которые будет использовать DHCPD для обработки DHCP-запросов, при помощи опции INTERFACES.

Например, если вам нужно, чтобы демон DHCPD прослушивал eth0, задайте следующее значение:

INTERFACES="eth0"

Для этого сетевого интерфейса нужно настроить статический IP-адрес.

Шаг 2: Настройка DHCP-сервера

  • параметры – указывают, как выполнять задание (например, на какое время выделять адрес), выполнять ли его вообще (например, выделять ли адреса неизвестным клиентам) или какие параметры сетевой конфигурации отправлять DHCP-клиенту.
  •  декларации – определяют топологию сети, описывают клиентов и предоставляемые им адреса, или применяют группу параметров к группе деклараций.

4. Для определения настроек DHCP-сервера откроем и отредактируем файл конфигурации:

$ sudo vi /etc/dhcp/dhcpd.conf

Установите в начале файла следующие глобальные параметры, они будут действовать для всех указанных ниже деклараций (измените их в соответствии с вашими задачами). Это имя домена domain-name, имена DNS-серверов domain-name-servers, время аренды по умолчанию в секундах default-lease-time (если клиент не запросил его сам), максимальное время аренды в секундах max-lease-time и параметр authoritative, означающий «авторитетность» сервера в сегменте сети. Данный параметр нужен на тот случай, если клиент запросит неправильный IP-адрес — в этом случае сервер ответит ему отказом и предложит получить новый адрес.

option domain-name "itproffi.lan";  option domain-name-servers ns1.itproffi.lan, ns2.itproffi.lan;  default-lease-time 3600;   max-lease-time 7200;  authoritative;

Обратите внимание, что перед некоторыми параметрами указано слово option, а перед некоторыми — нет. Это слово задает параметры, которые передаются клиенту в сетевой конфигурации.

5. Теперь нужно указать подсеть, в нашем примере мы будем использовать DHCP в локальной сети 192.168.10.0/24.

subnet 192.168.10.0 netmask 255.255.255.0 {            option routers 192.168.10.1;            option subnet-mask 255.255.255.0;            option domain-search "itproffi.lan";            option domain-name-servers 192.168.10.1;            range 192.168.10.10 192.168.10.100;            range 192.168.10.110 192.168.10.200;  }

Здесь мы использовали следующие параметры:

routers — IP-адрес маршрутизатора по умолчаниюsubnet-mask — маска подсетиdomain-search — имя доменаdomain-name-servers — имена DNS-серверовrange — диапазон IP-адресов, выделяемый клиентам (можно указывать несколько диапазонов, но обязательно указать хотя бы один)

Шаг 3: Настройка статических IP-адресов для машин клиентов

6. Для выделения конкретным клиентам фиксированного (статического) IP-адреса нужно добавить в файл конфигурации секции следующего вида, где явно указаны MAC-адрес и статически выделяемый IP-адрес:

host centos-node {        hardware ethernet 00:f0:m4:6y:89:0g;        fixed-address 192.168.10.105;  }    host fedora-node {         hardware ethernet 00:4g:8h:13:8h:3a;         fixed-address 192.168.10.106;  }

7. Запустим службу DHCP и установим ее автоматический запуск при загрузке:

———— SystemD ————

$ sudo systemctl start isc-dhcp-server.service  $ sudo systemctl enable isc-dhcp-server.service

———— SysVinit ————

$ sudo service isc-dhcp-server.service start  $ sudo service isc-dhcp-server.service enable

8. Далее нужно создать правило для службы DHCP в брандмауэре (Демон DHCPD прослушивает UDP-порт 67):

$ sudo ufw allow 67/udp  $ sudo ufw reload  $ sudo ufw show

Шаг 4: Настройка машин клиентов

9. Теперь можно настроить клиентские компьютеры в сети для автоматического получения IP-адресов от DHCP-сервера.

Отредактируйте файл конфигурации интерфейса Ethernet на клиентской машине (обратите внимание на имя/номер интерфейса):

$ sudo vi /etc/network/interfaces

Укажите следующие опции:

auto eth0  iface eth0 inet dhcp

Сохраните и закройте файл, а затем перезапустите сетевые службы или перезагрузите систему:

———— SystemD ————

$ sudo systemctl restart networking

———— SysVinit ————

$ sudo service networking restart

Если все настроено правильно, клиентская машина должна автоматически получать IP-адреса от DHCP-сервера.

Настройка DHCP-сервера завершена. Более подробную информацию о dhcpd и dhcpd.conf с описанием всех возможных опций можно получить в соответствующих man-страницах:

$ man dhcpd  $ man dhcpd.conf

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Используемые источники:

  • https://habr.com/post/323984/
  • https://itproffi.ru/nastrojka-dhcp-servera-v-linux/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации