Встроенный файрволл 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 неприменимо понятие соединение).