Главная | Контакты



Главная > Программы > PF

Настройка Packet Filter

Пакетный фильтр PF ( OpenBSD Packet Filter )

PF - OpenBSD Packet Filter - базовый firewall в OpenBSD. Начиная с версии 5.3 включен в базовую конфигурацию FreeBSD в качестве отдельного загружаемого модуля.

Существуют два варианта запуска:
     - пересборка ядра
     - инициализация через rc.conf

Замечание: в любом случае предполагается, что в конфигурации ядра системы содержаться строки:

options INET
device bpf

I. Пересборка ядра

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

device pf           # включает поддержку межсетевого экрана ''Packet Filter''
device pflog        # включает необязательное сетевое псевдоустройство pflog(4),
                    # которое может использоваться для протоколирования трафика
device pfsync       # включает необязательное сетевое псевдоустройство pfsync(4),
                    # используемое для отслеживания ''изменений состояния''

Замечание: pfsync не входит в загружаемый модуль, и для его использования необходимо собрать новое ядро.

II. Инициализация через pf.conf

      Для активации PF в /etc/rc.conf должны быть включены следующие переменные:

pf_enable="YES"                     # Включить PF (загрузить модуль если необходимо)
pf_rules="/etc/pf.conf"             # определение правил для pf
pf_flags=""                         # дополнительные флаги для запуска pfctl 
pflog_enable="YES"                  # запустить pflogd( 8 )
pflog_logfile="/var/log/pflog"      # где pflogd должен сохранять протокол
pflog_flags=""                      # дополнительные флаги для запуска pflogd

      Если за межсетевым экраном находится локальная сеть и необходимо передавать пакеты для компьютеров этой сети, или использовать NAT, включите также следующий параметр:

gateway_enable="YES" # Включить сетевой шлюз

III. Управление

      После инициализации PF тем или иным способом им можно управлять используя следующие команды:

pfctl -e                 # включить PF
pfctl -f  <имя_файла>    # загрузить правила из конфигурационного файла 
                         # <имя_файла> (обычно /etc/pf.conf)
pfctl -nf <имя_файла>    # анализировать конфигурационный файл <имя_файла>, но не 
                         # загружать
pfctl -Nf <имя_файла>    # загрузить только правила NAT из файла
pfctl -Rf <имя_файла>    # загрузить только правила фильтрации
pfctl -sn                # показать текущие правила NAT
pfctl -sr                # показать текущие правила фильтрации
pfctl -ss                # показать текущее состояние таблиц
pfctl -si                # показать статистику правил и состояние счетчиков
pfctl -sa                # показать все

IV. Конфигурационный файл

      Конфигурационный файл (/etc/pf.conf) состоит из следующих частей:

Макросы:               Определяемые пользователем переменные, которые могут
                       содержать адреса IP, имена интерфейсов, и т.д.
Таблицы:               Применяются для хранения списков IP адресов
Опции:                 Параметры, влияющие на работу pf
Scrub:                 Подготовка пакета к нормализации и дефрагментации
Очереди:               Обеспечивает управление полосой пропускания и
                       установку приоритетов пакета.
Трансляции:            Контроль NAT и перенаправлением пакета
Правила фильтрации:    Осуществляют выборочную фильтрацию пакетов на интерфейсах

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

VI. Списки

      Списки позволяют определять множества, имеющие общие признаки в пределах правила - такие как IP адреса, номера портов и т.д. При загрузке наборов правило для списка "раскладывается" на отдельные правила для каждого элемента.

Синтаксис: {элементы_списка}

Замечание: запятая при перечислении элементов необязательна, достаточно пробела.

VII. Макросы

Макросы - определяемые пользователем переменные, которые могут представлять собой IP адреса, номера портов, имена интерфейсов, и т.д.

      Имена макросов должны начаться с символа и могут содержать символы,цифры, и символы подчеркивания. Названия макросов не могут носить имена зарезервированных слов, типа pass, out, или queue.

Синтаксис:  <имя_макроса>="<значение>" # определение макроса 
            $<имя_макроса>             # вызов макроса

Замечание:

           <значением> могут быть также списки и другие макросы, возможна рекурсия: 
           <имя_макроса_списка>="{" <имя_макроса1><имя_макроса2> "}"

VIII. Таблицы

      Таблицы используются для хранения группы адресов IPv6 и/или IPv4.

Синтаксис:  table <имя_таблицы> { список_адресов }
            table <имя_таблицы> file <имя_файла>

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

При определении таблиц могут использоваться следующие атрибуты:

const - содержание таблицы не может быть изменено после ее создания. Без этого атрибута pfctl( 8 ) может использоваться для добавления или удаления элементов таблицы в любое время, при выполнении с securelevel(7), равным двум и выше.

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

Управление таблицами также может осуществляться на лету, используя pfctl( 8 ).


Синтаксис: 
   pfctl -t <имя_таблицы> -T add    # добавить в таблицу
   pfctl -t <имя_таблицы> -T delete # удалить
   pfctl -t <имя_таблицы> -T show   # вывести на экран ip адреса из таблицы Это 
                                    # также откроет таблицу, если она не существует.

IX. Правила фильтрации

Синтаксис: {pass,block}{in,out}[log][quick]on interface[proto{tcp,udp,...}]from SRC_IP[port SRC_PORT] to DST_IP[port DST_PORT][tcp_flags][state]

