Ключевые слова:ipfilter, freebsd, firewall, nat, (найти похожие документы)
From: Maxim Romanchuk <maxim.romanchuk@gmail.com.>
Newsgroups: email
Date: Mon, 22 Mar 2010 17:02:14 +0000 (UTC)
Subject: Использование IPFILTER (перевод страницы из FreeBSD Handbook)
В своё время сделал перевод этой страницы, да и забыл поделиться - может поможет кому.
Сначала планировал написать статью про настройку 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=ipfilter30.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
################### Конец файла правил #####################################
30.5.14 NAT
NAT обозначает преобразование сетевых адресов. Также это понятие
называют IP Masquerading; NAT и IP Masquerading - это одно и тоже. Одна
из многих функций, которые IPF NAT позволяет делать - это возможность
иметь локальную сеть (LAN), защищённую межсетевым экраном и использующую
один IP адрес для доступа к сети Интернет.
Может возникнуть вопрос, кому это может понадобиться? Обычно ISP
назначают физическим лицам динамический IP адрес, который может меняться
каждый раз при дозвоне или логоне к вашему ISP или, в случае
пользователей кабельных и DSL модемов, при перезагрузке модема. Этот
динамический IP адрес используется для идентификации вашей системы в
Интернет.
Теперь предположим, что у вас дома пять ПК и каждому необходим доступ в
интернет. В этом случае вам пришлось бы платить вашему ISP за учётную
запись для каждого ПК и иметь пять телефонных линий.
При использовании же NAT вам необходима только одна учётная запись у
вашего ISP. Остальные четыре ПК могут соединяться с коммутатором, а
коммутатор с сетевой картой системы FreeBSD, которая будет выполнять
роль шлюза в вашей сети. NAT будет автоматически преобразовывать частные
IP адреса каждого ПК локальной сети в один внешний IP адрес в момент
выхода во внешнюю сеть, а также производит обратное преобразование для
возвращающихся пакетов.
Существуют специальные интервалы IP адресов, зарезервированных для
использования в локальных сетях с NAT. Согласно RFC 1918, следующие
интервалы IP адресов могут использоваться в частных сетях и они никогда
не будут напрямую выходить в Интернет:
Start IP 10.0.0.0 - Ending IP 10.255.255.255
Start IP 172.16.0.0 - Ending IP 172.31.255.255
Start IP 192.168.0.0 - Ending IP 192.168.255.255
Правила NAT загружаются с помощью команды ipnat. Обычно правила NAT
содержаться в файле /etc/ipnat.rules. Подробее смотрите на справочной
странице ipnat(1).
Для изменения правил после запуска NAT, сделайте изменения в файл
правил, запустите ipnat с ключами -CF для удаления загруженных правил и
очистки таблицы активных записей.
Чтобы перегрузить правила NAT выполните подобную команду:
# ipnat -CF -f /etc/ipnat.rules
Для отображения некоторой статистики о вашем NAT выполните:
# ipnat -s
Чтобы вывести текущие сопоставления таблицы NAT используейте следующую команду:
# ipnat -l
Для включение подробного режима и отображения информации, относящейся к
обработке правил и активных правил/записей таблицы:
# ipnat -v
Правила NAT очень гибкие и могут выполнять различные действия,
подходящие под нужды как коммерческих, так и домашних пользователей.
Представленный здесь синтаксис был упрощён до чаще всего используемого в
некоммерческих целях. Полное описание можно найти на справочной странице
ipnat(5).
Синтаксис NAT правила выглядит примерно так:
map IF LAN_IP_RANGE -> PUBLIC_ADDRESS
Ключевое слово map начинает правило.
Замените IF внешним интерфейсом.
LAN_IP_RANGE - это то, что ваше внутренние клиенты используют для IP
адресации, обычно это что-то типа 192.168.1.0/24.
PUBLIC_ADDRESS может быть либо внешний IP адрес, либо специальное
ключевое слово 0/32, которое обозначает использование IP адреса,
назначенного IF.
Пакет постпает в межсетевой экран из локальной сети с внешним адресом
назначения. Он проходит через исходящий фильтр правил, далее NAT
получает пакет и применяет к нему свои правила сверху вниз, первое
совпавшее правило выигрывает. NAT проверяет каждое правило на совпадение
имени интерфейса пакета и IP адреса источника. Когда имя интерфейса
пакета совпадает с правилом NAT, тогда IP адрес источника (частный IP
адрес ЛВС) првоеряется на попадание в интервал, определённый слева от
символа стрелки. При совпадении IP адрес пакета перезаписывается внешним
IP адресом, получаемым от ключевого слова 0/32. NAT заносит запись в
свою внутреннюю таблицу NAT, чтобы при возвращении пакета из сети
Интернет сделать обратное сопоставление IP адресов и после этого
направляет пакет на проверку правилами фильтра.
Для включения IPNAT добавьте следующее в /etc/rc.conf.
Для включения возможности маршрутизации трафика между интерфейсами:
gateway_enable="YES"
Для автозапуска IPNAT:
ipnat_enable="YES"
Место, откуда загружать правила IPNAT:
ipnat_rules="/etc/ipnat.rules"
В сетях, имеющих большое число ПК в ЛВС или сетях, имеющих больше одной
ЛВС, процесс туннелирования всех частных IP адресов в один внешний IP
адрес сталкивается с проблемой нехватки ресурсов, которая вызвана
использованием одних и тех же номеров портов, используемых многими
транслированными адресами ПК, что вызывает коллизии. Существует два
способа решения ресурсной проблемы.
Обычное правило NAT выглядит так:
map dc0 192.168.1.0/24 -> 0/32
В правиле выше исходящий порт не изменяется в процессе прохождения
пакета через IPNAT. Если добавить ключевое слово portmap, IPNAT будет
использовать исходящие порты только из определённого интервала.
Например, следующее правило указывает IPNAT изменять исходящий порт на
порт из интервала:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000
Более того, мы можем ещё больше упростить задачу, воспользовавшись
ключевым словом auto, в этом лсучае IPNAT будет сам определять доступные
для использования порты:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
В очень больших ЛВС наступает момент, когда просто напросто используется
слишком много частных IP адресов и они уже не могут использовать один
внешний адрес. В случае наличия блока внешних IP адресов, эти адреса
могут использоваться в качестве "пула", и IPNAT будет выбирать один из
адресов при трансляции частных адресов на пути в Интернет.
Например, вместо сопоставления всех пакетов одному внешнему IP адресу,
как здесь:
map dc0 192.168.1.0/24 -> 204.134.75.1
Можно задать интервал внешних IP адресов, заданных либо с помощью маски
подсети:
map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0
либо с использованием представления CIDR:
map dc0 192.168.1.0/24 -> 204.134.75.0/24
Обычной практикой является размещение web сервера, email сервера,
сервера баз данных или DNS сервера отдельно на различных ПК в ЛВС. В
этом случае исходящий трафик по-прежнему нужно транслировать, но должен
быть путь, чтобы направлять входящий трафик на нужные ПК. Для этой цели
IPNAT имеет возможность перенаправления. К примеру, если единственный
web сервер в ЛВС имеет адрес 10.0.10.25 и используется единственный
внешний IP адрес 20.20.20.5, то правило будет выглядеть следующим
образом:
rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80
или:
rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80
или для DNS сервера ЛВС с частным адресом 10.0.10.33, которому
необходимо обслуживать запросы из сети Интернет:
rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp
FTP это динозавр, оставшийся с тем времён, когда Интернет ещё не был
таким, как сейчас, когда исследовательские университеты были объединены
между собой выделенными линиями и FTP использовался для обмена
информацией между учёными. Это было время, когда о безопасности данных
не задумывались. С течением времени протокол FTP стал одной из основ
развивающейся сети Интернет и пересылаемые открытым текстом имя
пользователя и пароль никогда не менялись для соответствия новым реалиям
безопасности. FTP имеет две разновидности - может работать в активном и
пассивном режимах. Разница заключается в том, каким образом открывается
канал передачи. Пассивный режим более безопасен, т.к. канал передачи
открывается изначально запрашивающей ftp сессию стороной. Для реально
хорошего объяснения FTP и различных режимов смотрите http://www.slacksite.com/other/ftp.html.
IPNAT имеет встроенный FTP прокси, который может быть определён в
правилах соответствия NAT. Он может мониторить весь исходящий трафик на
наличие запросов начала FTP сессии (активной или пассивной) и
динамически создавать временные правила фильтра, содержащие только номер
реально используемого для канала данных порта. Это устраняет риск
безопасности, которому FTP обычно подвергает межсетевой экран открытыми
портами с большими номерами.
Это правило будет управлять всем трафиком для внутренней ЛВС:
map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp
Это правило управляет FTP трафиком от шлюза:
map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp
Это правило управляет всем не-FTP трафиком из внутренней ЛВС:
map dc0 10.0.10.0/29 -> 0/32
Правило сопоставления (маппинга) FTP идёт перед обычным правилом
сопоставления. Все пакеты проверяются на соответсивие первом правилу.
При совпадении имени интерфейса, затем частного IP адреса ЛВС и
опознавании FTP пакета, FTP прокси создаёт временные правила фильтра для
разрешения прохождения FTP пакетов; в дополнение к преобразованию FTP
пакетов. Все пакеты, не соответствующие первому правилу и не являющиеся
FTP пакетами, попадют к третьему правилу и при совпадении имени
интерфейса и IP адреса преобразуются.
При использовании FTP прокси необходимо только одно правило.
Без использования FTP прокси потребуются следующие правила:
# Разрешить доступ наружу из ЛВС к FTP в Интернет
# Активный и пассивный режимы
pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state
# Разрешить доступ наружу по "высоким" портам для пассивного режима
pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state
# Разрешить доступ внутрь для активного режима FTP сервера
pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state
Использованные источники:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipf.htmlhttp://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/firewalls-ipf.html
Оригинал перевода:
[[http://adminotes.wordpress.com/2009/05/26/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-ipfilter/adminotes.wordpress.com]]