Перевод раздела не завершен.
Этот раздел находится в процессе написания; содержание может не вполне соответствовать действительности.
Автором 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 включен в базовую систему FreeBSD в качестве отдельного
загружаемого модуля. Система динамически загрузит модуль IPF,
если в rc.conf
указана переменная
ipfilter_enable="YES"
. Модуль создается
с включенным протоколированием и правилом по умолчанию
pass all
(пропускать все). Для изменения
правила по умолчанию не обязательно собирать ядро с новыми
параметрами. Просто добавьте в конец набора правило,
блокирующее все пакеты.
Включение IPF в ядро FreeBSD не является обязательным требованием. Эта процедура представлена здесь в качестве дополнительной информации. При включении IPF в ядро загружаемый модуль не используется.
Пример параметров настройки ядра для IPF находится в
/usr/src/sys/conf/NOTES
и воспроизведен здесь:
options IPFILTER
включает поддержку
межсетевого экрана «IPFILTER».
options IPFILTER_LOG
включает
протоколирование трафика через IPF путем записи его в
псевдо-устройство протоколирования пакетов
ipl
для каждого
правила, содержащего ключевое слово
log
.
options IPFILTER_DEFAULT_BLOCK
изменяет поведение по умолчанию так, что блокируется каждый
пакет, не соответствующий правилу
pass
.
Эти настройки будут работать только после сборки и установки нового ядра.
Для активации IPF во время загрузки в
/etc/rc.conf
потребуется добавить
следующие переменные:
Если за межсетевым экраном находится локальная сеть, использующая приватные IP адреса, для включения NAT потребуется добавить следующие переменные:
Команда ipf(8) используется для загрузки файла с правилами. Обычно создается файл, содержащий подготовленный набор правил, который полностью замещает набор, используемый на данный момент:
#
ipf -Fa -f /etc/ipf.rules
-Fa
означает сброс всех внутренних таблиц правил.
-f
указывает файл с правилами, который необходимо загрузить.
Это дает вам возможность отредактировать файл с правилами, запустить вышеприведенную команду IPF, тем самым обновить набор правил работающего межсетевого экрана без перезагрузки системы. Для обновления правил такой подход очень удобен, поскольку команду можно выполнять столько раз, сколько нужно.
На странице справочной системы ipf(8) находится подробная информация по всем флагам этой команды.
Набор правил для команды ipf(8) должен быть в виде стандартного текстового файла. Правила, написанные в виде скрипта с символами подстановки, не принимаются.
Есть способ составления правил IPF, использующих символы подстановки. Обратитесь к Раздел 28.5.9, «Создание набора правил с использованием символьной подстановки».
По умолчанию ipfstat(8) получает и отображает суммарную
статистику, полученную в результате применения действующих правил
к пакетам, проходящим через межсетевой экран с момента его последнего
запуска, или с того момента, когда статистика была последний раз
обнулена командой ipf -Z
.
Детальная информация приводится на странице справочника ipfstat(8).
Вывод команды ipfstat(8) по умолчанию выглядит примерно так:
При задании флага -i
или -o
соответственно для входящих или
исходящих пакетов, команда извлечет и отобразит соответствующий
список правил, установленных и
используемых на данный момент.
ipfstat -in
отображает правила, применяемые
к входящим пакетам, вместе с номерами этих правил.
ipfstat -on
отображает правила, применяемые
к исходящим пакетам, вместе с номерами этих правил.
Вывод команды будет выглядеть примерно так:
ipfstat -ih
отображает правила, применяемые
к входящим пакетам, со счетчиком количества совпадений для
каждого правила.
ipfstat -oh
отображает правила, применяемые
к исходящим пакетам, со счетчиком количества совпадений для
каждого правила.
Вывод команды будет выглядеть примерно так:
Одна из наиболее важных функций команды
ipfstat
активируется флагом -t
,
правила отображаются подобно тому, как top(1)
показывает таблицу запущенных процессов FreeBSD. Когда межсетевой экран
подвергается атаке, эта функция позволяет обнаружить соответствующие
пакеты. Дополнительные флаги дают возможность выбирать IP
адрес назначения или источника, порт или протокол, которые
будут отслеживаться в реальном времени. Подробная информация
приведена на странице ipfstat(8).
Для того, чтобы стало возможно использование команды
ipmon
, необходимо включить параметр ядра
IPFILTER_LOG
. Эта команда может использоваться в двух различных
режимах. В основном режиме, который используется по умолчанию,
она используется без флага -D
.
В режиме даемона создается непрерывный протокол, и возможен
просмотр предыдущих событий. В этом режиме IPFILTER работает
в FreeBSD. Поскольку в FreeBSD встроена функция ротации файлов
протокола, лучше использовать syslogd(8), чем используемый по
умолчанию вывод в обычный файл. В rc.conf
по умолчанию ipmon_flags
имеет значение -Ds
:
Описывать преимущества протоколирования излишне. Например, оно дает возможность отложенного просмотра информации об отброшенных пакетах, откуда они пришли и куда направлялись. Эта информация существенно помогает при отслеживании атак.
Даже с включенным протоколированием, IPF не ведет протокол для каждого правила. Администратор межсетевого экран должен решить, по каким правилам набора нужно вести протокол и добавить ключевое слово log к этим правилам. Обычно протоколируются только правила, отбрасывающие пакеты.
Включение в набор последнего правила, запрещающего прохождение
пакетов, в сочетании с ключевым словом log
является
довольно распространённой практикой. Так вы можете увидеть все пакеты,
не
попадающие ни под одно правило набора.
Для разделения собираемых данных
syslogd использует свой собственный
специальный метод. Он использует группировку по категории
(«facility») и уровню («level»).
IPMON в режиме -Ds
использует
local0
в качестве имени «категории».
Для дальнейшего разделения
протоколируемых данных, если такое необходимо, могут быть использованы следующие
уровни:
Для указания IPFILTER протоколировать все данные в
/var/log/ipfilter.log
, создайте этот
файл заранее, выполнив следующую команду:
#
touch /var/log/ipfilter.log
Функционирование syslogd(8) управляется настройками в файле
/etc/syslog.conf
. Файл
syslog.conf
позволяет достаточно гибко
настроить обработку системных сообщений, выдаваемых программами,
такими как IPF.
Добавьте в /etc/syslog.conf
следующую запись:
local0.*
означает запись всех
протоколируемых сообщений в указанный файл.
Для применения внесенных в
/etc/syslog.conf
изменений вы можете
перезагрузиться или заставить syslogd(8) перечитать
/etc/syslog.conf
, выполнив команду
/etc/rc.d/syslogd reload
.
Не забудьте отредактировать
/etc/newsyslog.conf
для ротации только
что созданного лог файла.
Сообщения, генерируемые ipmon
, состоят
из полей данных, разделенных пробелами. Поля, общие для всех
сообщений:
Дата получения пакета.
Время получения пакета. Формат времени HH:MM:SS.F для часов, минут, секунд и долей секунд (последнее поле может состоять из нескольких цифр).
Имя интерфейса, через который прошел пакет,
например dc0
.
Группа и номер правила, например
@0:17
.
Эти сообщения могут быть просмотрены командой
ipfstat -in
.
Действие: p для пропущенных, b для заблокированных, S для пакетов с неполным заголовком (short packet), n для пакетов, не соответствующих какому-либо правилу, L для соответствующих правилу протоколирования. Порядок следования по флагам: S, p, b, n, L. Знаки P или B в верхнем регистре означают, что пакет был протоколирован в соответствии с общими настройками, а не каким-то конкретным правилом.
Адреса. Всего три поля: адрес и порт источника (разделенные запятой), ->, адрес и порт назначения. 209.53.17.22,80 -> 198.73.220.17,1722.
PR
, с последующим именем или
номером протокола, например PR tcp
.
len
, с последующей длиной заголовка
и общей длиной пакета, например len 20 40
.
Для TCP пакетов добавляется дополнительное поле, начинающееся с дефиса, за которым следуют буквы, соответствующие установленным флагам. На странице справочника ipf(5) находится список букв и флагов.
Для пакетов ICMP, в конце находятся два поля, одно всегда «ICMP», а второе содержит тип и подтип ICMP сообщения (message и sub-message), разделенные символом косой черты, например ICMP 3/3 для сообщения «port unreachable».
Некоторые опытные пользователи IPF создают файл правил, поддерживающий использование символьной подстановки. Основное преимущество использования такого подхода заключается в возможности изменения значения, присваиваемого символьному имени, в результате чего во всех правилах, содержащих эту символьную подстановку, будет использоваться новое значение. В начале скрипта вы можете поместить часто используемые переменные, а затем использовать их сразу в нескольких правилах. Ниже дан пример такого использования.
Синтаксис скрипта совместим с sh(1), csh(1), и tcsh(1).
Символьная подстановка предваряется знаком доллара:
$
.
Для присвоения значения символьным переменным знак $ не используется.
Присваиваемое символической переменной значение должно
быть заключено в двойные кавычки ("
).
Начните файл правил примерно так:
Это все, что требовалось сделать. В данном примере сами
правила не важны; важно то, как используется символьная подстановка.
Если вышеприведенный пример помещен в файл
/etc/ipf.rules.script
, то набор правил можно
перезагрузить, введя следующую команду:
#
sh /etc/ipf.rules.script
С использованием в правилах символьной подстановки связана одна проблема: IPF не понимает символьную подстановку и не может обработать такой скрипт непосредственно.
Скрипт может использоваться одним из следующих двух способов:
Уберите комментарий перед строкой, начинающейся с
cat
, и закомментируйте строку,
начинающуюся с /sbin/ipf
. Поместите
строку ipfilter_enable="YES"
в файл
/etc/rc.conf
как обычно, и запускайте
скрипт после каждого его обновления для создания или обновления
файла /etc/ipf.rules
.
Отключите IPFILTER в стартовых скриптах системы, поместив
строку ipfilter_enable="NO"
(это значение
по умолчанию) в файл /etc/rc.conf
.
Поместите скрипт, подобный нижеприведенному, в каталог
/usr/local/etc/rc.d/
. У него должно
быть однозначно говорящее о его назначении имя, например
ipf.loadrules.sh
. Расширение
.sh
обязательно.
Права, установленные на этот файл, должны разрешать чтение, запись и
выполнение владельцу root
.
#
chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh
Теперь, правила IPF будут загружаться при загрузке системы.
Набор правил ipf это группа правил, составленных для пропускания или блокирования пакетов на основе их содержимого. Двусторонний обмен пакетами между хостами составляет сессию. Межсетевой экран обрабатывает как входящие из Интернет пакеты, так и исходящие пакеты, которые сгенерированы самой системой в ответ на входящий трафик. Для каждой службы TCP/IP (например, telnet, www, mail, и т.п.) назначен протокол и номер привилегированного (прослушиваемого) порта. Пакеты, предназначенные для определенного сервиса, порождаются с некоторым исходящим адресом и портом из непривилегированного диапазона и направляются на определенный адрес и определенный порт назначения. Все упомянутые параметры (номера портов и адреса) могут использоваться как критерии выбора в правилах, пропускающих или блокирующих доступ к службам TCP/IP.
IPF был первоначально написан с использованием логики «последнее совпадающее правило побеждает» и только с правилами без сохранения состояния. Со временем в IPF был включен параметр «quick» и параметр сохранения состояния «keep state», что существенно улучшило логику обработки правил.
Инструкции, помещенные в эту главу, созданы с использованием параметров «quick» и «keep state». Это основа для создания набора правил включающего межсетевого экрана.
При работе с правилами межсетевого экрана, будьте очень осторожны. Некоторые конфигурации могут заблокировать вам доступ к серверу. В целях предосторожности, первоначальную настройку межсетевого экрана вы можете выполнить с локальной консоли, а не через удаленное подключение, такое как ssh.
Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.