Packet Filter Firewall (PF) межсетевой экран FreeBSD
Packet Filter Firewall (PF) — это межсетевой экран, разрабатываемый в рамках проекта OpenBSD. Обладает высокой скоростью работы, удобством в конфигурировании и большими возможностями, включая поддержку IPv6. На данный момент используется, помимо OpenBSD, также в NetBSD и FreeBSD, а также основанных на этих трёх MirBSD, DesktopBSD, pfSense и других.
Маркирование пакетов (tagged) — это способ пометить пакет внутренним идентификатором для дальнейшего использования в качестве критерия в правилах трансляции и фильтрации. Маркирование позволяет создать «доверие» между интерфейсами, а так же помогает определить был ли пакет обработан правилами трансляции. Также становится возможным переход от фильтрации, основанной на правилах, к фильтрации, основанной на политиках.
Версии 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.conf. Очередность правил.
# man pf.conf
Файл pf.conf состоит из семи частей:
- Макросы и списки: Задаваемые пользователями переменные, которые могут содержать 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.
За исключением макросов и таблиц, каждый раздел должен находиться в конфигурационном файле в порядке представленном выше, хотя и не все разделы обязаны присутствовать в файле.
Пустые строки игнорируются, а строки начинающиеся с # читаются, как комментарий.
- Синтаксис написания правил PF pf.conf(5):
{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, флаги соединения и т.д.
Просмотр статистики лог - файлов PF
- Просмотр лог - файлов Packet Filter Firewall (PF):
# tcpdump -nettti pflog0 # tcpdump -netttr /var/log/pflog
- Вывести отсортированный список заблокированных IP
> 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
Протокол Протокол pfsync - это протокол, используемый пакетным фильтром для управления и обновления таблиц состояния для stateful inspection и NAT преобразование сетевых адресов.
Запуск PF в ОС FreeBSD
Для активации 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" # Включить сетевой шлюз
Основные команды pfctl
Полная команда | Кратко | Пояснение | Примечание |
---|---|---|---|
# pfctl -e | Включить фильтр | ||
# pfctl -d | Выключить фильтр | ||
# pfctl -F all -f /etc/pf.conf | Сбросить все правила (NAT, правила фильтрации, состояния соединений, таблицы и т.д.) и загрузить новые с файла /etc/pf.conf | ># crontab -l @daily /sbin/pfctl -F all -f /scripts/pf/pf.rules.current |
|
# 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 | # pfctl -si | grep Status |
# 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 | Показать предельные значения | # echo "set loginterface fxp0" | pfctl -mf - |
|
# pfctl -x level , например # pfctl -xm | Включить отладочный режим. | Отладочные сообщения по умолчанию попадают на консоль,также syslogd записывает их в /var/log/messages. | |
# pfctl -x none | Отключить отладочный режим. |
Наилучший способ проверить, насколько полезны оказались опции -o или -oo для вашего набора правил, это сравнить его с изменённым:
$ pfctl -nvf /etc/pf.conf >before $ pfctl -oonvf /etc/pf.conf >after $ diff -u before after
Примеры
- Оригинал файла на OpenBSD.ru Пример настройки PF для простого маршрутизатора. Архив pf.conf
- Оригинал файла на OpenBSD.ru Пример настройки PF для маршрутизатора в домашней сети с использованием очередей. Архив pf-home.conf
- Оригинал файла на OpenBSD.ru Пример настройки PF для маршрутизатора с IPSec тунелями. Архив pf-tunnel.conf
- Прозрачный прокси для Windows компьютеров:
##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
Примеры: Защита портов от входящего трафика
- Защита портов от входящего трафика
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>
Пример:
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)
Эти правила делают следующее:
- max-src-conn: максимальное количество соединений с одного IP-адреса — 100 штук. Ограничение максимального количества TCP соединений прошедших тройное рукопожатие, которые можно открыть с одного IP-адреса.
- max-src-conn-rate:скорость с которой можно делать новые соединения ограничена — не более 15 соединений за 5 секунд.
- Адреса хостов, которые превысили эти лимиты заносятся в таблицу <abusive_hosts>. Это приведёт к тому, что данные адреса больше не смогут открывать соединения к серверу (см. правило block).
- Для каждого «проштрафившегося» адреса удаляются все записи из таблицы состояний появившиеся там благодаря данному правилу. Если задать flush global - будут уничтожены все записи в таблице состояний соответствующие соединениям с данного IP-адреса. При указании опции global записи в таблице состояний сбрасываются независимо от того, какое правило её создало.
Ссылки
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах