Документация по ОС FreeBSD Пятница, 26.04.2024, 10:05
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
IPFW [58]

Главная » Статьи » FireWall » IPFW

Использование IPFILTER (перевод страницы из FreeBSD Handbook) Часть 1 [2010]

В своё время сделал перевод этой страницы, да и забыл поделиться - может поможет кому.
Сначала планировал написать статью про настройку IPFILTER, а потом подумал о бесполезности изобретения велосипеда, ибо в FreeBSD Handbook всё и так очень хорошо описано. А вот статья на русском не завершена, так что взял переведённую часть и доперевёл.

30.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 

30.5.1 Включение IPF

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

30.5.2 Опции ядра

Сборка ядра с FreeBSD включением IPF не обязательна. Эта процедура представлена здесь в качестве дополнительной информации. При включении 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.

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

30.5.3 Доступные параметры 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

30.5.4 IPF

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

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

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

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

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

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

30.5.5 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).

30.5.6 IPMON

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

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

ipmon_flags="-Ds" # D = запуск в виде даемона
# s = протоколирование в syslog
# v = протоколирование tcp window, ack, seq
# n = отображение имен IP и портов

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

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

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

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

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

LOG_INFO - пакеты, запротоколированные с использованием ключевого слова "log"
LOG_NOTICE - протоколируется пропущенные пакеты
LOG_WARNING - протоколируются заблокированные пакеты
LOG_ERR - пакеты, запротоколированные и которые могут считаться пакетами с неполным заголовком

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

touch /var/log/ipfilter.log

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

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

security.* /var/log/ipfilter.log

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

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

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

30.5.8 Формат протоколируемых сообщений

Сообщения, генерируемые 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 пакетов добавляется дополнительное поле, начинающееся с дефиса, за которым следуют буквы, соответствующие установленным флагам. На странице справочника ipmon(8) находится список букв и флагов.

Для пакетов ICMP, в конце находятся два поля, одно всегда "ICMP", а во втором тип ICMP сообщения (message и sub-message), например ICMP 3/3 для сообщения "port unreachable".

30.5.9 Создание набора правил с использованием символьной подстановки

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

Синтаксис скрипта совместим с sh(1), csh(1) и tcsh(1).

Символьная подстановка предваряется знаком доллара: $.

Для присвоения значения символьным переменным знак $ не используется.

