Содержание


Обзор, установка, настройка и использование пакетного фильтра PF на базе операционной системы FreeBSD 8.3

Comments

Когда и как вы бы не взялись за изучение пакетного фильтра OpenBSD PF, первое, в чем нужно будет убедиться, так это в том, что есть четкое понимание основ механизма функционирования протокола TCP/IP, основ администрирования операционных систем семейства BSD и горячее желание освоить данную тему.

Обзор OpenBSD PF

Система пакетной фильтрации PF представляет собой отличный механизм контроля и управления сетью. Если слова «защищенная… обладающая высокой производительностью… требующая минимум внимания…» полностью относятся к вашей сети, то вам можно дальше не читать этот материал. А если есть какие-то сомнения в этом, то стоит обратить внимание на изучение технологии, которая интегрируется в маленькую, но очень емкую аббревиатуру – pf.

Pf родился в рамках проекта OpenBSD, который стартовал в начале 1990-х годов, отделившись от других BSD систем в сторону наибольшей защищенности кода. В настоящее время он существует под общей лицензией BSD. Преодолев некоторые разногласия человеческого плана между IP Filter Даррена Рида (Darren Reed) и представлениями о системе в целом Тэо де Раадта (Theo de Raadt), PF заменил скандальный на тот момент IP Filter и эффективно трудится на очень многих платформах по сей день.

В общем, об Open BSD, как о прародителе PF, можно сказать, что это свободная, мультиплатформенная операционная система, основанная на 4.4BSD — BSD-реализации UNIX системы. Основным отличием OpenBSD от других свободных операционных систем, базирующихся на 4.4BSD (а это NetBSD и FreeBSD) является изначальная ориентированность проекта на создание наиболее безопасной, свободной и лицензионно чистой из всех существующих операционных систем.

Нет особой нужды говорить о том, что pf может быть использован только в рамках BSD систем и только в командной строке, хотя есть проекты под GUI и довольно интересные, например, домашняя страничка pfsense с документацией и скриншотами по установке и стартовой настройке.

Установка и настройка PF

Тут все как всегда. Хочешь иметь pf на борту, надо сначала установить саму систему, его содержащую. В этой статье все вопросы, которые будут освещаться, рассматриваются применительно к FreeBSD 8.3, хотя в остальных системах его работа протекает по аналогичному сценарию. Надо сказать, что pf и связанная c ним конфигурационная утилита pfctl, уже изначально есть на борту FreeBSD, и это хорошая новость.

После установки системы, создание работоспособного конфигурационного файла возможно при использовании двух компонент – любимого текстового редактора и утилиты pfctl. Конфигурация pf хранится в файле /etc/pf.conf и представляет собой набор правил, определяющих, что именно нужно делать с сетевым трафиком, который проходит через подсистему pf. Администрирование pf сводится к изменениям, вносимым в этот файл и перезагрузку правил с использованием pfctl. Если есть ошибки в синтаксисе, pfctl тоже просигнализирует об этом.

На первом этапе для запуска пакетного фильтра нужно включить поддержку pf в системе, и сделать это можно командой, приведенной ниже (в OpenBSD pf уже включен по умолчанию).

$ sudo pfctl -ef /etc/pf.conf

Тут синтаксис отличается от системы к системе, поэтому нужно проявлять осторожность. Команда выключения pf выглядит так:

pfctl –d

Для того, чтобы не включать каждый раз вручную pf, нужно добавить в файл /etc/rc.conf опции, приведенные в листинге 1.

Листинг 1. Описание опций pf во FreeBSD
pf_enable="YES"                 # Enable PF (load module if required)
pflog_enable="YES"              # start pflogd(8)
Значения по умолчанию, которые несет на борту pf, выглядят следующим образом:
pf_enable="NO"                 # Set to YES to enable packet filter (pf) 
pf_rules="/etc/pf.conf"        # rules definition file for pf 
pf_program="/sbin/pfctl"       # where pfctl lives 
pf_flags=""                    # additional flags for pfctl 
pflog_enable="NO"              # set to YES to enable packet filter logging 
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile 
pflog_program="/sbin/pflogd"   # where pflogd lives 
pflog_flags=""                 # additional flags for pflogd 
pfsync_enable="NO"             # expose pf state to other hosts for syncing 
pfsync_syncdev=""              # interface for pfsync to work through 
pfsync_ifconfig=""             # additional options to ifconfig(8) for pfsync

Создание простых правил для PF

Для создания системы самых простых правил на одной взятой машине достаточно указать следующий их набор:

block in all
pass out all keep state

который запрещает все входящие соединения и разрешает все исходящие с хоста, на котором pf запущен. Pf читает правила сверху вниз и применяет их к сетевому трафику. Такая запись pass out all keep state даже является избыточной, так как приставка keep state подразумевается сама собой при использовании конструкции вида pass out all.

Применение списков и макросов

Для того, чтобы было удобнее читать и компоновать правила, можно и нужно использовать списки и макросы. Списки – это два или более объектов некоторого вида, которые можно использовать при написании правил. Например:

pass proto tcp to port { 21 8080 22 }

здесь перечисленные порты { 21 8080 22 } являются списком.

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

external_mail = 192.168.1.20 
pass proto tcp to $external_mail port 25

описав внешний интерфейс почтового сервера как external_mail на него теперь можно ссылаться и далее, применяя к нему определенные правила: в данном случае разрешающие прохождение через него пакетов по 25 порту.

В виде примера комбинирования списков и макросов можно привести листинг 2:

Листинг 2. Комбинирование списков и макросов
tcp_services = "{ ssh, smtp, domain, www, pop3, auth, https, pop3s }"
udp_services = "{ domain }"
block all
pass out proto tcp to port $tcp_services
pass proto udp to port $udp_services

Описав предварительно tcp и udp сервисы списками, потом их легко можно подставлять в правила в виде макросов. Просто, функционально и наглядно.

В любом случае, после изменения в правилах (файл /etc/pf.conf) они требуют своей перезагрузки в оперативной памяти. Сделать это можно командой:

$ sudo pfctl -f /etc/pf.conf

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

$ sudo pfctl -vf /etc/pf.conf

которая развернет все имеющиеся макросы и правила до перехода системы в режим основной работы командной строки. Выглядеть это может следующим образом (см. листинг 3):

Листинг 3. «Вербозная» версия команды pfctl –f
$ sudo pfctl -vf /etc/pf.conf
tcp_services = "{ ssh, smtp, domain, www, pop3, auth, https, pop3s }"
udp_services = "{ domain }"
block drop all
pass out proto tcp from any to any port = ssh flags S/SA keep state
pass out proto tcp from any to any port = smtp flags S/SA keep state
pass out proto tcp from any to any port = domain flags S/SA keep state
pass out proto tcp from any to any port = www flags S/SA keep state
pass out proto tcp from any to any port = pop3 flags S/SA keep state
pass out proto tcp from any to any port = auth flags S/SA keep state  
pass out proto tcp from any to any port = https flags S/SA keep state
pass out proto tcp from any to any port = pop3s flags S/SA keep state
pass proto udp from any to any port = domain keep state
$ _

Проверить написанные правила на предмет их корректности и наличия синтаксических ошибок до их загрузки можно по команде

$ pfctl -nf /etc/pf.conf

Поддержка NAT и прозрачного проксирования

При работе pf на маршрутизирующем хосте есть смысл включить перенаправление пакетов между его сетевыми интерфейсами. Делается это путем правки файла /etc/sysctl.conf вида net.inet.ip.forwarding=1.

Предположим, что на маршрутизаторе есть три сетевых интерфейса, и нам нужно обеспечить поддержку NAT, а также обеспечить прозрачность работы скомпилированного правильным образом прокси-сервера SQUID, работающего на этом же хосте на порту 3129. Подразумевается, что две локальных подсети находятся на xl0 и xl1, а внешний интерфейс на re0. Остальные параметры не должны вызвать затруднений при рассмотрении. Тогда правила pf в простейшем виде для описанной конфигурации могут выглядеть следующим образом (см. листинг 4):

Листинг 4. Примерный конфигурационный файл pf на маршрутизаторе с тремя сетевыми интерфейсами и прозрачным прокси-сервером Squid
re0="{ 212.119.234.147/32 }"  # секция описания интерфейсов и адресов
xl0="{ 192.168.1.15/32 }"
xl1="{ 192.168.3.253/32 }"	
ext_if="re0"
int_if="xl0"
##############################
set block-policy return   # нормализация и дефрагментация трафика
scrub in all		
#############################  секция перенаправления трафика на вход  SQUID для 
### обоих подсетей
rdr pass inet proto tcp from 192.168.1.0/24 to any port 80 -> 192.168.1.15 port 3129
rdr pass inet proto tcp from 192.168.3.0/24 to any port 80 -> 192.168.3.253 port 3129
############################# секция NAT
nat on re0 inet from xl0:network to any -> (re0)
nat on re0 from xl1:network to any -> (re0)
#############################  простейшие правила фильтрации
antispoof quick for re0
pass log on re0 inet proto tcp from any to any port 22 flags S/SA keep state 
pass in log on re0 inet proto tcp from any to any port 2225 flags S/SA keep state 
pass in on re0 inet proto tcp from any to any port 21 flags S/SA keep state 
pass in log on re0 inet proto tcp from any port 5190 to any  keep state 
pass out on re0 inet proto udp all keep state 
pass out on re0 inet proto icmp all keep state 
pass out on re0 proto tcp from $xl0 to any 
pass in on $int_if inet from any to any flags S/SA keep state

Заключение

Конечно, описание всех возможностей pf далеко выходит за рамки этой ознакомительной статьи. За бортом остались такие вопросы, как Queues, Shaping, Logging, Monitoring, Statistics, но для быстрого старта материала вполне достаточно.

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

Не единым pf могучи BSD системы, но также имеют место быть и не менее распространенные ipfw и, конечно же, скандально известный ipfilter. И как всегда, выбор остается за пользователем. Именно ему решать, какая система будет работать эффективнее и чем конкретно ее защищать.


Ресурсы для скачивания


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=857837
ArticleTitle=Обзор, установка, настройка и использование пакетного фильтра PF на базе операционной системы FreeBSD 8.3
publish-date=02122013