Различия

Показаны различия между двумя версиями страницы.


Предыдущая версия
packet_filter_firewall_pf [2025/07/06 12:39] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Packet Filter Firewall (PF) межсетевой экран FreeBSD  ======
  
 +{{htmlmetatags>
 +metatag-description=(Настройки и использование Packet Filter Firewall (PF). Синтаксис и очередность правил PF. Подборка руководств по настройке PF FreeBSD.)
 +}}
 +
 +Packet Filter Firewall (PF) — это межсетевой экран, разрабатываемый в рамках проекта OpenBSD. Обладает высокой скоростью работы, удобством в конфигурировании и большими возможностями, включая поддержку IPv6. На данный момент используется, помимо OpenBSD, также в NetBSD и FreeBSD, а также основанных на этих трёх MirBSD, DesktopBSD, pfSense и других.
 +
 +<text type="info" align="center">**Маркирование пакетов (tagged)**  — это способ пометить пакет внутренним идентификатором для дальнейшего использования в качестве критерия в правилах трансляции и фильтрации. Маркирование позволяет создать «доверие» между интерфейсами, а так же помогает определить был ли пакет обработан правилами трансляции. Также становится возможным переход от фильтрации, основанной на правилах, к фильтрации, основанной на политиках.</text>
 +====== Версии pf ======
 +
 +Различные версии FreeBSD содержат разные версии pf. Таблица соответствий версий pf:
 +    * In RELENG_5 - pf is at OpenBSD 3.5
 +    * In RELENG_6 - pf is at OpenBSD 3.7
 +    * In RELENG_7 - pf is at OpenBSD 4.1
 +    * In HEAD - pf is at OpenBSD 4.1 - at this time.
 +**PF** состоит из двух частей: собственно сетевого фильтра и утилиты **pfctl**, которая предоставляет интерфейс для управления межсетевым экраном. Фильтр полностью работает в контексте ядра операционной системы, взаимодействие с ним осуществляется через системный вызов ioctl. Поэтому pfctl, строго говоря, не является необходимой частью PF.
 +
 +**/etc/pf.os** - описаны ОС, которые может распознать PF.
 +
 +{{ ::pf-01.gif?nolink&600 |}}
 +====== Синтаксис pf.conf. Очередность правил. ======
 +  # man pf.conf
 +Файл pf.conf состоит из семи частей:
 +
 +    * **[[PF Макросы]]**: Задаваемые пользователями переменные, которые могут содержать IP адреса, названия интерфейсов, и т.д.
 +    * **PF Таблицы**: Структуры используемые для хранения списков IP адресов. В pf.conf, таблицы создаются с помощью директивы **table**. Следующие атрибуты могут быть определены для каждой таблицы:
 +           - **const** - содержимое таблицы не может быть изменено, после того, как таблица была создана. Когда этот атрибут не указан, pfctl(8) может быть использован для добавления или удаления адресов из таблицы, в любое время, даже при securelevel(7) равному двум или больше.
 +           - **persist** - заставляет ядро держать таблицу в памяти, даже когда к ней не применено никаких правил. Без этого атрибута, ядро автоматически удалит таблицу, когда последнее правило ссылающееся на таблицу будет очищено.
 +    * **[[PF Опции]]**: Различные опции для управления работы PF.
 +    * **[[PF Scrub (Packet Normalization)]]**: переработка пакетов для их нормализации и дефрагментации. **Нормализация трафика крайне желательна**. Простейшая директива выглядит так: **scrub in all** и она раскрывается в **scrub in all fragment reassemble**.
 +    * **PF Очереди** Bandwidth control (шейпер) [[ALTQ]].: Контроль над полосой пропускания и приоритезацией пакетов.
 +    * **[[PF NAT Преобразование]]**: Преобразование Сетевых Адресов и перенаправление пакетов.
 +
 +**Трансляция осуществляется до фильтрации. Правила фильтра увидят уже оттранслированные пакеты.**
 +                  - NAT.
 +                  - IP forward, проброс пакетов.
 +**Преобразование ICMP пакетов происходит без модификации исходного порта**.
 +
 +    * **Правила фильтрации**: Позволяет выборочно фильтровать или блокировать пакеты во время их прохождения через интерфейсы.
 +                 - Борьба со спуфингом (antispoof). Спуфинг (spoofing) — в заголовке IP пакета подделывается адрес источника.
 +                 - Unicast Reverse Path Forwarding
 +                 - Пассивное детектирование операционной системы. Особенности работы стека приведены в файле pf.os.
 +                 - [[Балансировка нагрузки исходящего трафика между двумя и более внешними каналами Internet.]]
 +
 +**За исключением макросов и таблиц, каждый раздел должен находиться в конфигурационном файле в порядке представленном выше, хотя и не все разделы обязаны присутствовать в файле.**
 +
 +Пустые строки игнорируются, а строки начинающиеся с # читаются, как комментарий. 
 +
 +
 +  * **Синтаксис написания правил PF pf.conf(5)**:
 +<code bash>
 +{pass,block}{in,out}{quick} proto {tcp,udp,icmp,gre ...} 
 +from SRC_IP to DSP_IP port = PORT_NUM {keep stat, flags S/SA ...}
 +pass -разрешить
 +block - запретить
 +далее если нужно на вход или выход in/out
 +далее параметр quick - если присутсвует, то список 
 +правил далее не просматривается и пакет останавливается на данном правиле
 +proto - протокол
 +from - откуда, to - куда будет идти пакет, port = номер порта
 +Дополнительные опции: keep stat, флаги соединения и т.д.
 +</code>
 +====== Просмотр статистики лог - файлов PF ======
 +  * Просмотр лог - файлов Packet Filter Firewall (PF):
 +<code bash>
 +# tcpdump -nettti pflog0
 +# tcpdump -netttr /var/log/pflog
 +</code>
 +  * Вывести отсортированный список заблокированных IP
 +<file bash>
 +> tcpdump -netttr /var/log/pflog | awk '{print $8}' | grep -v tun0 | cut -d. -f1 -f2 -f3 -f4 | sort | uniq -c | sort -n
 +...
 +  58 79.126.82.217
 +  61 94.180.10.118
 +  74 195.26.95.226
 +  81 89.254.227.14
 +  86 62.133.191.44
 + 133 95.27.11.27
 + 198 94.180.54.247
 +</file>
 +Протокол [[Pfsync]] - это протокол, используемый пакетным фильтром для управления и обновления таблиц состояния для stateful inspection и [[NAT]].
 +
 +===== Запуск PF в ОС FreeBSD =====
 +  * Оригинал: [[http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/firewalls-pf.html|Packet Filter Firewall (PF, межсетевой экран OpenBSD)]]
 +Для активации PF во время загрузки в /etc/rc.conf должны быть включены следующие переменные:
 +<code>
 +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
 +</code>
 +Если за межсетевым экраном находится локальная сеть и необходимо передавать пакеты для компьютеров этой сети, или использовать NAT, включите также следующий параметр:
 +<code>
 +gateway_enable="YES"            # Включить сетевой шлюз
 +</code>
 +
 +===== Основные команды pfctl =====
 +^Полная команда ^ Кратко^ Пояснение  ^ Примечание ^
 +^# pfctl -e ||Включить фильтр | |
 +^# pfctl -d ||Выключить фильтр | |
 +^# pfctl -F all -f /etc/pf.conf||**Сбросить все правила** (NAT, правила фильтрации, состояния соединений, таблицы и т.д.) и загрузить новые с файла /etc/pf.conf |<code>># crontab -l
 +@daily /sbin/pfctl -F all -f /scripts/pf/pf.rules.current
 +</code> |
 +^# pfctl -f FILE_PATH ||Перечитать правила из файла FILE_PATH | Все предыдущие параметры и таблицы сбросятся.|
 +^# pfctl -Rf FILE_PATH ||Перечитать правила только фильтра из файла FILE_PATH | |
 +^# pfctl -Nf FILE_PATH ||Перечитать только NAT правила из файла FILE_PATH | |
 +^# pfctl -t название таблицы -T add 204.92.77.111 ||Добавить в таблицу | Работа с таблицами.|
 +^# pfctl -t название таблицы -T delete ||Удалить из таблицы | Работа с таблицами.|
 +^# pfctl -t название таблицы -T show ||Вывести на экран содержимое таблицы (IP адреса)| Работа с таблицами.|
 +^# pfctl -s info | # pfctl -si|Статистика из pfctl |<code># pfctl -si | grep Status</code> |
 +^# pfctl -s rules | # pfctl -sr |Просмотреть все правила | |
 +^# pfctl -s rules -v| # pfctl -sr -v |Просмотреть все правила и счетчики обработки.|Вместо того, чтобы гадать, о том, как же часто будет срабатывать правило, вы можете использовать счётчики обработки и срабатывания по правилам. Если вверху списка вы увидите правила, которые проверяются чаще других, но редко срабатывают, их можно переместить ниже по списку правил.|
 +^# pfctl -s nat | # pfctl -sn |Просмотреть все правила для [[NAT]] | |
 +^# pfctl -s state | # pfctl -ss |Просмотреть установившиеся сессии | |
 +^# pfctl -s all | # pfctl -sa |Показать все что можно | |
 +^# pfctl -sm ||Показать предельные значения |<code># echo "set loginterface fxp0" | pfctl -mf - </code>|
 +^# pfctl -x level , например # pfctl -xm||Включить отладочный режим. |Отладочные сообщения по умолчанию попадают на консоль,также syslogd записывает их в /var/log/messages. |
 +^# pfctl -x none||Отключить отладочный режим.| |
 +
 +Наилучший способ проверить, насколько полезны оказались опции **-o** или **-oo** для вашего набора правил, это сравнить его с изменённым:
 +<code>
 +$ pfctl -nvf /etc/pf.conf >before
 +$ pfctl -oonvf /etc/pf.conf >after
 +$ diff -u before after
 +</code>
 +
 +
 +====== Примеры ======
 +  * Оригинал файла на OpenBSD.ru [[http://www.openbsd.ru/files/etc/pf.conf|Пример настройки PF для простого маршрутизатора]]. {{:pf.conf.zip| Архив pf.conf}}
 +  * [[Пример настройки PF для двух каналов с симметричной маршрутизацией]]
 +  * Оригинал файла на OpenBSD.ru [[http://www.openbsd.ru/files/etc/pf-home.conf|Пример настройки PF для маршрутизатора в домашней сети с использованием очередей]]. {{:pf-home.conf.zip| Архив pf-home.conf}}
 +  * Оригинал файла на OpenBSD.ru [[http://www.openbsd.ru/files/etc/pf-tunnel.conf|Пример настройки PF для маршрутизатора с IPSec тунелями]]. {{:pf-tunnel.conf.zip| Архив pf-tunnel.conf}}
 +  * [[Балансировка нагрузки исходящего трафика между двумя и более внешними каналами Internet.]]
 +  * Прозрачный прокси для Windows компьютеров:<code>
 +##transparent proxy
 +#rdr on $int_if inet proto tcp from <proxy_net> os "Windows" to any \
 +# port www -> $proxy_server port 3128
 +#rdr on $int_if inet proto tcp from 192.168.2.1/24 os "Windows" to any \
 +# port www -> $proxy_server port 3128
 +</code>
 +====== Примеры: Защита портов от входящего трафика ======
 +  * Защита портов от входящего трафика<file>
 +ext_if="bce1"
 +lo_if="lo0"
 +lo_ip="127.0.0.1"
 +
 +table <trust_networks> persist { 192.168.0.0/24, 127.0.0.0/24}
 +
 +set require-order no
 +
 +pass quick on $ext_if inet proto icmp all icmp-type 8 code 0 keep state
 +pass quick from <trust_networks>
 +pass on $lo_if all
 +pass out all keep state
 +
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 21 flags S/SA keep state (max-src-conn 200, max-src-conn-rate 10/60, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 22 flags S/SA keep state (max-src-conn 100, max-src-conn-rate 6/30, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 23 flags S/SA keep state (max-src-conn 30, max-src-conn-rate 3/30, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 80 flags S/SA keep state (max-src-conn 500, max-src-conn-rate 200/60, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 443 flags S/SA keep state (max-src-conn 1000, max-src-conn-rate 400/60, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 1720 flags S/SA keep state (max-src-conn 1750, max-src-conn-rate 500/10, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 3306 flags S/SA keep state (max-src-conn 750, max-src-conn-rate 500/60, overload <bruteforce> flush global)
 +pass in log on $ext_if proto tcp from any to ($ext_if) port 3307 flags S/SA keep state (max-src-conn 1000, max-src-conn-rate 500/30, overload <bruteforce> flush global)
 +#
 +block drop in log quick on $ext_if from <bruteforce>
 +</file>
 +
 +Пример:
 +<file>
 +table <abusive_hosts> persist
 +block in quick from <abusive_hosts>
 +
 +pass in on $ext_if proto tcp to $web_server \
 +    port www flags S/SA keep state \
 +    (max-src-conn 100, max-src-conn-rate 15/5, overload <abusive_hosts> flush)
 +</file>
 +            
 +Эти правила делают следующее:
 +
 +  * max-src-conn: максимальное количество соединений с одного IP-адреса — 100 штук. Ограничение максимального количества TCP соединений прошедших тройное рукопожатие, которые можно открыть с одного IP-адреса.
 +  * max-src-conn-rate:скорость с которой можно делать новые соединения ограничена — не более 15 соединений за 5 секунд.
 +  * Адреса хостов, которые превысили эти лимиты заносятся в таблицу <abusive_hosts>. Это приведёт к тому, что данные адреса больше не смогут открывать соединения к серверу (см. правило block).
 +  * Для каждого «проштрафившегося» адреса удаляются все записи из таблицы состояний появившиеся там благодаря данному правилу. Если задать flush global - будут уничтожены все записи в таблице состояний соответствующие соединениям с данного IP-адреса. При указании опции global записи в таблице состояний сбрасываются независимо от того, какое правило её создало.
 +
 +
 +
 +====== Ссылки ======
 +Руководства:
 +  * [[http://www.opennet.ru/base/sec/pf_extended.txt.html#top5|PF. Часть 2. Расширенная конфигурация]]
 +  * [[http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/firewalls-pf.html|Packet Filter Firewall (Руководство FreeBSD: PF, межсетевой экран OpenBSD)]]
 +  * [[http://pf4freebsd.love2party.net|FreeBSD packet filter (pf)]]
 +
 +Статьи:
 +  * [[http://www.lissyara.su/?id=1276|Настройка Policy Based Routing с помощью pf]]
 +  * [[http://www.opennet.ru/base/sec/openbsd_carp_pf.txt.html|Создание отказоустойчивого брандмауэра на OpenBSD с использованием]] CARP и [[pfsync]]

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!