Задание очереди на основе отпечатка операционной системы

Глава 6 охватывала несколько способов использования spamd, позволяющих сократить

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

PF имеет довольно  надёжный механизм снятия отпечатка (fingerprinting)  операционной системы,  который  позволяет   определить  операционную   систему  на  другом  конце соединения, базируясь  на  характеристиках SYN  пакетов  передаваемых  на  начальной стадии установки соединения. Это может стать простой заменой spamd, при условии, что вы  определили, что  легитимная  почта  от  систем  работающих  на  данной  ОС  крайне маловероятна:

pass quick proto tcp from any os "Windows" to $ext_if port smtp queue smallpipe

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


Избыточность и отказоустойчивость: CARP и pfsync

Высокая надёжность и  непрерывность  обслуживания  –  одновременно  маркетинговые словечки   и  желанная  цель  для  IT  специалистов   и  сетевых   администраторов.   Для достижения этой осоннаной необходимости и решения  связанных  с ними проблем были созданы CARP и pfsync, добавленные в функционал OpenBSD 3.5.

Common Address Redundancy Protocol (CARP) был разработан в  качестве  не  связанной патентами    альтернативы    Virtual    Router    Redundancy    Protocol    (VRRP),    который просуществовал достаточно долго, чтобы стать санкционированным IETF стандартом, хотя его  патентные  проблемы  так  и  не  были  разрешены3.  Одна  из  главных  целей  CARP является   обеспечение   поддержки  нормального  функционирования   сети,  даже  при нарушении   работы  брандмауэра  или  другого  сервиса,   либо  в    период  сервисного обслуживания  оборудования  (например обновления).  В дополнение к CARP, был  создан протокол pfsync предназначенный для управления  синхронизацией  состояний PF между резервными узлами пакетных фильтров или шлюзами. Оба протокола предназначены для создания резервной сети с возможностью автоматической отказоустойчивости.

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

В   сущности   pfsync   является    виртуальным    сетевым    интерфейсом,    специально разработанным для синхронизации сведений о состояниях между брандмауэрами PF. Его интерфейсы   назначаются   на   физические   интерфейсы   с   использованием   ifconfig. настоятельно рекомендуется  устанавливать  pfsync на отдельные сети (или даже VLAN), даже  если  технически  возможно  одновременно  передавать  трафик  pfsync  с  прочим трафиком на регулярном интерфейсе. Основная  причина этой рекомендации  связана  с тем,  что  сам  pfsync  не  производит   никакой  проверки   подлинности   для  партнёров синхронизации,   и   гарантировать   корректную    синхронизацию   вы    можете   только использованием специальных интерфейсов для трафика pfsync.

Спецификация проекта: Резервированная пара шлюзов

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

преследовать следующие цели:

•     Сеть должна работать так же как и прежде.

•     Необходимо достичь лучшую доступность сервисов без заметных простоев.

•     Сеть должна обеспечивать изящный переход на резервный ресурс без прерывания активных соединений.

Начнём  с  относительно простой  сети  описанной в   главе  3, которая  изображена на рисунке 7-2.

Рисунок 7-2. Сеть с единственным шлюзом

Заменим  единственный  шлюз  резервированной  парой  шлюзов,  соединённых  общей частной  сетью  для  обмена  информацией  о  состояниях  путём  использования  pfsync. Должно получиться нечто похожее на рисунок 7-3.

Рисунок 7-3 Сеть с избыточным шлюзом.

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

смогли б связаться с резервными шлюзами (кроме как с хостов в сети которым назначены адреса на физические интерфейсы), до тех пор, пока они не станут главными в  грруппе резервирования и не примут на себя виртуальные IP адреса.

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

ПРЕДУПРЕЖДЕНИЕ

Когда вы переконфигурируете вашу сеть и адрес шлюза по умолчанию изменяется с закреплённого на определённом интерфейсе и хосте на виртуальный адрес, практически невозможно избежать временной потери связи.

Установка CARP

Большая часть  установки  CARP  заключается в   установке  кабельного  соединения (в соответствии со схемой вашей сети), установке значений sysctl и использовании команды ifconfig. Кроме того, на некоторых системах, вам необходимо  проверить, что ваше ядро скомпилировано с поддержкой необходимых устройств.

Проверка параметров ядра

На OpenBSD, устройства  CARP и pfsync присутствуют  в  конфигурации ядер  GENERIC и GENERIC.MP. Если вы работаете с ядром, в котором вы отключили эти опции, потребуется

переконфигурировать   ядро.   Пользователи   FreeBSD   должны   проверить,   что   ядро

