Настройка PF и Fail2ban на FreeBSD 12.0
Введение
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 включён, но пока не стартует до тех пор, пока вы не создадите правила.

Шаг 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) открыт в правилах перед применением.

Для просмотра правил используйте:
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
Шаг 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.

Шаг 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 включён и конфигурация успешно проходит service pf check
- Правила загружены (pfctl -s rules показывает ожидаемые записи)
- Fail2ban запущен и в логе видно добавление IP в таблицу fail2ban
- Запреты применяются немедленно (pfctl -t fail2ban -T show)
Тесты и сценарии приёмки
- Попытка нескольких неуспешных подключений по SSH с тестового IP (до превышения maxretry). Ожидается: запись в /var/log/auth.log, затем добавление IP в pfctl -t fail2ban -T show.
- Проверка доступности служб: ping, SSH (разрешён), HTTP (если открыт).
- Перезагрузка сервиса 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 на уровне брандмауэра. Соблюдайте осторожность при редактировании правил — всегда проверяйте конфигурацию перед применением и держите резервные копии.
Ссылки
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента