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

Next Post