Заметки о работе с ОС FreeBSD. Статьи об установке и настройке ПО для FreeBSD.

22 ноября 2016 г.

DHCP Failover на FreeBSD 11

Отказоустойчивый DHCP-сервер на основе isc-dhcpd на FreeBSD 11.0

В данной кофигурации будет два сервера:

  • 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_ifaces="em0" указывает isc-dhcpd обрабатывать запросы только на интерфейсе 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;
}

В этом файле можно задавать резервирование определенных IP-адресов:


[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 на одном из серверов.



Мои источники:
  1. https://kb.isc.org/article/AA-00502/0/A-Basic-Guide-to-Configuring-DHCP-Failover.html
  2. http://bos-info.com/freebsd/failover-dhcp.html