Анти DDOS для веб-сервера FreeBSD

Встроенный файрволл FreeBSD позволяет защищать сервер от DDOS-атак, связанных с созданием большого числа подключений на какой-либо порт (к примеру 80). Под катом инструкция, как эту функцию задействовать – с конфигом и комментариями.

Конфиг файрволла с функцией анти-DDOS должен начинаться примерно так, файл /etc/pf.conf:

# создаем в памяти таблицу ddos, в которой будут храниться шаловливые ip-адреса
table <ddos> persist                   

# политика фильтрации - Default Deny, т.е. запрещаем все, что не разрешено
block log all

# чтобы случайно не самозабаниться, 83.246.222.22 - наш ip-адрес
pass in quick from 83.246.222.22

# блокируем ip-адреса из черного списка
block in quick from <ddos>

pass in proto tcp from any to self port 80 keep state \
  (max-src-conn 50, max-src-conn-rate 15/5, overload <ddos> flush)

Последнее правило следует понимать так – пропускаем соединения на 80 порт, при этом для каждого ip-адреса запоминаем количество подключений и считаем скорость его подключений. Ежели с одного ip-адреса поступит более 50 соединений, или количество соединений превысит 15 за интервал времени в 5 секунд, то забанить.

К слову, число соединений можно посмотреть с помощью командочки (sS – show Sources):

# pfctl -sS
192.168.0.1 -> 0.0.0.0 ( states 2, connections 2, rate 0.0/0s )
192.168.1.2 -> 0.0.0.0 ( states 15, connections 15, rate 0.0/0s )
192.168.1.4 -> 0.0.0.0 ( states 7, connections 7, rate 0.0/0s )
192.168.1.7 -> 0.0.0.0 ( states 11, connections 9, rate 0.0/0s )
192.168.1.18 -> 0.0.0.0 ( states 16, connections 16, rate 0.0/0s )

Посмотреть таблицу забаненных:

# pfctl -t ddos -T show
   13.13.13.13

Снять бан с определенного ip-адреса:

# pfctl -t ddos -T delete 13.13.13.13
1/1 addresses deleted.

Либо можно амнистировать все адреса:

# pfctl -t ddos -T flush

В завершение, однострочник, выводящий сводную статистику по количеству соединений:

pfctl -sS | grep -v connections\ 0 | awk '{printf "%5d %s\n",$8,$1}' | sort

В выводе pfctl -sS сначала идет статистика по udp, потом по tcp, вот поэтому сначала отфильтровываем по connections 0 (к UDP неприменимо понятие соединение).

Похожие статьи

Leave a Reply

Your email address will not be published. Required fields are marked *