Как стать автором
Обновить

Комментарии 15

Пакет на localhost после этой команды
set skip on lo0
пропускается или обрабатывается дальше?
Эта опция указывает PF полностью пропускать трафик на интерфейсе lo0. Пакет просто уйдет в ядро без проверки.
— Не вижу про States table. Частый вопрос «я применил правила, а они не работают» — как раз про states.
— Про Policy routing добавить бы в обзор не мешало, как раз к меткам суперспособность.
Это — просто маленькая обзорная статья. Всё будет. В данный момент планы на 5-6 статей. Там разбор фильтрации, states, NAT, Policy Based Routing, ALTQ и так далее. Если будет время и интерес, то так же разберем, как FreeBSD обрабатывает пакеты в целом, в том числе маршрутизацию.
Очень недурно будет, если вы упомянете очерёдность работы фаерволов(pf/ipfw/ipfilter), а лучше всего, если покажете где в цепочке обработки трафика ядром они встраиваются.
Исходящие соединения разрешены правилами
pass out

но ведь его нет в листинге
а есть только разрешение ходить по портам из списка на внешние хосты, кстати тоже непонятно зачем
вобщем конфиг вызывает одни вопросы

Понял. Входящие соединения разрешаются правилами pass in
pass in proto tcp to port { $permit_tcp_ports }
Так же нашему серверу в вакууме нужно уметь ходить до api (например до офисной crm и трекера) и синхронизировать время.
Ну и вообще — это просто конфигурация, описывающая конфигурацию фильтрации входящих и исходящих соединений + макросы. Я писал, это сферический конфиг в вакууме. В следующих статьях будут разобраны более сложные примеры.

Я наверное не верно настраиваю тк меня его проходят и дальше убивают машины.
Вы хоть написали бы как настраивать грамотно. Вроде все блочу… Как то проходят.
Статья банальная. Фряху не советую обычному юзеру, запутаптся в командах, Debian или арч пусь себе ставит.
Через мою пфку просто меня досят, я гайки затянул что инет упал в 10 раз до 5 мб… И все равно проходят… Печаль…
Не думайте я ещё тот фряшник, меня даже из группы выгнали. Т. е. я всеми руками за систему она сильная но даже снорд говорю не понацея. Если так говорить то и цеску дайте её пройдут по этому нужны конфиги. А так это все… Это тоже самое что гайд с оф сайта вывести или список команд. Это и так все знают.

В следующей статье будет подробный разбор фильтрации. Собственно возьмем тот недоконфиг, что я привёл в статье, и будем развивать. Статья банальная именно потому, что вводная.
Обычному юзеру на десктоп — понятное дело, фрю не надо. А вот на сервер — уже не так очевидно. Если железо поддерживается, или вообще виртуалка, то особой разницы нет. А с точки зрения целостности системы и единообразия подхода ко всему на свете FreeBSD даст 100 очков форы любому дистрибутиву Linux.
Проблема dos атак в том, что, зачастую, с точки зрения файрволла, это вполне легитимный трафик. Для защиты от такого необходимо ставить что-то 7 уровня, либо реверс-прокси, либо suricata… Собственно мы в ИКС используем suricata. Если же у вас DDOS, то вообще всё скверно, потому что входящим трафиком, который прилетает из шнурка провайдера, мы не управляем.

Подскажу еще пару интересных правил, разберитесь в них:
тут em0 — ваш ван интерфейс


# Macros
int_if0 = "em0" # WAN
icmp_types = "{ echoreq, unreach }"
tcp_services = "{ ssh, smtp, domain, www, pop3, auth, https }"
udp_services = "{ domain, ntp }"
# Tables
table <rfc6890> { 0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 \
                  172.16.0.0/12 192.0.0.0/24 192.0.0.0/29 192.0.2.0/24 192.88.99.0/24 \
                  192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 \
                  240.0.0.0/4 255.255.255.255/32 }
table <bruteforce> persist

# Scrub
scrub in all fragment reassemble max-mss 1440

# Rules
antispoof quick for $int_if0
block in quick on $int_if0 from <rfc6890>
block return out quick on egress to <rfc6890>
block all

## WEB (Out)
pass out proto tcp to port $tcp_services
pass proto udp to port $udp_services

## SSH (in)
pass in on $int_if0 proto tcp to port { 22 } \
    keep state (max-src-conn 10, max-src-conn-rate 3/1, \
        overload <bruteforce> flush global)

## ICMP (Out Ping)
pass out inet proto icmp icmp-type $icmp_types

## (Out Tracerout)
pass out on $int_if0 inet proto udp to port 33433 >< 33626

## NTP
pass quick inet proto { tcp, udp } to port $udp_services
Да, именно так. В том числе ограничение количества подключений и защита от спуфинга — в следующей статье. Не забудем и устаревание адресов в таблице bruteforce. Однако table rfc6890 у Вас, на мой взгляд, довольно неоднозначна. У провайдера может быть серая сеть за внешним интерфейсом сервера. Например сервер бэкапов. Или внутренняя нетарифицируемая меж-серверная сеть, годная для обмена данными внутренних ресурсов.

Таблицы могут заполняться из файлов, содержащих список адресов IP и сетей либо два раздельных списка для адресов и сетей
атрибут persist — заставляет ядро сохранять таблицу в памяти, даже когда никакие правила к ней не обращаются. Без этого атрибута, ядро автоматически удалит таблицу, когда последнее правило, ссылающееся на нее будет отработано.


table <network_provider> persist file "/etc/network_provider"
table <address_provider> persist file "/etc/address_provider"
Файл /etc/network_provider
10.0.0.0/8
Файл /etc/address_provider
172.16.0.100

Разрешающие правила для сетей и адресов провайдера


pass in quick on $int_if0 from <network_provider>
pass in quick on $int_if0 from <address_provider>

Либо прямо в таблице используя модификатор отрицания это символ — ! "не" исключить нужные адреса либо сети провайдера из обработки


table <rfc6890> { 172.16.0.0/12, !172.16.0.100, !172.16.1.0/24 }
Зарегистрируйтесь на Хабре, чтобы оставить комментарий