Введение в Common Address Redundancy Protocol


После того, как в OpenBSD и FreeBSD была реализована поддержка протокола CARP, данная фукция была включена и в состав NetBSD. Представляю перевод соответствующей главы руководства пользователя. В принципе, является вольным изложением man carp(4).

Перевод: Сгибнев Михаил


Принцип работы CARP
Конфигурирование CARP
Включение поддержки CARP
Пример CARP
Расширенная конфигурация CARP
Принудительное понижение роли
Аббревиатура CARP расшифровывается как Common Address Redundancy Protocol. Основной целью этого протокола является использование одного IP адреса в пределах одного сегмента сети несколькими машинами. CARP является свободной, безопасной альтернативой протоколам Virtual Router Redundancy Protocol и Hot Standby Router Protocol.

CARP позволяет выделить группу хостов в сегменте сети и назначить ей один IP адрес. Такая группа называется "redundancy group" (группа избыточности). В пределах этой группы, один из хостов становится "главным", а остальные обозначаются как "резервные". В каждый момент времени мастер-хост отвечает на ARP-запросы к назначенному IP адресу и обрабатывает трафик, идущий к этому адресу. Каждый хост одновременно может принадлежать к нескольким группам.

Одним распространенным случаем использования CARP является создание избыточности на брандмауэрах. Виртуальный IP, который назначен на группу избыточности, указан на клиентских машинах в качестве шлюза по умолчанию. В случае отказа брандмауэра, выполняющего роль мастера, резервный брандмауэр возмет этот IP адрес и продолжит обслуживание клиентов.

При использовании CARP снижаются требования к аппаратному обеспечению отказоустойчивых систем. Дорогое оборудование окажется бессильным к выдернутому шнуру питания или перед администратором, случайно отправившим сервер в перезагрузку. CARP также облегчает процесс обновления программного обеспечения, так цикл обновления и перезагрузки прозрачен для пользователей, становится проще и процесс тестирования программного или аппаратного обеспечения - вы всегда можете положиться на резерв, пока не устраните проблему.

Однако, есть ситуации, когда CARP не может помочь. Дизайн CARP требует, чтобы члены одной группы физически находились в одной подсети с одним статическим IP адресом, хотя с введением директивы carpdev необходимости назначать адрес на физический интерфейс нет. Сервисы, требующие постоянного соединения с сервером (такие как SSH и IRC) не могут быть прозрачно переброшены в случае отказа и потребуют переподключения. CARP не может синхронизировать данные между приложениями.

CARP поддерживает IPv4 и IPv6.
Принцип работы CARP
Мастер-хост группы регулярно рассылает объявления по сети, с целью оповестить остальные машины группы, что он все еще работоспособен. В случае, если резервной машиной объявление не будет получено в течение заданного интервала, то она перехватывает функции мастер-хоста (та из них, которая имеет меньшие значения advbase и advskew). Это сделано для работы нескольких CARP-групп в пределах одного сегмента. Объявления CARP содержат Virtual Host ID, который позволяет членам группы идентифицировать, предназначено ли объявление для данной группы.

Для предотвращения спуфинга объявлений CARP, каждая группа может быть сконфигурирована на использование пароля. В этом случае, каждый CARP пакет в группе шифруется по алгоритму SHA1 HMAC.
Конфигурирование CARP
Каждая отказоустойчивая группа представлена виртуальным сетевым интерфейсом carp(4). Как следствие, CARP конфигурируется с помощью ifconfig(8). Доступны следущие опции:
carpN: имя виртуального интерфейса carp(4), где N - целое число, обозначающее номер интерфейса (например carp0).
vhid: Virtual Host ID. Уникальное число, которое используется для обозначения группы избыточности. Возможные значения лежат в диапазоне от 1 до 255. Это позволяет иметь несколько групп в пределах одной сети.
password: пароль, используемый для обмена сообщениями CARP. Должен быть одинаковым в пределах группы.
carpdev: опциональный параметр, указывающий на физический сетевой интерфейс, принадлежащий группе избыточности. По умолчанию, CARP будет пытаться использовать тот интерфейс, к которому присвоен адрес из той же подсети, что и на интерфейсе carp(4).
advbase: этот опциональный параметр определяет, как часто происходят объявления о членстве в группе избыточности. Значение по умолчанию - 1 секунда. Возможные значения лежат в диапазоне от 1 до 255.
advskew: этот опциональный параметр указывает, на сколько будет задержано обьявление advbase. Управляя параметром advbase, можно контролировать, какой хост станет мастером. Чем выше это число, тем меньше статус этого хоста. Значение по умолчанию - 0. Возможные значения лежат в диапазоне от 1 до 254.
state: перевести интерфейс carp(4) в определенное состояние. Может принимать значения init, backup и master.
ipaddress: адрес, назначенный группе избыточности. Данный адрес должен быть в одной сети с адресом на физическом интерфейсе (если он назначен).
mask: маска подсети группы.
Поведением CARP можно управлять с помощью sysctl(8).
net.inet.carp.allow: принимать входящие пакеты carp. Установлено по умолчанию.
net.inet.carp.preempt: позволяет виртуальным хостам резервировать друг друга. Эта функция используется для обеспечения отказоустойчивости в группе. Когда эта опция установлена и один из физических интерфейсов на котором выполняется carp теряет связь, advskew устанавливает значение 240 на всех carp интерфейсах. Хост, у которого advskew меньше назначается главным в группе и на него направляются пакеты до отказа интерфейса. По умолчанию выключено.
net.inet.carp.log: значение 0 отключает ведение журнального файла. Значение 1 фиксирует некорректные пакеты carp и состояние интерфейса. По умолчанию 0.
net.inet.carp.arpbalance: балансировка локального трафика используя ARP. по умолчанию выключено.
Включение поддержки CARP
По умолчанию, поддержка CARP не включена. Для использования carp(4) необходимо в ядре включить опцию carp. Убедитесь, что в файле конфигурации ядра присутствует следущая строка:

pseudo-device carp # CARP

После того, как строка была добавлена, пересоберите и установите ядро. После перезагрузки в системе будет поддержка carp(4).
Пример CARP
Пример конфигурации CARP:

# sysctl -w net.inet.carp.allow=1
# ifconfig carp0 create
# ifconfig carp0 vhid 1 pass lanpasswd
carpdev em0 advskew 100 10.0.0.1 255.255.255.0

Где мы выполнили:
Включили поддержку CARP (что, впрочем, и так есть по умолчанию)
Создали интерфейс carp(4).
Сконфигурировали carp0 на virtual host #1, установили пароль (lanpasswd), физическим интерфейсом назначили em0 и сделали этот хост резервным, установив advskew в 100 (при условии, что у мастера это значение меньше). Общим адресом для группы назначен 10.0.0.1/255.255.255.0
Воспользуемся командой ifconfig, чтобы проверить состояние интерфейса:

# ifconfig carp0
carp0: flags=8802 mtu 1500
carp: BACKUP carpdev em0 vhid 1 advbase 1 advskew 100
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255

Расширенная конфигурация CARP
В следующем примере мы создадим кластер из двух отказоустойчивых, высоконадежных брандмауэров. Схема соединения представлена ниже:

+----| WAN/Internet |----+
| |
em1| |em1
+-----+ +-----+
| fw1 | | fw2 |
+-----+ +-----+
em0| |em0
| |
---+-------Shared LAN-------+---

В данном случае, LAN подключена к em0 и WAN/Internet подключен к em1. Адреса назначены следующим образом:
Firewall 1 (fw1) em0: 172.16.0.1
Firewall 1 (fw1) em1: 192.0.2.1
Firewall 2 (fw2) em0: 172.16.0.2
Firewall 2 (fw2) em1: 192.0.2.2
Адреса, назначенные группе избыточности:
WAN/Internet Shared IP: 192.0.2.100
LAN Shared IP: 172.16.0.100
Считаем Firewall 1 (fw1) мастером. При этом его конфигурация будет выглядеть следующим образом:

#Enable preemption and group interface failover
# sysctl -w net.inet.carp.preempt=1

#Configure CARP on the LAN side
# ifconfig carp0 create
# ifconfig carp0 vhid 1 pass lanpasswd carpdev em0
172.16.0.100 255.255.255.0

#Configure CARP on the WAN side
# ifconfig carp1 create
# ifconfig carp1 vhid 2 pass wanpasswd carpdev em1
192.0.2.100 255.255.255.0

Конфигурация Firewall 2 (fw2) отличается установленным параметром advskew:

#Enable preemption and group interface failover
# sysctl -w net.inet.carp.preempt=1

#Configure CARP on the LAN side
# ifconfig carp0 create
# ifconfig carp0 vhid 1 pass lanpasswd carpdev em0
advskew 128 172.16.0.100 255.255.255.0

#Configure CARP on the WAN side
# ifconfig carp1 create
# ifconfig carp1 vhid 2 pass wanpasswd carpdev em1
advskew 128 192.0.2.100 255.255.255.0

Принудительное понижение роли
Могут быть моменты, когда мастер-хост должен быть принудительно переведен в резерв. Это могут быть случаи планового обслуживания или ремонта. Наша задача заключается в том, чтобы данная операция прошла безболезненно для пользователей.

Для этого необходимо просто погасить интерфейс carp(4) на мастер-хосте. Это заставит мастер-хост обьявлять себя с бесконечным advbase и advskew, что приведет к перехвату роли резервным хостом:

# ifconfig carp0 down

Обновлено: 13.03.2015