Гид по технологиям

Настройка PF и Fail2ban на FreeBSD 12.0

• 5 min read • Безопасность • Обновлено 23 Nov 2025
PF + Fail2ban на FreeBSD 12 — настройка
PF + Fail2ban на FreeBSD 12 — настройка

Введение

PF (Packet Filter) — stateful packet filter с лицензией BSD. Изначально разработан для OpenBSD и портирован в другие BSD-системы, включая FreeBSD. PF фильтрует TCP/IP трафик, может выполнять NAT, а также управлять пропускной способностью и приоритизацией пакетов.

В этом руководстве мы используем FreeBSD 12.0 с 1 ГБ оперативной памяти и 2 CPU. Для всех шагов нужны привилегии root.

Что мы сделаем:

  • Включим PF
  • Настроим базовую конфигурацию PF
  • Установим и настроим Fail2ban
  • Настроим взаимодействие Fail2ban → PF (бан через таблицу)

Шаг 1 — Включение PF

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

echo 'pf_enable="YES"' >> /etc/rc.conf
echo 'pf_rules="/usr/local/etc/pf.conf"' >> /etc/rc.conf

echo 'pflog_enable="YES"' >> /etc/rc.conf
echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf

После этого PF включён, но пока не стартует до тех пор, пока вы не создадите правила.

Индикация включения PF на FreeBSD

Шаг 2 — Базовая конфигурация PF

Создадим файл конфигурации PF: /usr/local/etc/pf.conf. Здесь зададим внешний интерфейс, порты сервисов и базовую политику.

cd /usr/local/etc/
vim pf.conf

Пример наборов переменных и правил:

# Define External Interface and IP Address
ext_if="vtnet0"
ext_ip="SERVER-IP-ADDRESS"

# Define TCP and UDP Services
ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }"
ext_udp_ports="{ domain, ntp }"

# Skip the localhost
set skip on lo0

# Log interface
set loginterface $ext_if

# Default Policy
block in all
pass out all keep state

# Allow Ping
pass inet proto icmp icmp-type echoreq

# Allow Services
pass in proto tcp from any to any port $ext_tcp_ports
pass in proto udp from any to any port $ext_udp_ports

# Log access for ssh and http
pass log quick proto tcp from any to any port { ssh,http }

Проверьте синтаксис правил перед запуском сервиса:

service pf check

Запустите pflog и pf:

service pflog start
service pf start

Важно: после запуска PF ваше текущие SSH-соединения могут прерваться. Убедитесь, что порт SSH (22) открыт в правилах перед применением.

Список правил PF

Для просмотра правил используйте:

pfctl -s rules

Вывод pfctl -s rules

Шаг 3 — Установка и настройка Fail2ban

Fail2ban мониторит логи и автоматически блокирует IP, которые пытаются подобрать пароли или совершают другие подозрительные действия. На FreeBSD установите пакет и включите jail для SSH.

Установка:

pkg install py27-fail2ban py27-pyinotify

Создайте файл jail для SSH:

cd /usr/local/etc/fail2ban
vim jail.d/sshd-pf.conf

Пример содержимого jail:

[ssh]
enabled  = true
filter   = sshd
action   = pf

logpath  = /var/log/auth.log
findtime = 600
maxretry = 3
bantime  = 3600

Далее создадим действие (action) для Fail2ban, которое будет добавлять IP в таблицу PF. Резервное копирование и замена файла action.d/pf.conf:

mv action.d/pf.conf action.d/pf.conf.orig
vim action.d/pf.conf

Содержимое action.d/pf.conf:

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = /sbin/pfctl -t  -T add /32
actionunban = /sbin/pfctl -t  -T delete /32

[Init]
tablename = fail2ban

Добавьте Fail2ban в автозапуск и запустите сервис:

sysrc fail2ban_enable=yes
service fail2ban start
service fail2ban status

Fail2ban запущен на FreeBSD

Шаг 4 — Интеграция Fail2ban с PF

Добавьте таблицу fail2ban в pf.conf и правило блокировки для SSH:

cd /usr/local/etc/
vim pf.conf

Добавьте в конец файла:

# Fail2Ban
table  persist
block quick proto tcp from  to $ext_if port ssh

Перезагрузите конфигурацию PF:

service pf reload

После этого IP, добавленные Fail2ban, будут попадать в таблицу fail2ban и немедленно блокироваться PF.

Fail2ban блокирует IP через PF

Шаг 5 — Полезные команды и управление

Часто используемые команды управления и проверки:

service pf status
pfctl -s rules
pfctl -v -s rules
pfctl -s state
pfctl -t fail2ban -T show
tcpdump -n -e -ttt -r /var/log/pflog

Состояние PF

Вывод pfctl -s rules с подробностями

Содержимое таблицы fail2ban

Критерии приёмки

  • PF включён и конфигурация успешно проходит service pf check
  • Правила загружены (pfctl -s rules показывает ожидаемые записи)
  • Fail2ban запущен и в логе видно добавление IP в таблицу fail2ban
  • Запреты применяются немедленно (pfctl -t fail2ban -T show)

Тесты и сценарии приёмки

  1. Попытка нескольких неуспешных подключений по SSH с тестового IP (до превышения maxretry). Ожидается: запись в /var/log/auth.log, затем добавление IP в pfctl -t fail2ban -T show.
  2. Проверка доступности служб: ping, SSH (разрешён), HTTP (если открыт).
  3. Перезагрузка сервиса pf и fail2ban — правила сохраняются и таблица persist остаётся в актуальном состоянии.

Отладка и распространённые ошибки

  • Симптом: после запуска PF SSH отключился. Причина: правило SSH не было добавлено. Решение: убедитесь, что в pf.conf есть pass для SSH и перезапустите PF.
  • Симптом: Fail2ban не добавляет IP в таблицу. Причина: неверный action.d/pf.conf или путь к pfctl. Решение: проверьте исполняемый путь /sbin/pfctl и права.
  • Симптом: таблица пуста после перезагрузки. Причина: правило table не имеет опции persist или Fail2ban не инициализирует таблицу. Решение: добавить table persist в pf.conf и reload.

Рекомендации по безопасности

  • Минимизируйте список разрешённых портов.
  • Используйте ключи вместо паролей для SSH.
  • Установите строгие значения maxretry и bantime в Fail2ban для публичных сервисов.
  • Следите за /var/log/pflog и /var/log/auth.log на предмет ложных срабатываний.

Шаблон быстрого чек-листа для администратора

  • Создать резервную копию /usr/local/etc/pf.conf
  • Добавить pf_enable и pflog в /etc/rc.conf
  • Проверить pf конфигурацию (service pf check)
  • Установить и включить fail2ban
  • Убедиться, что таблица объявлена в pf.conf
  • Проверить, что ban/unban команды работают (pfctl -t fail2ban -T add )

Команды-«шпаргалка» (Cheat sheet)

  • Проверить PF: service pf status
  • Проверить правила: pfctl -s rules
  • Показать состояния: pfctl -s state
  • Показать таблицу fail2ban: pfctl -t fail2ban -T show
  • Отобразить pflog: tcpdump -n -e -ttt -r /var/log/pflog

Роли и обязанности (коротко)

  • Системный администратор: отвечает за конфигурацию PF, backup и тестирование правил.
  • Сетевой инженер: проверяет межсетевые соединения и взаимодействие с внешними сетями.
  • Операционный инженер: следит за Fail2ban, логами и реакцией на инциденты.

Модель принятия решения (Mermaid)

flowchart TD
  A[Нужна защита сервера?] -->|Да| B[Есть PF в системе?]
  B -->|Нет| C[Включить PF через /etc/rc.conf]
  B -->|Да| D[Настроить базовую pf.conf]
  D --> E{Открыты ли нужные порты?}
  E -->|Да| F[Установить Fail2ban]
  E -->|Нет| G[Добавить правила для нужных сервисов]
  F --> H[Добавить action pf + table ]
  H --> I[Перезагрузить PF и запустить Fail2ban]
  I --> J[Мониторинг и отладка]
  C --> D
  G --> F

1-line glossary

  • PF: stateful пакетный фильтр для BSD.
  • pflog: интерфейс логирования PF.
  • pfctl: утилита управления PF.
  • Fail2ban: инструмент блокировки IP на основе логов.

Часто задаваемые вопросы

Как отменить блокировку вручную?

Покажите IP в таблице и удалите его:

pfctl -t fail2ban -T show
pfctl -t fail2ban -T delete 1.2.3.4

Где размещать пользовательские правила, чтобы не потерять их при обновлении?

Храните основной pf.conf в /usr/local/etc/pf.conf и делайте резервные копии. Можно включать дополнительные файлы через load or anchor.

Заключение

Интеграция PF и Fail2ban даёт эффективный механизм автоматической блокировки злонамеренных IP на уровне брандмауэра. Соблюдайте осторожность при редактировании правил — всегда проверяйте конфигурацию перед применением и держите резервные копии.

Ссылки

https://www.openbsd.org/faq/pf/index.html

https://www.freebsd.org/doc/handbook/firewalls-pf.html

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро