введение в Common Address Redundancy Protocol
Основной целью Common Address Redundancy Protocol (CARP ) является использование одного 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
Мастер-хост группы регулярно рассылает объявления по сети, с целью оповестить остальные машины группы, что он все еще работоспособен. В случае, если резервной машиной объявление не будет получено в течение заданного интервала, то она перехватывает функции мастер-хоста.
Объявления CARP содержат Virtual Host ID, который позволяет членам группы идентифицировать, предназначено ли объявление для данной группы. Для предотвращения спуфинга объявлений CARP, каждая группа может быть сконфигурирована на использование пароля. В этом случае, каждый CARP пакет в группе шифруется по алгоритму SHA1 HMAC.
конфигурирование CARP
Потренируемся настраивать CARP на примере NetBSD.
Итак, каждая отказоустойчивая группа представлена виртуальным сетевым интерфейсом carp. Как следствие, CARP конфигурируется с помощью ifconfig. Доступны следущие опции:
- carpN - имя виртуального интерфейса carp(4), где N - целое число, обозначающее номер интерфейса (например carp0);
- vhid - Virtual Host ID. Уникальное число, которое используется для обозначения группы избыточности. Возможные значения лежат в диапазоне от 1 до 255. Это позволяет иметь несколько групп в пределах одной сети;
- password - пароль, используемый для обмена сообщениями CARP. Должен быть одинаковым в пределах группы;
- carpdev - опциональный параметр, указывающий на физический сетевой интерфейс, принадлежащий группе избыточности. По умолчанию, CARP будет пытаться использовать тот интерфейс, к которому присвоен адрес из той же подсети, что и на интерфейсе carp;
- advbase - этот опциональный параметр определяет, как часто происходят объявления о членстве в группе избыточности. Значение по умолчанию - 1 секунда. Возможные значения лежат в диапазоне от 1 до 255;
- advskew - этот опциональный параметр указывает, насколько будет задержано обьявление advbase. Управляя параметром advbase, можно
контролировать, какой хост станет мастером. Чем выше это число, тем меньше статус этого хоста. Значение по умолчанию - 0. Возможные значения лежат в диапазоне от 1 до 254;
- state - перевести интерфейс carp в определенное состояние. Может принимать значения init, backup и master;
- ipaddress - адрес, назначенный группе избыточности. Данный адрес должен быть в одной сети с адресом на физическом интерфейсе (если он назначен);
- mask - маска подсети группы.
Поведением CARP можно управлять с помощью sysctl.
- 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 необходимо в ядре включить опцию carp. Убедитесь, что в файле конфигурации ядра присутствует следущая строка:
pseudo-device carp # CARP
После того, как строка была добавлена, пересоберите и установите ядро. После перезагрузки в системе будет поддержка 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;
- сконфигурировали 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
В следующем примере мы создадим кластер из двух отказоустойчивых, высоконадежных файрволлов. Схема соединения представлена на рис. 1.
Рис. 1.
В данном случае 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) мастером. При этом его конфигурация будет выглядеть следующим образом:
sysctl -w net.inet.carp.preempt=1
ifconfig carp0 create
ifconfig carp0 vhid 1 pass lanpasswd carpdev em0 172.16.0.100 255.255.255.0
ifconfig carp1 create
ifconfig carp1 vhid 2 pass wanpasswd carpdev em1 192.0.2.100 255.255.255.0
Конфигурация Firewall 2 (fw2) отличается установленным параметром advskew:
sysctl -w net.inet.carp.preempt=1
ifconfig carp0 create
ifconfig carp0 vhid 1 pass lanpasswd carpdev em0 advskew 128 172.16.0.100 255.255.255.0
ifconfig carp1 create
ifconfig carp1 vhid 2 pass wanpasswd carpdev em1 advskew 128 192.0.2.100 255.255.255.0
принудительное понижение роли
Могут быть моменты, когда мастер-хост должен быть принудительно переведен в резерв. Это могут быть случаи планового обслуживания или ремонта. Наша задача заключается в том, чтобы данная операция прошла безболезненно для пользователей.
Для этого необходимо просто погасить интерфейс carp на мастер-хосте. Это заставит мастер-хост обьявлять себя с бесконечным advbase и advskew, что приведет к перехвату роли резервным хостом:
ifconfig carp0 down
Сгибнев Михаил
Распространенным случаем использования CARP является создание избыточности на файрволлах. Виртуальный IP, который назначен на группу избыточности, указан на клиентских машинах в качестве шлюза по умолчанию. В случае отказа файрволла, выполняющего роль мастера, резервный файрволл возмет этот IP-адрес и продолжит обслуживание клиентов.
При использовании CARP снижаются требования к аппаратному обеспечению отказоустойчивых систем. Дорогое оборудование окажется бессильным к выдернутому шнуру питания или перед администратором, случайно отправившим сервер в перезагрузку. CARP также облегчает процесс обновления программного обеспечения, так цикл обновления и перезагрузки прозрачен для пользователей. Становится проще и процесс тестирования программного или аппаратного обеспечения - вы всегда можете положиться на резерв, пока не устраните проблему.
Однако есть ситуации, когда CARP не может помочь. Дизайн CARP требует, чтобы члены одной группы физически находились в одной подсети с одним статическим IP-адресом, хотя с введением директивы carpdev необходимости назначать адрес на физический интерфейс нет. Сервисы, требующие постоянного соединения с сервером (такие, как SSH и IRC) не могут быть прозрачно переброшены в случае отказа и потребуют переподключения. CARP не может синхронизировать данные между приложениями.
CARP поддерживает IPv4 и IPv6.
принцип работы CARP
Мастер-хост группы регулярно рассылает объявления по сети, с целью оповестить остальные машины группы, что он все еще работоспособен. В случае, если резервной машиной объявление не будет получено в течение заданного интервала, то она перехватывает функции мастер-хоста.
Объявления CARP содержат Virtual Host ID, который позволяет членам группы идентифицировать, предназначено ли объявление для данной группы. Для предотвращения спуфинга объявлений CARP, каждая группа может быть сконфигурирована на использование пароля. В этом случае, каждый CARP пакет в группе шифруется по алгоритму SHA1 HMAC.
конфигурирование CARP
Потренируемся настраивать CARP на примере NetBSD.
Итак, каждая отказоустойчивая группа представлена виртуальным сетевым интерфейсом carp. Как следствие, CARP конфигурируется с помощью ifconfig. Доступны следущие опции:
- carpN - имя виртуального интерфейса carp(4), где N - целое число, обозначающее номер интерфейса (например carp0);
- vhid - Virtual Host ID. Уникальное число, которое используется для обозначения группы избыточности. Возможные значения лежат в диапазоне от 1 до 255. Это позволяет иметь несколько групп в пределах одной сети;
- password - пароль, используемый для обмена сообщениями CARP. Должен быть одинаковым в пределах группы;
- carpdev - опциональный параметр, указывающий на физический сетевой интерфейс, принадлежащий группе избыточности. По умолчанию, CARP будет пытаться использовать тот интерфейс, к которому присвоен адрес из той же подсети, что и на интерфейсе carp;
- advbase - этот опциональный параметр определяет, как часто происходят объявления о членстве в группе избыточности. Значение по умолчанию - 1 секунда. Возможные значения лежат в диапазоне от 1 до 255;
- advskew - этот опциональный параметр указывает, насколько будет задержано обьявление advbase. Управляя параметром advbase, можно
контролировать, какой хост станет мастером. Чем выше это число, тем меньше статус этого хоста. Значение по умолчанию - 0. Возможные значения лежат в диапазоне от 1 до 254;
- state - перевести интерфейс carp в определенное состояние. Может принимать значения init, backup и master;
- ipaddress - адрес, назначенный группе избыточности. Данный адрес должен быть в одной сети с адресом на физическом интерфейсе (если он назначен);
- mask - маска подсети группы.
Поведением CARP можно управлять с помощью sysctl.
- 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 необходимо в ядре включить опцию carp. Убедитесь, что в файле конфигурации ядра присутствует следущая строка:
pseudo-device carp # CARP
После того, как строка была добавлена, пересоберите и установите ядро. После перезагрузки в системе будет поддержка 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;
- сконфигурировали 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
В следующем примере мы создадим кластер из двух отказоустойчивых, высоконадежных файрволлов. Схема соединения представлена на рис. 1.
+----| WAN/Internet |----+
| |
em1| |em1
+-----+ +-----+
| fw1 | | fw2 |
+-----+ +-----+
em0| |em0
| |
---+-------Shared LAN-------+---
Рис. 1.
В данном случае 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) мастером. При этом его конфигурация будет выглядеть следующим образом:
sysctl -w net.inet.carp.preempt=1
ifconfig carp0 create
ifconfig carp0 vhid 1 pass lanpasswd carpdev em0 172.16.0.100 255.255.255.0
ifconfig carp1 create
ifconfig carp1 vhid 2 pass wanpasswd carpdev em1 192.0.2.100 255.255.255.0
Конфигурация Firewall 2 (fw2) отличается установленным параметром advskew:
sysctl -w net.inet.carp.preempt=1
ifconfig carp0 create
ifconfig carp0 vhid 1 pass lanpasswd carpdev em0 advskew 128 172.16.0.100 255.255.255.0
ifconfig carp1 create
ifconfig carp1 vhid 2 pass wanpasswd carpdev em1 advskew 128 192.0.2.100 255.255.255.0
принудительное понижение роли
Могут быть моменты, когда мастер-хост должен быть принудительно переведен в резерв. Это могут быть случаи планового обслуживания или ремонта. Наша задача заключается в том, чтобы данная операция прошла безболезненно для пользователей.
Для этого необходимо просто погасить интерфейс carp на мастер-хосте. Это заставит мастер-хост обьявлять себя с бесконечным advbase и advskew, что приведет к перехвату роли резервным хостом:
ifconfig carp0 down
Сгибнев Михаил
Сетевые решения. Статья была опубликована в номере 11 за 2006 год в рубрике технологии