Два 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, нужна автоматизация процесса добавления статических привязок и механизм репликации конфига
- 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
- Для начала в Windows DNS создаем все обратные зоны для всех VLAN’ов, разрешаем зонам небезопасные обновления.
# 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-servers 10.1.2.2, 10.1.2.3; # Дополнительные DNS-суффиксы. Не работает для Windows-клиентов option domain-search "example.lan corp.example.ru"; # Настройка времени аренды default-lease-time 604800; # 7 days max-lease-time 2419200; # 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";
# Объявление зон для безболезненного динамического обновления 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 >
failover peer "dhcp-failover"
Для репликации серверов достаточно написать скрипт, который синхронизирует файлы в каталоге «/etc/dhcp/dhcpd.d/» и перезапускает dhcp-демон после этого. Сам скрипт приводить не буду из-за очень «костыльного» кода, который писался на коленке и на очень скорую руку. Возможно синхронизировать конфиги с помощью утилиты типа csync2 или rsync.
Для добавления статических привязок также был написан отдельный скрипт, который мне стыдно приводить тут по тем же причинам. Каждый может порезвиться с этим сам либо добавлять статические привязки «ручками».
Единственное «но» — при добавлении нового VLAN основной файл конфигурации «/etc/dhcp/dhcpd.conf» придется править ручками, так как у меня не получилось сделать include на весь каталог, только на конкретные файлы.
Возможно это можно обойти двойным include: сначала в основном файле на вспомогательный, а во вспомогательном уже на конкретные файлы VLAN, а затем синхронизировать и вспомогательный, но я заморачиваться не стал.
Повторюсь ещё раз — большинство информации, описанной мной, в интернете навалом, но нигде я не нашел как совместить failover, dhcp-relay и сделать это удобным для синхронизации. Жду ваших замечаний и предложений
DHCP-relay в Linux
DHCP-relay — Это «пассивный» DHCP-сервер, находящийся в другой подсети, который получает/передает информацию с/на основного DHCP-сервера и на основании её работает с клиентом. Таким образом осуществляется централизованное управление. Функции DHCP-релея обычно возлагаются на маршрутизаторы в многосегментных сетях.
Для начала установим пакет isc-dhcp-relay, на маршрутизаторе в сети, которая будет клиентом.
#apt-get install isc-dhcp-relay
Далее будет мастер установки isc-dhcp-relay
Изначально предлагают выбрать dhcp-server.
Здесь нужно указать интерфейсы, нужно указывать два интерфейса, один, который идет к dhcp-server, другой инетрфейс клиента.
Есть возможность добавлять дополнительные ключи, этот пункт можно оставить пустым.
Все параметры можно изменить в конфигурационном файле /etc/default/isc-dhcp-relay.
Настройка самого dhcp-relay закончена, теперь нужно настроить dhcp-server, такое руководство уже есть на сайте. Осталось только добавить две сети, одна, которую нужно раздавать и cеть интерфейса который идет к сети клиена.
#apt-get install isc-dhcp-relay