headermask image

Создание отказоустойчивого брандмауэра на OpenBSD с использованием CARP и pfsync

1. Введение

Брандмауэр является одними из самых критичных компонентов сети, так как при выходе его из строя, мы потеряем доступ к внешнему миру. Помимо того, что станут недоступны наши внешние сервисы (http, mail и т.д.), так мы еще и потеряем возможность бродить по разным Интернетам!

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

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

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

  • OpenBSD – ну, в принципе понятно, что это безопастно, надежно и практично
  • Packet Filter (PF) – система пакетной фильтрации и NAT
  • CARP (Common Address Redundancy Protocol) – протокол, обеспечивающий отказоустойчивость путем соединения нескольких машин виртуальным интерфейсом и отображающий их для стороннего наблюдателя как одна машина
  • pfsync – протокол синхронизации таблиц состояний PF между несколькими брандмауэрами

Было бы желательно иметь с вашей стороны хорошие знания OpenBSD и PF, так как мы не будем заострять внимание на таких темах, как синтаксис команд и правила обслуживания PF. Так или иначе, данная статья содержит некоторые полезные ссылки для того, чтобы покопаться в этих темах.

2. Схема сети

Сперва посмотрим на окружающую нас действительность. В данном случае мы будем работать с очень простой и “классической” моделью:

  • DMZ (172.16.240.0/24), содержащей внешние сервисы и сенсор системы обнаружения вторжений
  • LAN (172.16.0.0/24), содержащей рабочие станции пользователей и серверы, не доступные извне
  • Маршрутизатор, расположенной в маленькой сеточке (172.16.250.0/24), соединяющий нас с Интернет

net.jpg

Так как в данной топологии у нас две группы брандмауэров, то это позволит нам рассмотреть две различные конфигурации. Использование нескольких групп имеет следующие преимущества:

  • В случае компрометации брандмауэра, LAN будет защищена дополнительным уровнем фильтрации (хотя было бы предпочтительно использовать различные платформы для брандмауэра, чтобы препятствовать тому, что нападавшие поставили под угрозу внутренние брандмауэры используя ту же уязвимость [MISC17])
  • Один, хоть и кластеризованный брандмауэр для LAN и DMZ является одной точкой отказа
  • На каждом брандмауэре правила применяются только к ЛВС или DMZ, таким образом делая набор правил PF более понятным и более легким в поддержке

3. Базовая конфигурация

Давайте бросим беглый взгляд на основную конфигурацию системы, которая относится ко всем нашим брандмауэрам.

Мы не будем рассматривать вопрос установки системы, который очень подробно изложен на сайте OpenBSD. Единственное (очевидное) замечание заключается в том, что вы должны установить только голый минимум, чтобы препятствовать тому, что безопасность и надежность брандмауэра ставились под угрозу ненужным программным обеспечением. Поэтому, во время установки вы только должны выбрать только те наборы, которые отмеченны как “Required” в документации: bsd, baseXX.tgz, etcXX.tgz.

Спонсор поста:

Лучшие аркадные игры бесплатно.

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

После первой перезагрузки мы можем начать настраивать некоторые файлы конфигурации; по умолчанию, OpenBSD идет с с некоторыми сервисами, включенными в inetd(8):

    $ grep -v ^# /etc/inetd.conf
    
    ident           stream  tcp     nowait  _identd /usr/libexec/identd     identd -el
    
    ident           stream  tcp6    nowait  _identd /usr/libexec/identd     identd -el
    
    127.0.0.1:comsat dgram  udp     wait    root    /usr/libexec/comsat     comsat
    
    [::1]:comsat    dgram   udp6    wait    root    /usr/libexec/comsat     comsat
    
    daytime         stream  tcp     nowait  root    internal
    
    daytime         stream  tcp6    nowait  root    internal
    
    time            stream  tcp     nowait  root    internal
    
    time            stream  tcp6    nowait  root    internal
    
    $

Систему считают безопасной также с этими включенными сервисами; так или иначе, выведение из строя их всех не нанесет нам никакого вреда.