pass - разрешить
block - запретить
in/out - направление
log - указатель необходимости регистрации пакета через pflog( 8 ) (регистрируется лишь первый пакет соединения, в противном случае log all)
quick - указатель на то, что список правил далее не должен просматривается и к пакету применяется данное правило
interface - интерфейс
proto - протокол
SRC_IP - источник
SRC_PORT - порт источника
DST_IP - адресат
DST_PORT - порт адресата
tcp_flags - Определяет флаги, которые должны быть установлены в заголовке TCP при использовании proto tcp. Флаги определяются как flags check/mask.
state - Определяет, сохраняется ли информация о состоянии на пакетах, соответствующих этому правилу.

варианты:
keep state - работает с TCP, UDP, и ICMP
modulate state - работы только с TCP. PF генерирует Initial Sequence Numbers (ISNs) для пакетов, соответствующих этому правилу.
synproxy state - проксирует входящие TCP соединения. Эта опция включает функциональные возможности keep state и modulate state.

X. Инициализация управления очередями ALTQ

      Поддержка ALTQ может быть включена только путем компилирования ядра FreeBSD с соответствующими параметрами.

Замечание: ALTQ поддерживается не всеми существующими драйверами сетевых карт. Для просмотра списка поддерживаемых устройств в вашем релизе FreeBSD обратитесь к стравеб сайта PF для FreeBSDнице справочника altq(4).

Следующие параметры включат ALTQ и добавят дополнительную функциональность:

options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
options         ALTQ_NOPCC      # Required for SMP build

options ALTQ - включает подсистему ALTQ
options ALTQ_CBQ - включает Class Based Queuing (CBQ). CBQ позволяет распределять пропускную способность соединений по классам или очередям для выставления приоритетов трафика на основе правил фильтрации.
options ALTQ_RED - включает Random Early Detection ( RED ). RED используется для предотвращения перегрузки сети. RED вычисляет длину очереди и сравнивает ее с минимальной и максимальной границей очереди. Если очередь превышает максимум, все новые пакеты отбрасываются. В соответствии со своим названием, RED отбрасывает пакеты из различные соединений в произвольном порядке.
options ALTQ_RIO - включает Random Early Detection In and Out.
options ALTQ_HFSC - включает Hierarchical Fair Service Curve Packet Scheduler. (Дополнительная информация http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html)
options ALTQ_PRIQ - включает Priority Queuing ( PRIQ ). PRIQ всегда пропускает трафик из более высокой очереди первым.
options ALTQ_NOPCC - включает поддержку SMP для ALTQ . Эта опция необходима для SMP систем.

XI. Правила ALTQ

      Правила для очередей также задаются в конфигурационном файле (/etc/pf.conf)

Синтаксис: altq on interface scheduler bandwidth bw qlimit qlim tbrsize size queue {queue_list}

interface - сетевой интерфейс, на котором активируется очередь.
scheduler - какой планировщик будет использован. Доступные значения cbq и priq. На интерфейсе в один момент времени можно установить только один планировщик.
bw - общая пропускная способность, доступная планировщику. Может содержать аббревиатуры b, Kb, Mb, Gb для обозначения bits, kilobits, megabits, и gigabits в секунду, конкретное значение или процент от общей пропускной способности.
qlim - максимальное число пакетов в очереди. Необязательный параметр. По умолчанию - 50
size - размер token bucket regulator в байтах. Если не определен, то устанавливается на основе ширины полосы пропускания.
queue_list - список дочерних очередей, открываемых из родительской очереди.

Очередь определяется следующим образом

Синтаксис: queue name [on interface] bandwidth bw [priority pri][qlimit qlim] scheduler (sched_options) {queue_list}

name - имя очереди. Эта запись должна быть идентична определенной в директиве altq опцией queue_list. Для cbq это также может быть запись имени очереди в предыдущей директиве queue параметре queue_list. Имя не должно быть длиннее 15 символов.
interface - сетевой интерфейс, на котором запущена очередь. Это значение опциональное и если не определено, то очередь будет работать применительно ко всем интерфейсам. bw - общая пропускная способность, доступная планировщику. Может содержать аббревиатуры b, Kb, Mb, Gb для обозначения bits, kilobits, megabits, и gigabits в секунду, конкретное значение или процент от общей пропускной способности. Указывается только при использовании планировщика cbq.
pri - приоритет очереди. Для cbq приоритет изменяется от 0 до 7, для priq диапазон от 0 до 15. Приоритет 0 считается самым низким. Если этот параметр не определен, ему назначается 1. qlim - максимальное число пакетов в очереди. Необязательный параметр. По умолчанию - 50 scheduler - используемый планировщик - cbq или priq. Должен быть таким же, как и родительская очередь.
sched_options - дополнительные опции для управления планировщиком:
default - определить очередью по умолчанию, куда будут включаться все пакеты не подходящие под остальные очереди. Может быть только одна.
red - включить Random Early Detection (RED) для этой очереди.
rio - включить RED с IN/OUT. В этом режиме RED поддерживает очереди различной длины и различные пороговые значения, по одному на каждый уровень IP Quality of Service.
ecn - включить Explicit Congestion Notification (ECN) для этой очереди. Ecn работает совместно с red.
borrow - эта очередь может заимствовать пропускную способность у других очередей. Может быть определено только при использовании cbq.


Материал взят: http://pcbsd.ru

Главная > Программы > PF