CARP на OpenBSD
По мотивам http://www.openbsd.org/faq/pf/carp.html
CARP - это аббревиатура от Common Address Redundancy Protocol, которая является альтернативой таким технологиям (протоколам) как VRRP и HSRP.
CARP позволяет навесить один и тот же ip-адрес сразу на несколько машин (redundancy group), при этом в такой группе машин одна будет Master, а остальные Backup. Таким образом физически пакеты будут идти на master-а а nackup-ы будут стоять в горячем резерве, готовые в случае пропадания master-а избрать нового и активизировать его автоматически. Master активизируется путём отсылки gratuitous ARP в порт коммутатора с последующей активизацией ответов на ARP-запросы "плавающего" ip-адреса.
Включение поддержки CARP в системе:
echo 'net.inet.carp.allow=1' >> /etc/sysctl.conf
Активация это поддержки в этом случае произойдёт после перезагрузки, но если она нужна немедленно, то
sysctl net.inet.carp.allow=1
Конфигурация интерфейса
Ручками это делается так:
создаём устройство carp1
ifconfig carp1 create vhid 16 carpdev em0 pass Пароль advbase 1 advskew 60
задаём настройки сети
ifconfig carp1 inet 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 up
таким образом мы создали carp-группу с идентификатором (vhid) 16, задали ей пароль, навесили carp-интерфейс на интерфейс em0, задали приоритет сarp-а в redundancy group vhid 16 равный 60 единицам и задали сетевые параметры.
Advskew или приоритет в carp-группе определяет кто будет master-ом, а кто backup-ом, у кого из хостов adskew больше, тот и master, срабатывает он в момент выборов (то есть в тот момент, когда мастера по какой-то причине в сети не оказалось).
Для того, чтобы настройки пережили перезагрузку нужно их зафиксировать в файле */etc/hostname.carp_номер
inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 carpdev em0 pass mekmitasdigoat advskew 100
Важный момент: если мы используем фаерволл, то необходимо разрешить протокол CARP на нём
pass out on $carp_dev proto carp keep state
$carp_dev это физический интерфейс, через который происходит общение по протоколу CARP между участниками redundancy group.
Также есть хитрость с фильтрованием траффика с помощью pf
pass in on fxp0 inet proto tcp from any to carp0 port 22
будет работать правильно, а
pass in on carp0 inet proto tcp from any to carp0 port 22
будет работать несколько неожиданным образом, достаточно знать, что неправильным
Навешивание адресов на уже созданные CARP-ы.
Начинать навешивать адреса нужно с backup-интерфейса. Кладём его:
ifconfig carpN down
навешиваем адреса:
ifconfig carpN inet alias адрес netmask маска_подсети
ifconfig carpN inet6 alias ipv6-адрес netmask маска_подсети
поднимаем интерфейс (есть большая вероятность, что он станет мастером!):
ifconfig carpN up
пингуем ВСЕ адреса на интерфейсе, они должны пинговаться, независимо от состояния интерфейса (Backup или Master). Если что-то не пингуется, необходимо снять альясный адрес и навесить его снова.
После этого проделываем аналогичную операцию на соседнем карпе.
Как убрать carp-интерфейс
ifconfig carp1 down
ifconfig carp1 destroy