Отказоустойчивый DHCP-сервер на основе isc-dhcpd на FreeBSD 11.0
В данной кофигурации будет два сервера:
На обоих FreeBSD 11:
Начинаем, как обычно, с rc.conf
dhcpd_ifaces="em0" указывает isc-dhcpd обрабатывать запросы только на интерфейсе em0.
Основной конфиг dhcpd:
OMAPI ключ можно создать вот такой командой:
В результате получим два файла:
Kdhcp_updater.+157+57657.key
Kdhcp_updater.+157+57657.private
Этот файл есть только на первом сервере srv8768test-1:
В этом файле можно задавать резервирование определенных IP-адресов:
Переходим к настройке второго сервера
Этот файл есть только на втором сервере srv8768test-2?
Проверяем
Здесь можно видеть два перезапуска. Первый - на основном сервере. Второй - на резервном.
В логах обоих серверов можно увидеть подобные записи:
dhcpd: DHCPREQUEST for 192.168.87.61 from 00:00:23:18:b3:a8 via em0
dhcpd: DHCPACK on 192.168.87.61 to 00:00:23:18:b3:a8 via em0
В данной кофигурации будет два сервера:
- srv8768test-1 (192.168.87.200)
- srv8768test-2 (192.168.87.201)
На обоих FreeBSD 11:
[root@srv8768test-1 ~]# uname -rms
FreeBSD 11.0-RELEASE-p2 amd64
Начинаем, как обычно, с rc.conf
[root@srv8768test-1 ~]# ee /etc/rc.conf
dhcpd_enable="YES"
dhcpd_ifaces="em0"
Основной конфиг dhcpd:
[root@srv8768test-1 ~]# ee /usr/local/etc/dhcpd.conf
log-facility local7;
authoritative;
default-lease-time 86400; # 1 day
max-lease-time 604800; # 1 week
omapi-port 7911;
omapi-key omapi_key;
key omapi_key {
algorithm hmac-md5;
secret Ofakekeyfakekeyfakekey==;
}
# DHCP Failover, Secondary
include "/usr/local/etc/dhcpd/dhcpd.conf_primary";
# Subnet declaration
include "/usr/local/etc/dhcpd/dhcpd.subnet";
OMAPI ключ можно создать вот такой командой:
[root@srv8768test-1 ~]# dnssec-keygen -a HMAC-MD5 -b 512 -n USER DHCP_UPDATER
В результате получим два файла:
Kdhcp_updater.+157+57657.key
Kdhcp_updater.+157+57657.private
Из которых и копируем ключ в файл dhcpd.conf
[root@srv8768test-1 ~]# mkdir /usr/local/etc/dhcpd/ && cd /usr/local/etc/dhcpd/
[root@srv8768test-1 ~]# touch dhcpd.conf_primary dhcpd.static dhcpd.subnet
Этот файл есть только на первом сервере srv8768test-1:
[root@srv8768test-1 /usr/local/etc/dhcpd]# ee dhcpd.conf_primary
##########################
# DHCP Failover, Primary #
##########################
failover peer "net87" {
primary;
address 192.168.87.200;
port 519;
peer address 192.168.87.201;
peer port 520;
max-response-delay 60;
max-unacked-updates 10;
mclt 3600;
split 128;
load balance max seconds 3;
}
Описание подсетей:
[root@srv8768test-1 /usr/local/etc/dhcpd]# ee dhcpd.subnet
subnet 192.168.87.0 netmask 255.255.255.0 {
interface "em0";
group { include "/usr/local/etc/dhcpd/dhcpd.static"; }
pool {
failover peer "net87";
range 192.168.87.51 192.168.87.70;
}
default-lease-time 432000;
max-lease-time 604800;
option routers 192.168.87.1;
option domain-name-servers 192.168.87.200, 192.168.87.201;
}
[root@srv8768test-1 /usr/local/etc/dhcpd]# ee dhcpd.static
host SomePC { hardware ethernet 00:c7:93:07:52:3c; fixed-address 192.168.87.202; }
Переходим к настройке второго сервера
[root@srv8768test-2 ~]# ee /usr/local/etc/dhcpd.conf
log-facility local7;
authoritative;
default-lease-time 86400; # 1 day
max-lease-time 604800; # 1 week
omapi-port 7911;
omapi-key omapi_key;
key omapi_key {
algorithm hmac-md5;
secret Ofakekeyfakekeyfakekey==;
}
# DHCP Failover, Secondary
include "/usr/local/etc/dhcpd/dhcpd.conf_secondary";
# Subnet declaration
include "/usr/local/etc/dhcpd/dhcpd.subnet";
[root@srv8768test-2 ~]# mkdir /usr/local/etc/dhcpd/ && cd /usr/local/etc/dhcpd/
[root@srv8768test-2 ~]# touch dhcpd.conf_secondary
Этот файл есть только на втором сервере srv8768test-2?
[root@srv8768test-2 /usr/local/etc/dhcpd]# ee dhcpd.conf_secondary
############################
# DHCP Failover, Secondary #
############################
failover peer "net87" {
secondary; # I am the secondary
address 192.168.87.201; # My IP address
port 520;
peer address 192.168.87.200; # Peer's IP address
peer port 519;
max-response-delay 60;
max-unacked-updates 10;
mclt 3600;
load balance max seconds 3;
}
Файлы dhcpd.static и dhcpd.subnet копируем с первого (srv8768test-1) сервера. В дальнейшем будем их синхронизировать автоматически.
Проверяем
Проверяем
[root@srv8768test-1 ~]# service isc-dhcpd restart
Stopping dhcpd.
Starting dhcpd.
Internet Systems Consortium DHCP Server 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /usr/local/etc/dhcpd.conf
Database file: /var/db/dhcpd/dhcpd.leases
PID file: /var/run/dhcpd/dhcpd.pid
Wrote 0 deleted host decls to leases file.
Wrote 0 new dynamic host decls to leases file.
Wrote 81 leases to leases file.
Listening on BPF/em0/00:00:d6:be:7a:37/192.168.87.0/24
Sending on BPF/em0/00:00:d6:be:7a:37/192.168.87.0/24
Sending on Socket/fallback/fallback-net
failover peer wifi: I move from normal to startup
Если посмотреть в лог-файл, то нас интересует вот эта строка:
failover peer wifi: I move from startup to normal
Итак, мы хотим чтобы при перезапуске демона isc-dhcpd на основном сервере все конфигурационные файлы копировались на резервный сервер
Для этого необходимо чтобы пользователь dhcp-updater имел беспарольный доступ к каталогу /usr/local/etc/dhcpd на резервном сервере через ssh.
На обоих серверах создаем пользователя dhcp-updater
[root@srv8768test-1 ~]# adduser
Username: dhcp-updater
[root@srv8768test-2 ~]# adduser
Username: dhcp-updater
Права на каталоги, чтобы пользователь dhcp-updater имел возможность заменять файлы
[root@srv8768test-1 ~]# chown -R dhcp-updater:dhcp-updater /usr/local/etc/dhcpd
[root@srv8768test-2 ~]# chown -R dhcp-updater:dhcp-updater /usr/local/etc/dhcpd
На втором сервере под пользователем dhcp-updater генерируем ключи
[root@srv8768test-2 ~]# su dhcp-updater
[root@srv8768test-2 ~]# ssh-keygen -t rsa
В результате получим 2 файла в каталоге /home/dhcp-updater/.ssh/: id_rsa и id_rsa.pub. Это приватный и публичный ключи. Теперь необходимо скопировать публичный ключ на основной сервер (srv8768test-1), для этого:
[root@srv8768test-2 ~]# scp id_rsa.pub dhcp-updater@192.168.87.200:/home/dhcp-updater/.ssh/authorized_keys
Далее нам понадобится sudo на обоих серверах
[root@srv8768test-1 ~]# cd /usr/ports/security/sudo && make install clean
[root@srv8768test-2 ~]# cd /usr/ports/security/sudo && make install clean
Сам скрипт синхронизации конфигов будет расположен на основном сервере
[root@srv8768test-1 ~]# touch /usr/local/adm/dhcp-updater.sh
[root@srv8768test-1 ~]# chmod 755 /usr/local/adm/dhcp-updater.sh
[root@srv8768test-1 ~]# ee /usr/local/adm/dhcp-updater.sh
#!/bin/sh
date=`date -v-1d '+%Y%m%d'`
month=`date '+%Y-%m'`
sudo_app="/usr/local/bin/sudo"
base_dir="/usr/local/etc/dhcpd"
backup_user="dhcp-updater"
backup_server="192.168.87.201"
echo " "
echo "Start config sync"
echo " "
for file in `/bin/ls /usr/local/etc/dhcpd/ | /usr/bin/grep dhcpd.s`
do
echo " Sync file: ${file}"
${sudo_app} -u ${backup_user} scp -q ${base_dir}/${file} ${backup_user}@${backup_server}:${base_dir}/${file}
done
echo " "
echo "End config sync"
echo " "
${sudo_app} -u ${backup_user} ssh ${backup_server} ${sudo_app} /usr/local/etc/rc.d/isc-dhcpd restart
Запускать скрипт будем при рестарте демона isc-dhcpd
[root@srv8768test-1 ~]# ee /usr/local/etc/rc.d/isc-dhcpd
В функцию dhcpd_checkconfig () необходимо добавить строку "else sh /usr/local/adm/dhcp-updater.sh" так:
dhcpd_checkconfig ()
{
local rc_flags_mod
setup_flags
rc_flags_mod="$rc_flags"
# Eliminate '-q' flag if it is present
case "$rc_flags" in
*-q*) rc_flags_mod=`echo "${rc_flags}" | sed -Ee 's/(^-q | -q | -q$)//'` ;;
esac
if ! ${command} -t -q ${rc_flags_mod}; then
err 1 "`${command} -t ${rc_flags_mod}` Configuration file sanity check failed"
else sh /usr/local/adm/dhcp-updater.sh
fi
}
Проверяем
[root@srv8768test-1 ~]# service isc-dhcpd restart
Start config sync
Sync file: dhcpd.static
Sync file: dhcpd.subnet
End config sync
Stopping dhcpd.
Starting dhcpd.
Internet Systems Consortium DHCP Server 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /usr/local/etc/dhcpd.conf
Database file: /var/db/dhcpd/dhcpd.leases
PID file: /var/run/dhcpd/dhcpd.pid
Wrote 0 deleted host decls to leases file.
Wrote 0 new dynamic host decls to leases file.
Wrote 81 leases to leases file.
Listening on BPF/em0/00:00:d6:be:7a:37/192.168.87.0/24
Sending on BPF/em0/00:00:d6:be:7a:37/192.168.87.0/24
Sending on Socket/fallback/fallback-net
failover peer wifi: I move from normal to startup
Stopping dhcpd.
Starting dhcpd.
Internet Systems Consortium DHCP Server 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /usr/local/etc/dhcpd.conf
Database file: /var/db/dhcpd/dhcpd.leases
PID file: /var/run/dhcpd/dhcpd.pid
Wrote 0 deleted host decls to leases file.
Wrote 0 new dynamic host decls to leases file.
Wrote 81 leases to leases file.
Listening on BPF/em0/00:00:d6:be:25:41/192.168.87.0/24
Sending on BPF/em0/00:50:d6:be:25:41/192.168.87.0/24
Sending on Socket/fallback/fallback-net
failover peer wifi: I move from normal to startup
В логах обоих серверов можно увидеть подобные записи:
dhcpd: DHCPREQUEST for 192.168.87.61 from 00:00:23:18:b3:a8 via em0
dhcpd: DHCPACK on 192.168.87.61 to 00:00:23:18:b3:a8 via em0
Проверить работоспособность можно просто service isc-dhcpd stop на одном из серверов.
Мои источники:
- https://kb.isc.org/article/AA-00502/0/A-Basic-Guide-to-Configuring-DHCP-Failover.html
- http://bos-info.com/freebsd/failover-dhcp.html