?

Log in

No account? Create an account

Entries by tag: pf

Защита сервера от простых DOS
rubuntu
Введение.

Атаки типа DOS бывают различными. Здесь рассмотрю одну популярную атаку.
Смысл этой атаки заключается в создании большого количества соединений в которые ничего не передается, а которые просто висят открытыми продолжительное время. При этом атакующий постоянно пытается открыть новые. Соединения создаются на один открытый порт и соответственно от одного клиента. На каждое такое соединение запускается обработка его с помощью соответствующего ПО, которое использует до нескольких мегабайт памяти на каждое соединение. Таким образом 500 соединений пусть даже и по 2 мб, съест на сервере 1Гб оперативной памяти, а если их создавать быстро то еще и процессорное время и так вплоть до того что сервер перестает отвечать на запросы.
Программы которые это делают достаточно распространены, пользоваться ими просто, поэтому любой человек чуть знакомый с компьютерами может ей воспользоваться. Кроме этого для таких типов атак достаточно очень слабого интернет канала, буквально в несколько кб/c. Учитывая эти два фактора вашему серверу могут доставить серьезные неудобства.

Защита.

Поняв как работает атака достаточно ограничить количество соединений от одного клиента.
Для удобства зададим макросы:
port = "{ smtp http https ssh }"
int_wan="em0"

Собственно само правило:
pass in quick on $int_wan proto tcp to $int_wan port $wan_port keep state (max 1000, source-track rule, max-src-nodes 500, max-src-states 10)

pass in quick
Означает, что как только это правило сработало для пакета - остальные уже не проверять. Это может сэкономить ресурсы.
on $int_wan proto tcp to $int_wan port $wan_port
Описывается, что все пакеты которые пришли на интерфейс $int_wan по протоколу tcp откуда угодно для ip адреса который присвоен интерфейсу $int_wan на порт $wan_port.
keep-state
Сохранять информацию о состояние соединения. Это тоже помогает сэкономить ресурсы сервера при повторном выполнении этого правила. Замечу, что это можно и не писать, т.к. в данный момент keep state по-умолчанию применяется ко всем правилам.
max 1000
Говорит, о том, что максимальное количество состояний (state) которое может создать это правило - 1000. Если достигнуто это количество, то новые состояния не будут создаваться и новые пакеты не будут соответствовать этому правилу.
source-track rule
Максимальное количество записей состояний созданных правилом ограничивается опциями max-src-nodes и max-src-states. Т.е. подсчет состояний идет локально для правила. Можно написать source-track global - ограничение количества записей созданных всеми правилами, которые используют эту опцию и подсчет состояний будет вестись глобально для всех правил.
max-src-nodes 500
Когда используется опция source-track, опция max-src-nodes ограничивает количество исходных IP адресов, которые могут одновременно создать соединение. Эта опция может быть использована только с опцией source-track rule. Не относится к защите от нашей атаки, но эта опция весьма полезна.
max-src-states 10
Когда используется опция source-track, опция max-src-states ограничивает количество одновременно созданных соединений с одного исходного IP адреса. Это и есть нужная нам опция для защиты. Слишком малое число тоже не стоит ставить, т.к. клиенты часто создают несколько соединений для быстрой работы.
Безусловно, требуется вручную подобрать значения соответствующие задачам Вашего сервера и его ресурсами. Кроме этого можно дополнительно "оттюнинговать" различными timeout`ами и дополнительными правилами, которые могут запоминать атакующих и блокировать их, но эта тема отдельного разговора.

P.S. Статья написана для FreeBSD и PF.