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

Print Friendly, PDF & Email

Задача:

Настроить межсетевой экран 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 

Помогла статья? Есть возможность отблагодарить автора

QR Link:

QR Code

Вам может также понравиться...

комментария 4

  1. Олег:

    echo “11.22.33.44” >> /etc/rc.conf -Ошибочка, однако 😉

  2. zizmo:

    Кхм… echo “11.22.33.44” >> /etc/pf.conf 😉

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *