Настраиваем файрвол PF (Packet Filter)

Задача:
---------------------------------------------------------------Настроить межсетевой экран PF (Packet Filter) на операционной системе FreeBSD.
Packet Filter из OpenBSD был портирован в FreeBSD в июле 2003. PF — это полноценный межсетевой экран с поддержкой ALTQ (Alternate Queuing). ALTQ предоставляет управление пропускной способностью Quality of Service (QoS).
Первым делом, проверим наличие PF в автозапуске
root@/:/usr/share/examples/pf # cat /etc/rc.conf | grep pf pf_enable="YES" pflog_enable="YES" pflog_logfile="/var/log/pflog" pf_rules="/etc/pf.conf" root@/:/usr/share/examples/pf #
При отсутствии добавляем файрвол в автозагрузку и активируем логирование
echo "pf_enable='YES'" >> /etc/rc.conf echo "pflog_enable='YES'" >> /etc/rc.conf echo "pflog_logfile='/var/log/pflog'" >> /etc/rc.conf echo "pf_rules='/etc/pf.conf'" >> /etc/rc.conf
Примеры конфигов можно найти по адресу:
root@ws1:/ # ls -1 /usr/share/examples/pf ackpri faq-example1 faq-example2 faq-example3 pf.conf queue1 queue2 queue3 queue4 spamd root@ws1:/ #
тут более подробно
man pf.conf
Настройка конфига. Синтаксис написания правил PF (pf.conf)
{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, флаги соединения и т.д.
Вот пример простого конфига, который можно использовать для веб-сервера
root@/:/etc # cat /etc/pf.conf
#
# info:
# pfctl -t banip -T show
#
# Add ban:
# pfctl -t banip -T add 111.222.333.444
# pfctl -t banip -T del 111.222.333.444
# restart:
# pfctl -d
# pfctl -ef /etc/pf.conf
ext_if="vtnet0"
# Anchor for fail2ban
#anchor "f2b/*"
set skip on lo
set optimization normal
set block-policy drop
tcp_services = "{22, 80, 443}"
#udp_services="{ 53 }"
icmp_types="{ echoreq, unreach}"
scrub in all
scrub on $ext_if all reassemble tcp
antispoof quick for $ext_if
table <private> const { 10/8, 172.16/12, 192.168/16 }
table <banip> persist
table <blockip> persist file "/etc/pf.blockip"
block return in quick on $ext_if from { <private>, <blockip>, <banip> } to any
block in all
pass out all
pass in quick on $ext_if inet proto tcp from any to $ext_if port $tcp_services
#pass in on $ext_if proto udp from any to $ext_if port $udp_services keep state
pass in on $ext_if inet proto icmp all icmp-type $icmp_types keep state
Для этого конфига необходимо создать файл в который будем записывать адреса заблокированных IP
root@/:/etc # touch /etc/pf.blockip
Заблокируем IP адресс и сразу активируем блокировку
echo "11.22.33.44" >> /etc/pf.blockip pfctl -ef /etc/pf.conf
Примеры команд для просмотра логов:
tcpdump -nettti pflog0 tcpdump -netttr /var/log/pflog tcpdump -n -e -ttt -r /var/log/pflog port 2323 tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3 tcpdump -n -e -ttt -i pflog0 host 192.168.4.2 tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0
Запускаем файрвол
pfctl -ef /etc/pf.conf

echo «11.22.33.44» >> /etc/rc.conf -Ошибочка, однако 😉
Спасибо, подправил. Думал одно, печатал другое 🙂
Кхм… echo «11.22.33.44» >> /etc/pf.conf 😉
Спасибо, исправил )
печатал одно, думал другое 😉