В этой статье я расскажу вам немного про конфигурацию фаервола PF на базе FreeBSD. Данная статься является продолжением предыдущей статьи. На самом деле конфиг PF очень интересно структуризирован. ОН делиться на секции и все они должны идти в строгом порядке и не должны ни в коем случае пересекаться между собой. Ниже я приведу пример конфигурации PF с своего сервера, с комментариями. Политика данной конфигурации блокируем все, разрешаем только нужное. Так как это боевой сервер, то порты будем открывать только необходимые. Для которых в конфиге указаны таблицы по протоколам. Так же отключены все ненужные icmp запросы. Так как на хостинг бывают ddos атаки в конфиге присутствует таблица куда попадают и блочатся те кто превысил лимиты при запросах на 80 порт. То же самое делаем и с почтой. Присутствует защита от спуфинга, так как при атаках зачастую используются несуществующие ip.
ext_if = "bce0" ## внешка
int_if = "bce1" ## локалка
lan="192.168.0.0/24" ## локальная подсетка
tcp_services="{ 20, 21, 22, 25, 80, 53, 110, 143, 443, 3306, 8080 }" ## tcp порты использующиеся на сервере
udp_services="{ 53, 514 }" ## udp порты использующиеся на сервере
ispmgr_services="{ 1500 }" ## порт ispmanager
icmp_types="{ echoreq, unreach}" ## разрешенные icmp типы запросов
table {77.77.77.77} ## таблица разрешенных ip
table persist ## таблица куда заносим уродов ддосеров
table persist ## таблица уродов для pop3, которые долбятся на почту
set block-policy drop ##сбрасываем соединение грубо
set skip on lo0 ## полностью пропускаем проверку на петле
set skip on $int_if ## полностью пропускаем проверку на интерфейсе,
set loginterface $ext_if ## включаем логирование на интерфейсе
set optimization normal ## оптимизация
scrub in all ## нормализуем все входящие пакеты на всех интерфейсах
scrub on $ext_if all reassemble tcp
nat on $ext_if from $lan to any -> $ext_if ## проброс NAT внутри сеть
antispoof quick for $ext_if ## правило для антиспуфинга
block in log all ## блокируем вход
block out log all ## блокируем выход
pass quick on lo0 all ## разрешаем петлю
pass quick on $ext_if from to $ext_if keep state ## разрешаем вайтлисту без обработки
block in quick on $ext_if from to any ## блочим всех кто попался в таблицу white_list
pass in on $ext_if proto tcp from any to $ext_if port $tcp_services flags S/SA keep state ## разрешаем с внешки ломится на разрешенные tcp порты
pass in on $ext_if proto tcp from any to $ext_if port www flags S/SA synproxy state ## чистим траф www от SYN flood
pass in on $ext_if proto tcp from any to $ext_if port $ispmgr_services flags S/SA keep state ## пропускаем ispmanager
pass in on $ext_if proto tcp to $ext_if port www flags S/SA keep state (max-src-conn-rate 5/2, overload flush) ## www режим тех кто превысил лимиты и ложим в таблицу
pass in on $ext_if proto tcp to $ext_if port ftp flags S/SA keep state ( max-src-conn 400, max-src-conn-rate 400/2, overload flush) ## ftp режим тех кто превысил лимиты и ложим в таблицу
pass in on $ext_if proto tcp from any to $ext_if port pop3 flags S/SA keep state (max-src-conn-rate 15/60, overload flush) ## флюшкаем уродов по лимитам которые ломятся безможно на почту
pass in on $ext_if proto udp from any to $ext_if port $udp_services keep state ## пропускаем udp на разрешенные порты
pass in on $ext_if inet proto icmp all icmp-type $icmp_types keep state ## разрешаем только некоторые типы icmp
pass in quick on $ext_if proto tcp from any to any port 20 flags S/SA keep state ## разрешаем 20 порт для ftp
pass in quick on $ext_if proto tcp from any to any port 21 flags S/SA keep state ## разрешаем 21 порт для ftp
pass in quick on $ext_if proto tcp from any to any port > 49151 keep state ## разрешаем порты выше 49151 для passive FTP mode
pass out on $ext_if proto tcp all modulate state flags S/SA ## разрешаем все модуляции для исходящих tcp соединений
pass out on $ext_if proto {tcp, udp, icmp } all keep state ## разрешаем исходящие протоколы
Исходя из этого конфига можно по кусочку собрать что то под себя, допустим для того же роутера. Так же полезные команды для PF: Включение фаервола
pfctl -e
Отключение фаервола
pfctl -d
Загрузка новой конфигурации (путь может быть любой)
pfctl -f /etc/pf.conf
Проверка ошибок конфига
pfctl -nf /etc/pf.conf
Загрузить только NAT правила
pfctl -Nf /etc/pf.conf
Применить только фильтрующие правила
pfctl -Rf /etc/pf.conf
Вся информация PF
pfctl -sa
Статистика
pfctl -si
Активные правила фильтрации
pfctl -sr
Активные правила NAT
pfctl -sn
Посмотреть тех кто находится в таблице (где table_name - это имя вашей таблицы)
>pfctl -t table_name -T show
Посчитать колличество ip в таблице
pfctl -t table_name -T show | wc -l
Еще хотел сказать по поводу логов. Так как PF пишет их в бинарном формате то так просто вы их не посмотрите, просмотреть их можно следующей командой.
tcpdump -n -e -ttt -r /var/log/pf.log
11,308 всего просмотров, 3 за сегодня