Хорошей практикой будет редактирование файла /etc/motd, в котором можно указать некоторую информацию о системе и предупредить пользователей, что все попытки доступа регистрируется и что любой несанкционированный доступ будет преследоваться по суду (см. [PUIS]).

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

  • /etc/hostname.if(5) – содержит информацию о сетевых интерфейсах
  • /etc/mygate(5) – содержит адрес шлюза по умолчанию
  • /etc/myname(5) – содержит имя (FQDN) машины
  • /etc/resolv.conf(5) – содержит информацию о DNS, доменах и т.д.

Учитывая большое количество атак, основанных на уязвимостях в системе DNS, предпочтительно не использовать эту систему, а внести адреса наиболее критических систем в файл /etc/hosts(5). Чтобы убедиться, что файл /etc/hosts(5) имеет больший приоритет, по сравнению с DNS, посмотрите файл /etc/resolv.conf(5):

    lookup file bind

Пакетная фильтрация по умолчанию выключена, поэтому нам необходимо отредактировать (или создать) файл /etc/rc.conf.local(8, в котром установить переменной pf значение, отличное от NO. Так же вы можете изменить наименование файла конфигурации (по умолчанию /etc/pf.conf):

    pf=""
    
    pf_rules=/new/path/to/pf.conf

Так же вы можете установить флаг pflogd(8) в переменной pflogd_flags. И не забудьте включить IP форвардинг!

    # sysctl net.inet.ip.forwarding=1
    
    net.inet.ip.forwarding: 0 -> 1
    
    #

Чтобы изменеия действовали после загрузки, раскомментируйте строку в /etc/sysctl.conf(5):

    net.inet.ip.forwarding=1

4. Протокол CARP

CARP (Common Address Redundancy Protocol) обеспечивает резервирование системы, состоящей из нескольких хостов, находящихся в одном сетевом сегменте (redundancy group) и имеющей общий IP адрес, при этом, в случае отказа одного из хостов, доступность общего адреса обеспечивают другие члены группы. CARP также позволяет разделить нагрузку между хостами.

Создание избыточных брандмауэров является является лишь частным случаем использования CARP. Этот протокол может использоваться, чтобы гарантировать непрерывность обслуживания и/или распределение нагрузки сервисов сети.

Первоначально, группа разработчиков OpenBSD хотела сделать открытую реализацию протоколов стандарта IETF, VRRP (Virtual Router Redundancy Protocol), определенный в RFC3768, и HSRP (Hot Standby Router Protocol), определенный в RFC2281. Но Cisco, опираясь на патентное право, “категорически заявила сообществу OpenBSD, что будет защищать свои патенты на VRRP”, вынуждая, таким образом, разработчиков OpenBSD создать новый протокол, существенно отличающийся от VRRP.

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

С определенным, задаваемым, интервалом, master объявляет о себе с помощью IP протокола 112. В случае аго отказа, функцию рассылки объявлений берет на себя другой хост группы. Выбор master осуществляется на основании большего количества выдаваемых за период времени объявлений. При возвращении прежнего master-a, функция рассылки объявлений возвращается к нему.

Как вы могли заметить, CARP только создает и управляет виртуальными интерфейсами. Для синхронизации же данных между хостами системный администратор должен использовать pfsync, rsync или какой другой протокол.

4.1 Параметры конфигурации

Конфигурирование CARP происходит с помощью команд sysctl и ifconfig. Для sysctl есть три доступных переменных:

  • net.inet.carp.allow – определяет, будет ли хост обрабатывать пакеты CARP. По умолчанию – обрабатывать будет.
  • net.inet.carp.log – регистрация ошибок CARP. Может иметь значения от 0 до 7, соответствуюя стандартынм уровням syslog(3). По умолчанию имеет значение 2
  • net.inet.carp.preempt – если установлено в 0 (по умолчанию), то получив объявление от master, хост не будет учавствовать в выборах нового master. В противном случае, если период рассылки объявлений у хоста меньше, чем у текущего master, хост становится новым master. Эта опция таже позволяет объявить об отказе всех сетевых интерфейсов, при отказе одного из них. Фактически, если отказывает один из CARP-enabled интерфейсов, то CARP изменит значение advskew на 240 на остальных CARP-enabled интерфейсах, инициируя таким образом выборы нового master во всех подсетях, к которым был подключен хост.

Синтаксис команды ifconfig, при конфигурации CARP, выглядит следующим образом:

      ifconfig carpN create  ifconfig carpN [advbase n] [advskew n] [balancing mode] 
    
      [carpnodes vhid:advskew,vhid:advskew,...] [carpdev iface] 
    
      [[-]carppeer peer_address] [pass passphrase] [state state] [vhid host-id]
  • carpN – имя виртуального carp интерфейса
  • advbase, advskew – эти параметры задают временной интервал между посылками объявлений. Этот интервал (в секундах) вычисляется по формуле (advbase + (advskew / 255)). Увеличение advbase уменьшит сетевой трафик, но увеличит время выбора нового master-a. Маленькие значения advskew позволяют хосту чаще давать объявления, увеличивая вероятность стать master. advbase должен иметь значения от 1 до 255, advskew между 0 (значение по умолчанию) до 254.
  • balancing – устанавливает режим балансировки. Доступными режимами являются arp, ip, ip-stealth и ip-unicast.
  • carpnodes- Разделенный запятыми список пар vhid:advskew, определяющий как будет распределяться загрузка между хостами
  • carpdev – определяет физический интерфейс, который принадлежит данной группе. По умолчанию, CARP использует физический интерфейс, который принадлежит той же самой подсети, что и виртуальный интерфейс.
  • carppeer – позволяет указать IP адрес пиров, вместо использования multicast.
  • pass – пароль, используемый для общения хостов внутри группы.
  • state – перевод интерфейса в указанное состояние (init, backup или master)
  • vhid – Virtual Host ID. Это уникальный номер от 1 до 255, идентифицирующий отказоустойчивую группу

4.1.1 Счетчик понижения

Помимо начальной конфигурации, с помощью ifconfig(8) можно изменить значение demotion counter, который позволяет указать, насколько хост готов стать master-ом группы. (чем выше значение счетчика, тем хост менее готов). Давайте рассмотрим данный вопрос поподробней.

Все интерфейсы CARP разделены на группы (по умолчанию, интерфейсы carp(4) принадлежат группе “carp”) и каждой группе назначен demotion counter, значение которого можно посмотреть командой:

    $ ifconfig -g carp
    
    carp: carp demote count 0

Данный счетчик необходим с следующих случаях:

  • Вы хотите воспрепятствовать выборам хоста в качестве мастера, например, на время его загрузки. Скрипт rc(8) может увеличить demotion counter на 128 до поднятия сетевых интерфейсов и снизить его после настройки сетевых интерфейсов и запуска необходимых сервисов (demotion counter не может быть установлен в абсолютную величину, только увеличен или уменьшен на определенное значение).
      ifconfig -g carp carpdemote 128
      
      [ ... ]
      
      ifconfig -g carp -carpdemote 128
  • Вы хотите ограничить число отказоустойчивых интерфейсов carp(4) (а не всех, что происходит, когда установлен preempt). В следующем примере мы сделаем отказоустойчивыми интерфейсы carp1 и carp2, оставив остальные интерфейсы без изменеий:
      # ifconfig carp1 group morituri
      
      # ifconfig carp2 group morituri
      
      # ifconfig morituri
      
      carp1: flags=8843 mtu 1500
      
              carp: MASTER carpdev sis0 vhid 1 advbase 1 advskew 100
      
              groups: carp morituri
      
              inet 1.2.3.4 netmask 0xffffff00 broadcast 1.2.3.255
      
      carp2: flags=8843 mtu 1500
      
              carp: MASTER carpdev sis1 vhid 2 advbase 1 advskew 100
      
              groups: carp morituri
      
              inet 2.3.4.5 netmask 0xffffff00 broadcast 2.3.4.255
      
      # ifconfig -g morituri
      
      morituri: carp demote count 0
      
      # ifconfig -g morituri carpdemote 50
      
      # ifconfig -g morituri
      
      morituri: carp demote count 50
      .

4.1.2 Балансировка нагрузки

CARP предоставляет два различных способа балансировки нагрузки входящего трафика: ARP balancing и IP balancing.

Оба метода требуют предварительного создания группы балансировки на каждом хосте, с несколькими carp(4) интерфейсами, имеющих один IP адрес, но различные VHID. Все ноды carp(4) в группе формируются одинаково, за исключением различного advskew, чтобы сделать каждый хост мастером на разных VHID (пример см. ниже).

ARP balancing работает путем наложения hash-функции на MAC адрес источника для определения VHID, который должен ответить на запрос. На запрос ARP ответит только тот хост, который является master-ом для данного VHID. ARP load balancing может быть включена через ifconfig(8), установив значение “arp” функции балансировки:

    # ifconfig carp0 balancing arp carpnodes 1:0,2:100

IP load balancing работает очень похоже на ARP balancing, но использует hash-функцию адресов источника и назначения для определения, какой VHID (и какой хост, соответственно) ответит на запрос.

Требованием IP balancing является необходимость получения пакета всеми хостами группы. Включается данный тип балансировки с помощью команды ifconfig(8), установкой опции “ip”. Таким образом, мы заставляем CARP использовать multicast MAC адрес для отправки трафика на все хосты группы:

    # ifconfig carp0 balancing ip carpnodes 1:0,2:100

В качестве альтернативы, вы можете установить значение функции балансировки в “ip-stealth”, чтобы запретить master-у посылать пакеты со своим действительным адресом MAC в качестве источника. Таким образом мы предотвратим обучение коммутатора и продолжим рассылать широковещательные пакеты. Наконец, если у вас слишком умный коммутатор, то можете установить значение опции балансировки в “ip-unicast”.

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

4.2 Входные данные

Пришло время настраивать CARP на наших брандмауэрах. В данной статье мы используем две сильно различающиеся конфигурации CARP, где внутренний брандмауэр (Mickey и Minnie, между LAN и DMZ) работает в режиме active/stand-by (трафик идет только через один хост, а второй находится в горячем резерве), а внешний брандмауэр (Donald и Daisy, отделяет DMZ от internet) работает в режиме балансировки нагрузки.

Mickey

  • LAN 172.16.0.200
  • DMZ 172.16.240.200
  • pfsync 192.168.2.200

Minnie

  • LAN 172.16.0.201
  • DMZ 172.16.240.201
  • pfsync 192.168.2.201

Virtual address

  • LAN 172.16.0.202
  • DMZ 172.16.240.202

Donald

  • LAN 172.16.240.100
  • DMZ 172.16.250.100
  • pfsync 192.168.1.100

Daisy

  • LAN 172.16.240.101
  • DMZ 172.16.250.101
  • pfsync 192.168.1.101

Virtual address

  • LAN 172.16.240.102
  • DMZ 172.16.250.102

4.2.1 Active/standby конфигурация

Начнем с Mickey и Minnie: сперва, с помощью ifconfig(8) создадим устройства carp*

    mickey# ifconfig carp0 172.16.0.202/24 vhid 1 pass password1 advbase 1 advskew 0
    
    mickey# ifconfig carp1 172.16.240.202/24 vhid 2 pass password2 advbase 1 advskew 0minnie# ifconfig carp0 172.16.0.202/24 vhid 1 pass password1 advbase 1 advskew 100
    
    minnie# ifconfig carp1 172.16.240.202/24 vhid 2 pass password2 advbase 1 advskew 100

Мы только что создали интерфейсы, назначили им IP адрес, присвоили VHID (1 для LAN, 2 для DMZ) и пароль (не самый безопасный). Так же мы решили, что Mickey будет master (присвоив Minnie более высокое значение advskew, таким образом делая интервал между объявлениями (1 + 100 / 255) выше чем интервал между объявлениями Mickey’s (1 + 0 / 255)).

Кроме того, установив переменную net.inet.carp.preempt в “1″ на Mickey, мы заставим его всегда пытаться стать master.

    mickey# sysctl net.inet.carp.preempt=1
    
    net.inet.carp.preempt: 0 -> 1

Для того, чтобы наши изменения не пропали после загрузки, необходимо внести в файлы /etc/hostname.carp* и /etc/sysctl.conf следущее:

Mickey:

    /etc/hostname.carp0
    
    inet 172.16.0.202 255.255.255.0 172.16.0.255 vhid 1 pass password1 advbase 1 advskew 0/etc/hostname.carp1
    
    inet 172.16.240.202 255.255.255.0 172.16.240.255 vhid 2 pass password2 advbase 1 advskew 0
    
    /etc/sysctl.conf
    
    [...]
    
    net.inet.carp.preempt=1

Minnie:

    /etc/hostname.carp0
    
    inet 172.16.0.202 255.255.255.0 172.16.0.255 vhid 1 pass password1 advbase 1 advskew 100/etc/hostname.carp1
    
    inet 172.16.240.202 255.255.255.0 172.16.240.255 vhid 2 pass password2 advbase 1 advskew 100

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

4.2.2 Active/active конфигурация

Настал черед Donald и Daisy, на которых мы сконфигурируем интерфейсы, смотрящие в DMZ. Как и предыдущем примере, создаем устройства carp0 на каждом хосте зададим опцию carpnodes для назначения различных Virtual Host IDs на интерфейсы (vhids 3 и 4).

На vhid 3 мы установим значения advskew для Donald и Daisy в 0 и 100 соответственно, что позволит выступать хосту Donald в роли мастера. Для vhid 4 значения меняются на обратные, назначая, таким образом, Daisy мастером для vhid 4:

    donald# ifconfig carp0 172.16.240.102/24 balancing ip carpnodes 3:0,4:100 
    
    > pass password3
    
    donald# sysctl net.inet.carp.preempt=1
    
    net.inet.carp.preempt: 0 -> 1daisy# ifconfig carp0 172.16.240.102/24 balancing ip carpnodes 3:100,4:0 
    
    > pass password3
    
    daisy# sysctl net.inet.carp.preempt=1
    
    net.inet.carp.preempt: 0 -> 1

Теперь мы имеем две отказоустойчивые группы с разными мастерами и одним IP адресом.

    donald# ifconfig carp0
    
    carp0: flags=8843 mtu 1500
    
            lladdr 01:00:5e:00:01:01
    
            carp: carpdev rl1 advbase 1 balancing ip
    
                    state MASTER vhid 3 advskew 0
    
                    state BACKUP vhid 4 advskew 100
    
            groups: carp
    
            inet 172.16.240.102 netmask 0xffffff00 broadcast 172.16.240.255
    
            inet6 fe80::2c0:a8ff:fe8e:b112%carp0 prefixlen 64 scopeid 0x5daisy# ifconfig carp0
    
    carp0: flags=8843 mtu 1500
    
            lladdr 01:00:5e:00:01:01
    
            carp: carpdev rl1 advbase 1 balancing ip
    
                    state BACKUP vhid 3 advskew 100
    
                    state MASTER vhid 4 advskew 0
    
            groups: carp
    
            inet 172.16.240.102 netmask 0xffffff00 broadcast 172.16.240.255
    
            inet6 fe80::219:d2ff:fe02:6469%carp0 prefixlen 64 scopeid 0x5
    
    
    
    

Дабы не потерять сделанное при перезагрузке, редактируем файлы:

Donald:

    /etc/hostname.carp0
    
    inet 172.16.240.102 255.255.255.0 172.16.240.255 balancing ip carpnodes 3:0,4:100 pass password3/etc/sysctl.conf
    
    [...]
    
    net.inet.carp.preempt=1
    
    /etc/hostname.carp1
    
    inet 172.16.250.102 255.255.255.0 172.16.250.255 balancing ip carpnodes 5:0,6:100 pass password5

Daisy:

    /etc/hostname.carp0
    
    inet 172.16.240.102 255.255.255.0 172.16.240.255 balancing ip carpnodes 3:100,4:0 pass password3/etc/sysctl.conf
    
    [...]
    
    net.inet.carp.preempt=1
    
    /etc/hostname.carp1
    
    inet 172.16.250.102 255.255.255.0 172.16.250.255 balancing ip carpnodes 5:100,6:0 pass password5

Хотя в вышеприведенном примере всего две машины, данная конфигурация может быть легко расширена до 32 хостов. Распределение нагрузки, как бы вам не хотелось, вряд ли достигнет соотношения 50/50 – это связано с тем, что мы используем хэш адресов источника и назначения, а не объем трафика.

5. Протокол pfsync

Pfsync – это протокол, используемый пакетным фильтромдля управления и обновления таблиц состояния для stateful inspection и NAT. По умолчанию, сообщения о смене состояния рассылаются через синхронизационный интерфейс с помощью IP multicast пакетов. При этом используется IP protocol 240 и multicast-группа 224.0.0.240. Мы реализуем данную схему синхронизации таблиц состояний для получения отказоустойчивого решения, когда переход на новый master происходит без разрыва сессий клиентов.

pfsync(4) является также названием псевдоустройства, через которое происходит синхронизация таблиц (кроме состояний, созданных правилами, помеченных флагом no-sync или пакетов pfsync(4)) pfsync(4) может быть сконфигурирован на физическом интерфейсе, чтобы синхронизировать таблицы нескольких брандмауэров.

Физический синхронизационный интерфейс может быть настроен с помощью команды ifconfig(8), используя параметр syncdev. Для примера, на вашем брандмауэре вы можете выполнить команду:

    # ifconfig pfsync0 syncdev rl2

Предполагаем, что интерфейс rl2 на обоих хостах находится в сети 192.168.1.0/24 (для Mickey и Minnie) или 192.168.2.0/24 (для Donald и Daisy) и брандмауэры соединены между собой “кривым(обратным)” патчкордом.

Использование “обратного” патчкорда рекомендуется потому, что pfsync не поддерживает механизмы шифрации или авторизации, поэтому при работе через коммутатор эти пакеты могут быть перехвачены злоумышленником.

В качестве альтернативы, вы можете использовать ключевое слово syncpeer для указания адреса брандмауэра, с которым осуществляется синхронизация. Система будет использовать этот адрес вместо рассылки широковещательных пакетов и вы можете использовать IPsec для защиты трафика. В случае использования syncdev вы должны иметь поддержку псевдоустройства enc(4) для инкапсуляции/деинкапсуляции трафика ipsec(4).

    # ifconfig pfsync0 syncpeer 192.168.1.101 syncdev enc0

Для того, чтобы изменения не пропали после перезагрузки, внесите данные в файл /etc/hostname.pfsync0:

    up syncdev rl2

6. Правила PF

Воздействие CARP и pfsync на правила пакетного фильтра минимально. Для начала, нужно разрешить трафик этих протоколов:

    pass quick on rl2 proto pfsync keep state (no-sync)
    
    pass on { rl0, rl1 } proto carp keep state (no-sync)

При написании правил, имейте в виду, что с точки зрения pf(4) трафик движется через физический интерфейс. Поэтому в случае:

    pass in on $ext_if [...]

вы должны обращаться к физическому, а не к виртуальному интерфейсу.

С другой стороны, виртуальный адрес связан с интерфейсом CARP, таким образом вы можете обратиться к нему, если на брандмауэре запущены какие либо сервисы на виртуальном адресе.

    # SSH on the virtual interface
    
    pass in on $int_if inet proto tcp from $int_if:network to carp0 port ssh

Или делать NAT через перенаправление:

    # Mail server accessible from the internet
    
    rdr on $ext_if inet proto tcp from any to carp2 port $mail_ports -> $mail_srv

В любом случае, CARP прозрачен для pf(4), что касается и услуг, предлагаемых брандмауэром на его физических адресах:

    # SSH on the physical address
    
    pass in on $int_if inet proto tcp from $int_if:network to $int_if port ssh

Или для нормальной фильтрации:

    # External DNS
    
    pass in  on $int_if inet proto { tcp, udp } from $int_if:network to $dns_srv 
    
         port domain
    
    pass out on $ext_if inet proto { tcp, udp } from $ext_if to $dns_srv 
    
         port domain

В качестве примера, приведем правила фильтрации для наших внешних брандмауэров, Donald и Daisy:

    /etc/pf.conf################################################################################
    
    # Macros and lists                                                             #
    
    ################################################################################
    
    ext_if  = rl0                           # External interface
    
    int_if  = rl1                           # DMZ interface
    
    pfs_if  = rl2                           # Pfsync interface
    
    carp_if = carp1                         # External CARP interface
    
    mail_srv = "mail.kernel-panic.it"                               # Mail server
    
    web_srv  = "{ www1.kernel-panic.it, www2.kernel-panic.it }"     # Web servers
    
    dns_srv  = "{ dns1.isp.com, dns2.isp.com }"                     # DNS servers
    
    int_fw   = "{ mickey.kernel-panic.it, minnie.kernel-panic.it }" # Internal fw
    
    mail_ports = "{ smtp, imap, imaps }"    # Mail server ports
    
    web_ports  = "{ www, https }"           # Web server ports
    
    # Allowed incoming ICMP types
    
    icmp_types = "{ echoreq, timex, paramprob, unreach code needfrag }"
    
    # Private networks (RFC 1918)
    
    priv_nets = "{ 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 }"
    
    ################################################################################
    
    # Options, scrub and NAT                                                       #
    
    ################################################################################
    
    set block-policy drop
    
    set loginterface $ext_if
    
    set skip on lo
    
    scrub in
    
    # NAT outgoing connections
    
    nat on $ext_if from !$ext_if to any -> $ext_if
    
    # Redirect web services (with load balancing)
    
    rdr on $ext_if inet proto tcp from any to $carp_if port $web_ports -> $web_srv 
    
        round-robin sticky-address
    
    # Redirect mail services
    
    rdr on $ext_if inet proto tcp from any to $carp_if port $mail_ports -> $mail_srv
    
    ################################################################################
    
    # Filtering rules                                                              #
    
    ################################################################################
    
    block all                          # Default deny
    
    block in quick from urpf-failed    # Spoofed address protection
    
    pass quick on $pfs_if proto pfsync keep state (no-sync)        # Enable pfsync
    
    pass on { $int_if, $ext_if } proto carp keep state (no-sync)   # Enable CARP
    
    block in  quick on $ext_if from $priv_nets to any
    
    block out quick on $ext_if from any to $priv_nets
    
    # Mail server
    
    pass in  on $ext_if inet proto tcp from any to $mail_srv port $mail_ports
    
    pass out on $int_if inet proto tcp from any to $mail_srv port $mail_ports
    
    pass in  on $int_if inet proto tcp from $mail_srv to any port smtp
    
    pass out on $ext_if inet proto tcp from $ext_if to any port smtp modulate state
    
    # Web servers
    
    pass in  on $ext_if inet proto tcp from any to $web_srv port $web_ports 
    
         synproxy state
    
    pass out on $int_if inet proto tcp from any to $web_srv port $web_ports
    
    # ICMP
    
    pass in  inet proto icmp all icmp-type $icmp_types
    
    pass out inet proto icmp all
    
    # DNS
    
    pass in  on $int_if inet proto { tcp, udp } from $int_if:network to $dns_srv 
    
         port domain
    
    pass out on $ext_if inet proto { tcp, udp } from $ext_if to $dns_srv 
    
         port domain
    
    # Internet web servers
    
    pass in  on $int_if inet proto tcp from $int_fw to any port $web_ports
    
    pass out on $ext_if inet proto tcp from $ext_if to any port $web_ports 
    
         modulate state

Разное

Я уже давно использую качественный хостинг, и вам советую тоже самое.

Не надоело ещё ходить с закрытым ртом? Вас интересует сколько стоит отбеливание зубов в Москве? Это не так уже и дорого, как вам кажется.

Оригинал статьи: http://www.kernel-panic.it/openbsd/carp/

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

Похожие посты
  • Почти готов Windows Server 2008, плагин для Firefox, создание своего дистриба Ubuntu
  • Создание SSL прокси при помощи lighttpd
  • Создание pdf в Office 2010
  • Создание точки восстановления в Windows 7
  • Создание записей в журнале событий операционной системы Windows Server 2003
  • Создание запроса для коллекции Windows 7 в Microsoft SCCM 2007
  • Создание загрузочного USB диска из под Windows: uSbuntu Live Creator
  • Создание загрузочного USB диска в SCCM 2012 для развертывания Windows 7 или XP
  • Создание SCOM Windows Events Monitor и оповещение на основе поля описания события
  • Шелл, терминал и консоль – основы
  • 3 комментов оставлено (Add 1 more)

    1. Хотя не факт что это так.

      1. molse on April 22nd, 2009 at 11:57 am
    2. Оригинал статьи я указал, в чем рисовалось конечно точно не уверен, но вообще сильно похоже на Visio

      2. molse on April 22nd, 2009 at 11:56 am
    3. Приветствую!

      Обширная статья, интересная схема реализации доступа в инет.

      Особенно понравилась схема! :)
      По ней же и вопрос: в каком редакторе рисовал и откуда брал такие интересные иконки? :)

      3. GByte on April 22nd, 2009 at 11:51 am