скомпилировано  с устройствами  CARP и pfsync, поскольку используемое по  умолчанию, ядро GENERIC не поддерживает эти параметры. Обратитесь к руководству по FreeBSD для получения информации по сборке и установке ядра. Пользователи NetBSD, так же должны проверить,   что  ядро  скомпилировано   с   поддержкой  псевдо-устройства   CARP.  Ядро GENERIC  используемое  по   умолчанию  не  включает   поддержку  CARP.  Однако,  вы обнаружите  соответствующую  закоментированную  строку  в   конфигурационном  файле GENERIC, добавленную, для простоты подключения данной опции. В данное время NetBSD ещё  не  поддерживает  pfsync,  что  связано  с  неразрешённым  вопросами  в   протоколе нумерации, по крайней мере на момент написания этой главы.

Настройка значений                     sysctl

На   всех   CARP-совместимых   системах,   основные   функции   регулируются   кучкой переменных sysctl.  Одна  из  главных,  net.inet.carp.allow, включена  по  умолчанию. На типовой системе OpenBSD, вы увидите следующий вывод:

$ sysctl net.inet.carp.allow net.inet.carp.allow=1

Это говорит о том, что ваша система подготовлена к использованию CARP.

Если ваше ядро не сконфигурировано с CARP, данная команда предоставит вывод типа: sysctl: unknown oid ‘net.inet.carp.allow’ на FreeBSD или  sysctl:  third level name ‘carp’ in ‘net.inet.carp.allow’ is invalid на NetBSD.

Используйте следующую команду sysctl для просмотра всех  переменных  связанных  с CARP:

$ sysctl net.inet.carp net.inet.carp.allow=1 net.inet.carp.preempt=0 net.inet.carp.log=2

Примечание

В FreeBSD вы столкнётесь с переменной   net.inet.carp.suppress_preempt, которая имеет статус ‘только чтение’ и  показывает существование возможности упреждения. В системах с кодовой базой CARP основанной на OpenBSD 4.2 или более ранней, вы можете  обнаружить  переменную  net.inet.carp.arpbalance,  которая  используется  для   включения  балансировки  CARP  ARP предлагающей несколько ограниченные возможности балансировки нагрузки для хостов локальной сети.

Для  включения  отказоустойчивости  между  шлюзами  в   планируемой  установке,  нам необходимо установить переменную net.inet.carp.preempt:

$ sudo sysctl net.inet.carp.preempt=1

Установка  переменной net.inet.carp.preempt означает, что на хостах  имеющих более одного сетевого интерфейса, например таких, как наш шлюз, все интерфейсы CARP будут находиться между основным и резервным. Эта установка должна быть одинаковой на всех хостах в группе CARP. Данную настройку необходимо повторить на всех хостах. Переменная net.inet.carp.log устанавливает уровень отладки для журналирования CARP. Диапазон возможных значений – от 0 до 7. По умолчанию используется уровень 2, что означает внесение в журнал только изменения состояний CARP.

Настройка сетевого интерфейса с использованием ifconfig Рассматривая  схему сети, вы  можете заметить, что локальная сеть  использует адреса диапазона 192.168.12.0, в  то время как интерфейс выхода в Интернет находится в  сети 192.0.2.0. С  помощью  этих  диапазонов  адресов  и  имея  в   виду  интерфейс  CARP  по умолчанию, можно сообразить, какие  команды необходимы для создания виртуальных интерфесов.   Кроме  обычных   сетевых   параметров,   интерфейсы  CARP  требуют  один дополнительный    параметр:   идентификатор   виртуального    хоста   (vhid),   который однозначно идентифицирует интерфейсы для общих виртуальных IP адресов.

Предупреждение

vhid  представляет  собой  8-битную  величину,  которая  должна  быть  установлена  в  значение  уникальное  в  пределах широковещательного домена. Неверная настройка значения vhidможет привести к ряду различных сетевых проблем, которые трудно поддаются отладке. Существует неподтверждённая информация, что системы  избыточности и балансировки нагрузки основанные на VRRP используют идентификационную схему похожую на схему CARP, таким образом, могут возникать коллизии

ID с некоторыми связанными системами, что приведёт к нарушению работы.

На машине, которую вы  планируете установить  в   качестве  начальной  основной  для группы, следует использовать следующие команды:

$ sudo ifconfig carp0 192.0.2.19 vhid 1

$ sudo ifconfig carp1 192.168.1.1 vhid 2

Обратите  внимание,  что  нет  необходимости явно  указывать  физический  интерфейс. Виртуальные   интерфейсы   carp0   и   carp1   связаны   с   физическими   интерфейсами, настроеными с адресами в той же подсети, что и CARP адреса.

Примечание

В тех ситуациях, когда выбор фзического сетевого устройства для интерфейса CARP, в существующей конфигурации сети, не очевиден, вы можете добавить интерфейс carpdev в строке команды ifconfig. Это бывает полезно в некоторых не интуитивных конфигурациях, когда число свободных IP-адресов в соответствующей  сети  сильно ограничено. Во время написания данной главы CARP порт FreeBSD не предлагал варианта использования carpdev.

Используя ifconfig вы  можете проверить  корректность настройки каждого  интерфейса CARP:

$ ifconfig carp0

carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 lladdr 00:00:5e:00:01:01

carp: MASTER carpdev ep0 vhid 1 advbase 1 advskew 0 groups: carp

Обратите внимание, строка carp: отображает статус MASTER.

На резервной машине все настройки идентичны, за исключением добавления параметра

advskew:

$ sudo ifconfig carp0 192.0.2.19 vhid 1 advskew 100

$ sudo ifconfig carp1 192.168.1.1 vhid 2 advskew 100

Параметр advskew указывает, насколько предпочтительна данная машина при передаче функций основной.  Значение advskew в  паре с величиной advbase  используется хостом для расчёта интервала между объявлениями статуса главного хоста, функции которого он

на себя принимает. По умолчанию, значение advbase равно 1, а advskew  равно 0. В нашем   примере,   основной   хост   будет   формировать   объявления   каждую  секунду (1+0/256),  в    то  время   как  резервный   будет  ожидать   (1+100/256)  секунды.  При net.inet.carp.preempt=1, когда основной  хост  (master) прекращает объявления или его объявления  не  доступны,  резервный   (backup)  принимает  его  функции  на  себя  и становится  новым  основным  (новым  master’ом)  начиная  формировать  объявления  с заданной  скоростью.  Задание  меньших  значений  интервалов  для  advskew  позволяет повысить   вероятность   хоста  стать  новым   master’ом.  Если  несколько  хостов   имеют одинаковое значение advskew, только один из них получит статус мастера.

В OpenBSD 4.1 и далее, существует ещё один фактор, определяющий, какой хост примет на себя обязанности мастера CARP. Счётчик понижения (demotion  counter) – значение, объявляемое интерфейсу для каждого хоста CARP в качестве указания меры готовности интерфейса  CARP.  Когда  значение   данного   счётчика  0,  узел  находится  в    полной готовности;  более  высокие  значения  указывают  степень  его  деградации.  Вы  можете установить счётчик понижения непосредственно из командной строки, используя команду ifconfig  -g,  но  обычно,  значение  устанавливается  самой  системой  в   более  высокие значения в процессе загрузки системы. При прочих равных условиях, хост с самым низким значением счётчика будет преобладать при выборе мастера CARP.

Примечание

Во время написания этой главы, порт CARP FreeBSD не поддерживал установку счётчика понижения.

На  резервном  хосте, снова  используем ifconfig, чтобы  убедиться, что  каждый CARP интерфейс правильно сконфигурирован:

$ ifconfig carp0

carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 lladdr 00:00:5e:00:01:01

carp: BACKUP carpdev ep0 vhid 1 advbase 1 advskew 100 groups: carp

inet 192.0.2.19 netmask 0xffffff00 broadcast 192.0.2.255

inet6 fe80::200:5eff:fe00:101%carp0 prefixlen 64 scopeid 0x5

Результирующий вывод  несколько отличается. Обратите  внимание,  что  строка  carp: отображает статус BACKUP, наряду с параметрами advbase и  advskew. Для актуального использования,  вам  необходимо  добавить  меры  безопасности  защищающие  CARP  от несанкционированной  активности,  настроив  членов  группы CARP с общим, секретным паролем, например так4:

$ sudo ifconfig carp0 pass mekmitasdigoat 192.0.2.19 vhid 1

$ sudo ifconfig carp1 pass mekmitasdigoat 192.168.1.1 vhid 2

Предупреждение

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

После того как вы выяснили соответствующие настройки, вам необходимо сохранить их в соответствующих файлах директории /etc, чтобы использовать после перезагрузки:

•     На OpenBSD, установите параметры в hostname.carp0 и hostname.carp1

•     На FreeBSD и NetBSD добавьте соответствующие строки в файл rc.conf, содержащие

значения переменных ifconfig_carp0= и ifconfig_carp1=.

Источник: Книга о PF, by Peter N.M. Hansteen, Перевод выполнил Михайлов Алексей aka iboxjo

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий