Packet Filter (PF, межсетевой экран OpenBSD) и ALTQ



В июле 2003 программный межсетевой экран OpenBSD, известный как PF, был портирован в FreeBSD и стал доступен из коллекции портов FreeBSD; первым релизом, где PF был интегрирован в основную систему, стала FreeBSD 5.3 в ноябре 2004. PF это полноценный межсетевой экран с широким набором возможностей, в котором есть опциональная поддержка ALTQ (Alternate Queuing). ALTQ предоставляет управление пропускной способностью Quality of Service (QoS).

Проект OpenBSD осуществляет замечательную работу по поддержке PF FAQ (http://www.openbsd.org/faq/pf/). Этот раздел руководства фокусируется на взаимосвязи PF и FreeBSD, предоставляя лишь общую информацию по его использованию. За более подробной информацией по использованию PF обратитесь к PF FAQ (http://www.openbsd.org/faq/pf/).

Дополнительные сведения о PF для FreeBSD можно получить с веб сайта: http://pf4freebsd.love2party.net/.

Использование модуля ядра PF

Чтобы загрузить PF как модуль ядра, добавьте следующую строку в /etc/rc.conf:

pf_enable="YES"

Далее, выполните стартовый скрипт:

# /etc/rc.d/pf start

Учтите, модуль PF не загрузится, если он не сможет найти конфигурационный файл с набором правил. По умолчанию размещение файла с правилами следующее: /etc/pf.conf. Если путь к файлу отличается от вышеприведённого, то внесите в /etc/rc.conf строку вида:

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

Файл с примерами конфигураций pf.conf находится в каталоге /usr/share/examples/pf/.

Модуль PF можно также загрузить вручную:

# kldload pf.ko

Поддержка ведения логов для PF обеспечивается модулем pflog.ko, для загрузки которого добавьте следующую строку в /etc/rc.conf:

pflog_enable="YES"

и запустите на выполнение скрипт:

# /etc/rc.d/pflog start

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

Параметры ядра

Включение PF путем компиляции с ядром FreeBSD не является обязательным требованием, однако вам может понадобиться одна из функциональных возможностей, которая не включена в загружаемый модуль. Например, pfsync(4) являет собой псевдоустройство, которое вносит определенные изменения в таблицу состояний, используемую PF. В дальнейшем, это псевдоустройство может быть скомпоновано с carp(4) чтобы создать отказоустойчивую систему межсетевых экранов на основе PF.

Пример параметров конфигурации ядра для включения PF находится в /usr/src/sys/conf/NOTES и показан здесь:

device pf

device pflog

device pfsync

device pf включает поддержку межсетевого экрана ''Packet Filter'' (pf(4)).

device pflog включает необязательное сетевое псевдоустройство pflog(4), которое может использоваться для протоколирования трафика через bpf(4). Даемон pflogd(8) может использоваться для сохранения протоколируемой информации на диск.

device pfsync включает необязательное сетевое псевдоустройство pfsync(4), используемое для отслеживания ''изменений состояния''.

Доступные параметры rc.conf

Для активации PF и pflog(4) во время загрузки в rc.conf(5) должны быть включены следующие переменные:

pf_enable="YES"            # Включить PF (загрузить модуль если необходимо)

pf_rules="/etc/pf.conf"    # определение правил для pf

pf_flags=""                # дополнительные флаги для запуска pfctl

pflog_enable="YES"         # запустить pflogd(8)

pflog_logfile="/var/log/pflog" # где pflogd должен сохранять протокол

pflog_flags=""             # дополнительные флаги для запуска pflogd

Если за межсетевым экраном находится локальная сеть и необходимо передавать пакеты для компьютеров этой сети, или использовать NAT, включите также следующий параметр:

gateway_enable="YES"       # Включить сетевой шлюз

Создание правил фильтрации

Пакет PF читает конфигурацию из файла pf.conf(5) (полный путь: /etc/pf.conf); пакеты отвергаются, пропускаются или модифицируются в соответствии с правилами и определениями из этого файла. В стандартную поставку FreeBSD входят несколько файлов с примерами конфигураций, которые находятся в каталоге /usr/share/examples/pf/. За исчерпывающим описанием правил PF обратитесь к PF FAQ (http://www.openbsd.org/faq/pf/).

Внимание: Изучая PF FAQ (http://www.openbsd.org/faq/pf/), имейте в виду, что различные версии FreeBSD могут содержать разные версии pf. В настоящий момент FreeBSD использует ту же версию PF, которая включена в OpenBSD 4.1.

Список рассылки, посвящённый FreeBSD packet filter (http://lists.FreeBSD.org/mailman/listinfo/freebsd-pf) является хорошим местом, чтобы задавать вопросы по конфигурации и использованию пакета PF. Не забудьте проверить архивы списка рассылки перед тем, как задавать вопрос.

Работа с PF

Для управления PF используйте утилиту pfctl(8). Ниже приведено несколько полезных команд (все возможные команды и опции приведены на странице справочника pfctl(8)):

Команда Действие
pfctl -e Включить PF
pfctl -d Выключить PF
pfctl -F all -f /etc/pf.conf Сбросить все правила (NAT, правила фильтрации, состояния соединений, таблицы и т.д.) и загрузить новые с файла /etc/pf.conf
pfctl -s [ rules | nat | state ] Отобразить правила фильтрации, правила NAT или таблицу состояний соединений
pfctl -vnf /etc/pf.conf Проверить /etc/pf.conf на наличие ошибок, но сами наборы правил не загружать

 

Включение ALTQ

ALTQ может быть включен только путем компилирования ядра FreeBSD с соответствующими параметрами. ALTQ поддерживается не всеми существующими драйверами сетевых карт. Для просмотра списка поддерживаемых устройств в вашем релизе FreeBSD обратитесь к странице справочника altq(4).

Следующие параметры включат ALTQ и добавят дополнительную функциональность.

options    ALTQ

options    ALTQ_CBQ   # Class Bases Queuing (CBQ)

options    ALTQ_RED   # Random Early Detection (RED)

options    ALTQ_RIO   # RED In/Out

options    ALTQ_HFSC  # Hierarchical Packet Scheduler (HFSC)

options    ALTQ_PRIQ  # Priority Queuing (PRIQ)

options    ALTQ_NOPCC # Required for SMP build

options ALTQ включает подсистему ALTQ.

options ALTQ_CBQ включает Class Based Queuing (CBQ). CBQ позволяет распределять пропускную способность соединений по классам или очередям для выставления приоритетов трафика на основе правил фильтрации.

options ALTQ_RED включает Random Early Detection (RED). RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальным и максимальным значением длины очереди. Если очередь превышает максимум, все новые пакеты будут отброшены. В соответствии со своим названием, RED отбрасывает пакеты из различных соединений в произвольном порядке.

options ALTQ_RIO включает Random Early Detection In and Out.

options ALTQ_HFSC включает Hierarchical Fair Service Curve Packet Scheduler. Дополнительная информация о HFSC находится по адресу: http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html.

options ALTQ_PRIQ включает Priority Queuing (PRIQ). PRIQ всегда первым пропускает трафик из очереди c более высоким приоритетом.

options ALTQ_NOPCC включает поддержку SMP для ALTQ. Эта опция необходима для SMP систем.

27.5. * IPFILTER (IPF)

Внимание: Перевод раздела не завершен.

Замечание: Этот раздел находится в процессе написания; содержание может не вполне соответствовать действительности.

Автором IPFILTER является Darren Reed. IPFILTER не зависит от операционной системы: это приложение с открытыми исходными текстами, которое было портировано на операционные системы FreeBSD, NetBSD, OpenBSD, SunOS, HP/UX, и Solaris. IPFILTER активно разрабатывается и поддерживается, регулярно выпускаются обновленные версии.

IPFILTER основан на межсетевом экране и механизме NAT уровня ядра, которые управляются и контролируются утилитами уровня пользовательских процессов. Правила межсетевого экрана могут устанавливаться или удаляться утилитой ipf(8). Правила NAT могут устанавливаться или удаляться утилитой ipnat(1). Утилита ipfstat(8) выводит статистику IPFILTER для ядра. Программа ipmon(8) может заносить действия IPFILTER в файлы системных протоколов.

IPF был первоначально написан с использованием правила ''последнее совпадение применяется'' и только с правилами без сохранения состояния. Со временем IPF был расширен и включает параметры ''quick'' и ''keep state'' (сохранение состояния), которые кардинальным образом изменяют логику обработки пакетов. Официальная документация IPF включает традиционные параметры правил с традиционной последовательностью обработки пакетов. Измененные функции включены в виде дополнительных параметров, они необходимы для создания эффективного межсетевого экрана.

Инструкции этого раздела подразумевают использование параметра ''quick'' и параметра сохранения состояния ''keep state''. Это основа для создания включающего межсетевого экрана.

Детальное описание традиционных методов обработки правил: http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1 и http://coombs.anu.edu.au/~avalon/ip-filter.html.

IPF FAQ находится по адресу http://www.phildev.net/ipf/index.html.

Архив списка рассылки по IPFilter с возможностью поиска доступен по адресу http://marc.theaimsgroup.com/?l=ipfilter.

Включение IPF

IPF включен в базовую систему FreeBSD в качестве отдельного загружаемого модуля. Система динамически загрузит модуль IPF, если в rc.conf указана переменная ipfilter_enable="YES". Модуль создается с включенным протоколированием и правилом по умолчанию pass all (пропускать все). Для изменения правила по умолчанию не обязательно собирать ядро с новыми параметрами. Просто добавьте в конец набора правило, блокирующее все пакеты.

Параметры ядра

Включение IPF в ядро FreeBSD не является обязательным требованием. Эта процедура представлена здесь в качестве дополнительной информации. При включении IPF в ядро загружаемый модуль не используется.

Пример параметров настройки ядра для IPF находится в /usr/src/sys/conf/NOTES и воспроизведен здесь:

options IPFILTER

options IPFILTER_LOG

options IPFILTER_DEFAULT_BLOCK

options IPFILTER включает поддержку межсетевого экрана ''IPFILTER''.

options IPFILTER_LOG включает протоколирование трафика через IPF путем записи его в псевдо-устройство протоколирования пакетов ipl для каждого правила, содержащего ключевое слово log.

options IPFILTER_DEFAULT_BLOCK изменяет поведение по умолчанию так, что блокируется каждый пакет, не соответствующий правилу pass.

Эти настройки будут работать только после сборки и установки нового ядра.

Доступные параметры rc.conf

Для активации IPF во время загрузки в /etc/rc.conf потребуется добавить следующие переменные:

ipfilter_enable="YES"        # Запуск межсетевого экрана ipf

ipfilter_rules="/etc/ipf.rules" # Загрузка файла с правилами

ipmon_enable="YES"           # Включение протоколирования IP monitor

ipmon_flags="-Ds"            # D = запуск в виде даемона

                             # s = протоколирование в syslog

                             # v = протоколирование tcp window, ack, seq

                             # n = отображение имен IP и портов

Если за межсетевым экраном находится локальная сеть, использующая приватные IP адреса, для включения NAT потребуется добавить следующие переменные:

gateway_enable="YES"         # Включение шлюза для локальной сети

ipnat_enable="YES"           # Запуск функции ipnat

ipnat_rules="/etc/ipnat.rules" # Определение файла правил для ipnat

IPF

Команда ipf(8) используется для загрузки файла с правилами. Обычно создается файл, содержащий подготовленный набор правил, который полностью замещает набор, используемый на данный момент:

# ipf -Fa -f /etc/ipf.rules

-Fa означает сброс всех внутренних таблиц правил.

-f указывает файл с правилами, который необходимо загрузить.

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

На странице справочной системы ipf(8) находится подробная информация по всем флагам этой команды.

Набор правил для команды ipf(8) должен быть в виде стандартного текстового файла. Правила, написанные в виде скрипта с символами подстановки, не принимаются.

Есть способ составления правил IPF, использующих символы подстановки. Обратитесь к Разд. 27.5.9.

IPFSTAT

По умолчанию ipfstat(8) получает и отображает суммарную статистику, полученную в результате применения действующих правил к пакетам, проходящим через межсетевой экран с момента его последнего запуска, или с того момента, когда статистика была последний раз обнулена командой ipf -Z.

Детальная информация приводится на странице справочника ipfstat(8).

Вывод команды ipfstat(8) по умолчанию выглядит примерно так:

input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0

 output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0

 input packets logged: blocked 99286 passed 0

 output packets logged: blocked 0 passed 0

 packets logged: input 0 output 0

 log failures: input 3898 output 0

 fragment state(in): kept 0 lost 0

 fragment state(out): kept 0 lost 0

 packet state(in): kept 169364 lost 0

 packet state(out): kept 431395 lost 0

 ICMP replies: 0 TCP RSTs sent: 0

 Result cache hits(in): 1215208 (out): 1098963

 IN Pullups succeeded: 2 failed: 0

 OUT Pullups succeeded: 0 failed: 0

 Fastroute successes: 0 failures: 0

 TCP cksum fails(in): 0 (out): 0

 Packet log flags set: (0)

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

ipfstat -in отображает правила, применяемые к входящим пакетам, вместе с номерами этих правил.

ipfstat -on отображает правила, применяемые к исходящим пакетам, вместе с номерами этих правил.

Вывод команды будет выглядеть примерно так:

@1 pass out on xl0 from any to any

@2 block out on dc0 from any to any

@3 pass out quick on dc0 proto tcp/udp from any to any keep state

ipfstat -ih отображает правила, применяемые к входящим пакетам, со счетчиком количества совпадений для каждого правила.

ipfstat -oh отображает правила, применяемые к исходящим пакетам, со счетчиком количества совпадений для каждого правила.

Вывод команды будет выглядеть примерно так:

2451423 pass out on xl0 from any to any

354727 block out on dc0 from any to any

430918 pass out quick on dc0 proto tcp/udp from any to any keep state

Одна из наиболее важных функций команды ipfstat активируется флагом -t, правила отображаются подобно тому, как top(1) показывает таблицу запущенных процессов FreeBSD. Когда межсетевой экран подвергается атаке, эта функция позволяет обнаружить соответствующие пакеты. Дополнительные флаги дают возможность выбирать IP адрес назначения или источника, порт или протокол, которые будут отслеживаться в реальном времени. Подробная информация приведена на странице ipfstat(8).

IPMON

Для того, чтобы стало возможно использование команды ipmon, необходимо включить параметр ядра IPFILTER_LOG. Эта команда может использоваться в двух различных режимах. В основном режиме, который используется по умолчанию, она используется без флага -D.

В режиме даемона создается непрерывный протокол, и возможен просмотр предыдущих событий. В этом режиме IPFILTER работает в FreeBSD. Поскольку в FreeBSD встроена функция ротации файлов протокола, лучше использовать syslogd(8), чем используемый по умолчанию вывод в обычный файл. В rc.conf по умолчанию ipmon_flags имеет значение -Ds:

ipmon_flags="-Ds" # D = start as daemon

             # s = log to syslog

             # v = log tcp window, ack, seq

             # n = map IP & port to names

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

Даже с включенным протоколированием, IPF не ведет протокол для каждого правила. Администратор межсетевого экран должен решить, по каким правилам набора нужно вести протокол и добавить ключевое слово log к этим правилам. Обычно протоколируются только правила, отбрасывающие пакеты.

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

Протоколирование IPMON

Для разделения собираемых данных syslogd использует свой собственный специальный метод. Он использует группировку по категории (''facility'') и уровню (''level''). IPMON в режиме -Ds использует local0 в качестве имени ''категории''. Для дальнейшего разделения протоколируемых данных, если такое необходимо, могут быть использованы следующие уровни:

LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block.

LOG_NOTICE - packets logged which are also passed

LOG_WARNING - packets logged which are also blocked

LOG_ERR - packets which have been logged and which can be considered short

Для указания IPFILTER протоколировать все данные в /var/log/ipfilter.log, создайте этот файл заранее, выполнив следующую команду:

# touch /var/log/ipfilter.log

Функционирование syslogd(8) управляется настройками в файле /etc/syslog.conf. Файл syslog.conf позволяет достаточно гибко настроить обработку системных сообщений, выдаваемых программами, такими как IPF.

Добавьте в /etc/syslog.conf следующую запись:

local0.* /var/log/ipfilter.log

local0.* означает запись всех протоколируемых сообщений в указанный файл.

Для применения внесенных в /etc/syslog.conf изменений вы можете перезагрузиться или заставить syslogd(8) перечитать /etc/syslog.conf, выполнив команду /etc/rc.d/syslogd reload.

Не забудьте отредактировать /etc/newsyslog.conf для ротации только что созданного лог файла.


Дата добавления: 2018-10-26; просмотров: 174; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!