Присваиваемое символической переменной значение должно быть заключено в двойные кавычки (").

Начните файл правил примерно так:

############# Начало скрипта правил IPF ########################

oif="dc0" # Имя исходящего интерфейса
odns="192.0.2.11" # IP адрес DNS сервера провайдера
myip="192.0.2.7" # Мой статический IP адрес, выданный ISP
ks="keep state"
fks="flags S keep state"

# Здесь вы можете выбрать между построением файла правил /etc/ipf.rules
# с помощью этого скрипта и запуском скрипта "как есть".
#
# Раскомментируйте только одну строку.
#
# 1) Это испульзуется для построения /etc/ipf.rules:
#cat > /etc/ipf.rules << EOF
#
# 2) Это используется для запуска скрипта "как есть":
/sbin/ipf -Fa -f - << EOF

# Разрешить доступ наружу к DNS серверам ISP.
pass out quick on $oif proto tcp from any to $odns port = 53 $fks
pass out quick on $oif proto udp from any to $odns port = 53 $ks

# Разрешить доступ наружу для небезопасного www серфинга
pass out quick on $oif proto tcp from $myip to any port = 80 $fks

# Разрешить доступ наружу для безопасного www серфинга https over TLS SSL
pass out quick on $oif proto tcp from $myip to any port = 443 $fks
EOF
############# Конец скрипта правил IPF #########################



Это все, что требовалось сделать. В данном примере сами правила не важны; важно то, как используется символьная подстановка. Если вышеприведенный пример помещен в файл /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 обязательно.

#!/bin/sh
sh /etc/ipf.rules.script


Права на этот скрипт должны разрешать чтение, запись и выполнение владельцу root.

# chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh

Теперь, при загрузке системы, правила IPF будут загружены.

30.5.10 Наборы правил IPF

Набор правил ipf это группа правил, составленных для пропуска или блокирования пакетов на основе их содержимого. Двусторонний обмен пакетами между хостами составляет сессию. Межсетевой экран обрабатывает пакеты в обеих направлениях - пакеты приходящие из сети Интернет и пакеты, создаваемые системой в ответы на них. Каждый сервис TCP/IP (например, telnet, www, mail и т.п.) определяется протоколом и привилегированным (прослушиваемым) портом. Пакеты, предназначенные определённой службе, отправляются с исходного адреса, используя непривилегированный (высокий) порт и направляются на порт службы по адресу назначения. Все упомянутые параметры (например, порты и адреса) могут быть использованы как критерий выбора для создания правил пропуска или блокирования пакетов.

IPF был первоначально написан с использованием логики "последнее совпадающее правило побеждает" и только с правилами без сохранения состояния. Со временем в IPF был включен параметр "quick" и параметр сохранения состояния "keep state", что существенно улучшило логику обработки правил.

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

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

30.5.11 Синтаксис правил

Представленный здесь синтаксис правил упрощён с целью соответствия современной логике "первое совпадающее правило побеждает". Для традионного синтаксиса правил смотрите справочную страницу ipf(8).

Символ # используется для обозначения начала комментария и может появляться в конце строки с правилом или на своей собственной строке. Пустые строки игнорирутся.

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

ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG STATEFUL

ACTION = block | pass

IN-OUT = in | out

OPTIONS = log | quick | on interface-name

SELECTION = proto value | source/destination IP | port = number | flags flag-value

PROTO = tcp/udp | udp | tcp | icmp

SRC_ADD,DST_ADDR = all | from object to object

OBJECT = IP address | any

PORT_NUM = port number

TCP_FLAG = S

STATEFUL = keep state

30.5.11.1 ACTION

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

block обозначает, что пакет отбрасывается при соответствии параметрам правила.

pass обозначает, что пакет выходит из межсетевого экрана при соответствии параметрам правила.

30.5.11.2 IN-OUT

Обязательное требование состоит в явном определении направления движения пакета. После определения действия должно быть указано ключевое слово in либо out, при отсутствии правило не пройдёт синтаксическую проверку.

in обозначает, что правило применяет по отношению к входящему пакету на интерфейсе.

out обозначает, что правило применяет по отношению к исходящему пакету на интерфейсе.

30.5.11.3 OPTIONS

На заметку: Эти параметры должны использоваться в указанном здесь порядке.

log обозначает, что заголовок пакета будет записан в файл протокола ipl
(как будет описано ниже в секции о протоколировании) при соответствии параметрам правила.

quick обозначает, что при соответствии пакета правилу, это правило будет последним проверенным и больше никакие правила проверяться не будут. Этот параметр является обязательным требованием для современной логики обработки правил.

on определяет имя сетевого интерфейса, включаемого в правило. Имена интерфейсов отображаются командой ifconfig(8). При использовании этого параметра правило будет соответствовать пакету, проходящему через интерфейс в указанном направлении (in/out). Этот параметр является обязательным требованием для современной логики обработки правил.

В случае протоколирования пакета, заголовок пакета заносится в псевдо-устройство пакетного протоколирования IPL. Сразу за ключевым словом log могут следовать следующие дополнительные определители:

body обозначает, что следом за заголовком будут запротоколированы первые 128 байт пакета.

first рекомендуется указывать в случае, если ключевое слово log используется совместно с параметром keep state. В этом случае протоколироваться будет лишь пакет, инициировавший сессию, а не каждый который соответствует условию "keep state".

30.5.11.4 SELECTION

Ключевые слова, описанные в этом разделе, используются для описания аттрибутов пакета, которые проверяются при определении соответствия пакета правилу. Есть ключевое слово-объект, у которого имеются подпараметры, один из которых должен быть выбран. Для определения соответствия существуют следующие аттрибуты общего назначения, которые должны быть использованы в следующем порядке:

30.5.11.5 PROTO

proto - ключевое слово-объект и должно писаться вместе с соответствующим подпараметром - конкретным протоколом. Этот параметр является обязательным требованием для современной логики обработки правил.

tcp/udp | udp | tcp | icmp или любой другой протокол из /etc/protocols может быть использован. Специальное ключевое слово tcp/udp может использоваться для соответствия либо TCP, либо UDP пакету и было добавлено для удобства, чтобы не дублировать одну и ту же практически идентичную строку.

30.5.11.6 SRC_ADDR/DST_ADDR

Ключевое слово all является синонимом "от любого к любому" без каких
либо других параметров.

from src to dst: ключевые слова from и to используются для соответствия IP адресам. Правила должны определять оба параметра - адрес источника и адрес назначения. any - специальное ключевое слово, которое соответствует любому IP адресу. Примеры использования: from any to any или from 0.0.0.0/0 to any или from any to 0.0.0.0/0 или from 0.0.0.0 to any или from any to 0.0.0.0.

Не существует способа определить интервал IP адресов, кроме как заданнием в формате CIDR. Порт net-mgmt/ipcalc может быть использован для упрощения расчётов. Дополнительная информация доступна на веб-странице утилиты: http://jodies.de/ipcalc.

30.5.11.7 PORT

Соответствие по порту (как для источника, так и для назначения) используется только для TCP и UDP пакетов. При указании порта может использоваться либо название сервиса из /etc/services, либо номер порта. Если номер порта указывается в части from, то соответствует порту источника; если он указывается в части to, то соответствует порту назначения. Использование номера порта в части to является обязательным требованием для современной логики обработки правил. Примеры использования: from any to any port = 80

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

port "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge".

Для указания интервалов портов, port "<>" | "><"

Внимание: Следование параметрам источника и назначения, является обязательным требованием для современной логики обработки правил.

30.5.11.8 TCP_FLAG

Флаги эффективны только для фильтрации TCP. Буквы представляют один из возможных флагов, которые могут соответствовать заголовку TCP пакета.

Современная логика обработки правил использует параметр flags S для определения начала tcp сессии.

30.5.11.9 STATEFUL

keep state активирует возможность фильтрации по состоянию в случае соответвия любого пакета в правиле пропуска.

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

30.5.12 Фильтрация по состоянию

Фильтрация по состоянию трактует трафик как двухсторонний обмен пакетами, содержащими диалог сессии. После активации, keep-state динамически создаёт внутренние правила для каждого пакета, ожидаемого в ходе двустороннего диалога сессии. keep-state имеет достаточно возможностей сопоставления чтобы определить, что учавствующие в диалоге отправитель и получатель следуют допустимой процедуре двустороннего обмена пакетами. Любой пакет, не соответствующий шаблону диалога сессии, отбрасывается.

Keep state также пропустит ICMP пакеты, связанные с TCP или UDP сессией. Так, если вы получаете ICMP type 3 code 4 в ответ на некий веб-серфинг, разрешённые правилом keep-state, то ответ будет автоматически пропущен. Каждый пакет, являющийся, по мнению IPF, частью активной сессии будет пропущен, даже если он использует другой протокол.

Происходит следующее:

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

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

Когда диалог завершается, то он удаляется из таблицы динамических состояний.

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

30.5.13 Пример включающего набора правил

Следующий набор правил представляет собой пример очень защищённого включающего межсетевого экрана. Включающий межсетевой экран пропускает только пакеты, соответствующие правилу pass и, по умолчанию, блокирует все остальные. Межсетвые экраны, предназначенные для защиты других ПК, также называемые "сетевыми", должны иметь как минимум два сетевых интерфейса и, в общем случае, настроены доверять одной стороне (LAN), но не другой (Интернет). Также межсетевой экран может быть настроен для защиты системы, в которой он запущен - называется "host based" и обычно подходит для серверов в небезопасной сети.

Все разновидности UNIX-систем, включая FreeBSD, созданы для использования интерфейса lo0 и IP адреса 127.0.0.1 для соединений внутри операционной системы. Правила межсетевого экрана должны включать правила, разрешающие беспрепятственное прохождение этих специальных пакетов.

Правила, контролирующие доступ к входящим/исходящим соединениям должны применяться на интерфейс, смотрящий в Интернет. Это может быть ваше пользовательское ppp соединение - интерфейс tun0, или NIC, просоединённая к DSL или кабельному модему.

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

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

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

Исходящая секция в следующем наборе правил содержит только правила pass, которые содержат набор значений однозначно определяющих сервис, авторизованный для доступа в Интернет.. Все правил содержат параметры quick, on, proto, port, и keep state. Правила с proto tcp имеют установленную опцию flag, необходимую для определения начала сессии и запуска фильтрации по состоянию.

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

Другая вещь, о которой необходимо позаботиться - убедиться, что на любой нежелательный трафик отсутствует ответ. Недопустимые пакеты должны прост отбрасываться и исчезать. Таким образом атакующий не будет знать, достиг ли пакет вашу систему. Чем меньше атакующий знает о вашей системе, тем больше времени и сил ему придётся затратить, прежде чем сможет сделать что-то плохое. Правила с параметром log first будут протоколировать только первое возникновение события. Этот параметр включён в пример правила nmap OS fingerprint. Утилита security/nmap обычно используется атакующими при попытках определения операционной системы вашего сервера.

Каждый раз, когда протоколируется сообщение с правилом, содержащим параметр log first, нужно запускать команду ipfstat -hio чтобы оценить сколько было совпадений этого правила. Больше число совпадений обычно говорит о том, что ваша система подвергается атаке.

Для нахождения неизветных номеров портов можно использовать файл /etc/services. Также можно произвести поиск по номеру порта на странице http://www.securitystats.com/tools/portsearch.php.  

По этой ссылке можно найти номера портов, используемых некоторыми троянами http://www.simovits.com/trojans/trojans.html.

Представленный ниже набор правил создаёт полноценный и очень защищённый включающий межсетевой экран, который был проверен на промышленных системах. Он может быть легко модифицирован под вашу систему - просто закомментируйте правила pass, которые не должны быть пропущены.

Чтобы избежать протоколирования ненужных сообщений просто добавитьте правило block в секцию входящих соединений.

В каждом правиле необходимо изменить название интерфейса с dc0 на настоящее название NIC, которое используется для соединения вашей системы с сетью Интернет. Для пользовательского PPP это будет tun0.

Добавьте следующее в файл /etc/ipf.rules:

#########################################################
# Отсутствие ограничений на интрефейсе внутренней ЛВС
# Нужно только в случае наличия ЛВС
#########################################################

#pass out quick on xl0 all
#pass in quick on xl0 all

#########################################################
# Отсутствие ограничений на интрефейсе loopback
#########################################################
pass in quick on lo0 all
pass out quick on lo0 all

#########################################################
# Интефейс, обращённый к Интернет (Исходящая секция)
# Совпадения запросов начала сессии, исходящих из ЛВС
# или с этого шлюза в сторону Интернет.
#########################################################

# Разрешить доступ наружу к DNS серверам ISP.
# xxx - IP адрес DNS сервера вашего ISP.
# Продублируйте эти строки если у вашего ISP более одного DNS сервера
# Возьмите IP адреса из файла /etc/resolv.conf
pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state
pass out quick on dc0 proto udp from any to xxx port = 53 keep state

# Разрешить доступ наружу к DHCP серверу ISP для кабельных или DSL сетей.
# Это правило не нужно при использовании 'пользовательского ppp',
# так что в этом случае можете удалить всю группу правил.
# Используйте следующее правило, затем просмотрите лог-файлы для выяснения
# выданноого IP адреса. После этого поместите адрес в законмментированное
# правило и удалите первое
pass out log quick on dc0 proto udp from any to any port = 67 keep state
#pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state

# Разрешить доступ наружу для небезопасного www серфинга
pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state

# Разрешить доступ наружу для безопасного www серфинга https over TLS SSL
pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state

# Разрешить доступ наружу для приёма/отправки почту
pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state

# Разрешить доступ наружу для времени
pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state

# Разрешить доступ наружу для новостей NNTP
pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state

# Разрешить доступ наружу для небезопасного FTP (активный и пассивный режимы)
# Здесь используется встроунный в IPNAT FTP прокси, для правильной работы
# необходимо прописать правило NAT..
# Если вы хотите использовать команду pkg_add для установки пакетов приложений
# на вашем шлюзе, то вам нужно это правило.
pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state

# Разрешить доступ наружу ssh/sftp/scp (замены telnet/rlogin/FTP)
# Эту функция использует SSH
pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state

# Разрешить доступ наружу для небезопасного Telnet
pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state

# Разрешить доступ наружу для FreeBSD CVSup
pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state

# Разрешить доступ наружу для ping
pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state

# Разрешить доступ наружу для whois
pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state

# Блокировать и протоколировать первый раз всё остальное,
# что пытается выбраться наружу.
# Это правило осуществляет запрет по умолчанию
block out log first quick on dc0 all

#########################################################
# Интефейс, обращённый к Интернет (Входящая секция)
# Совпадения пакетов, исходящих из Интернет и предназначенных
# этому шлюзу или ЛВС.
#########################################################

# Блокировать весь входящий трафик из немаршрутизируемых или зарезервированных сетей
block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP
block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP
block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP
block in quick on dc0 from 127.0.0.0/8 to any #loopback
block in quick on dc0 from 0.0.0.0/8 to any #loopback
block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config
block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs
block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect
block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast

##### Блокировать кучу всяких опасных вещей, ############
# которые я не хочу видеть в протоколах

# Блокировать фрагменты
block in quick on dc0 all with frags

# Блокировать короткие tcp пакеты
block in quick on dc0 proto tcp all with short

# Блокировать пакеты, машрутизируемые по адресу источника
block in quick on dc0 all with opt lsrr
block in quick on dc0 all with opt ssrr

# Блокировать попытки nmap определить тип ОС
# Протоколировать первое упоминание для получения IP адреса
block in log first quick on dc0 proto tcp from any to any flags FUP

# Блокировать всё со специальными параметрами
block in quick on dc0 all with ipopts

# Блокировать ping из Интернет
block in quick on dc0 proto icmp all icmp-type 8

# Блокировать ident
block in quick on dc0 proto tcp from any to any port = 113

# Блокировать все службы Netbios. 137=name, 138=datagram, 139=session
# Netbios - это служба общего доступа MS/Windows.
# Блокировать запрос сервера имён MS/Windows hosts2 81
block in log first quick on dc0 proto tcp/udp from any to any port = 137
block in log first quick on dc0 proto tcp/udp from any to any port = 138
block in log first quick on dc0 proto tcp/udp from any to any port = 139
block in log first quick on dc0 proto tcp/udp from any to any port = 81

# Разрешить входящий трафик от DHCP сервера ISP. Это правило должно содержать
# IP адрес DHCP сервера вашего ISP - единственного авторизованного источника, который
# может присылать подобные пакеты. Нужно только для кабельных или DSL
# конфигурация. Это правило не нужно для соединения с Интернет типа
# 'пользовательского ppp'.
# Это тот же самый IP адрес, который вы получили и использовали в секции
# исходящих правил.
pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state

# Разрешить входящий www трафик, потому что у меня есть веб-сервер
pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state

# Разрешить входящий трафик для небезопасного Telnet соединения из Интернет
# Обозначено небезопасным по причине пересыоки ID/PW открытым текстом.
# Удалите это правило, если вы не используете telnet сервер.
#pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state

# Разрешить входящие безопасные FTP, Telnet и SCP из Интернет
# Эту функцмя использует SSH
pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state

# Блокировать и протоколировать первый раз весь остальной трафик.
# Протоколирование только первого упоминания позволяет избежать заполнения
# свободного места на диске.
# Это правило осуществляет запрет по умолчанию
block in log first quick on dc0 all
################### Конец файла правил #####################################

Часть 2



Источник: http://www.opennet.ru/base/sec/ipfilter_handbook.txt.html
Категория: IPFW | Добавил: oleg (25.03.2010) | Автор: Maxim Romanchuk
Просмотров: 956 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024