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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!