Перейти к содержанию

О DDOS

Немного мыслей и практики противодействия D/DOS атакам.

Вас забанят

Нужно понимать, что если вы хоститесь у какого-то мелкого провайдера, скорее всего ваш сервер скинут в блекхол. Его попросту отключат от сети при обнаружении подозрительной сетевой активности, при чем автоматически. И не важно, откуда эта активности была.

Как правило этим занимаются shared-хостинги, у которых на одной ноде не только вы живете.

Если всё таки выжили

Нужно понимать, что настоящей DDOS защитой занимаются специальные компании, которые имеют специально настроенные сетевые фильтры и ПО, которые и помогают противодействовать угрозам. Но всё таки стоит попробовать.

Ниже будет несколько советов противодействия атакам.

Смотрим подключения

В первую смотрим подключения и IP адреса. Вот небольшой Bash скрипт для этого:

netstat -ntu | awk '{print $5}' | grep -vE "(Address|servers|127.0.0.1)" | cut -d: -f1 | sort | uniq -c | sort -n| sed 's/^[ \t]*//' | awk '{if ($1 > 10 ) print$2}';

Здесь стоит лимит на 10 подключений - как правило этого хватает чтобы понять, что это атакующий.

Отсеиваем

Как правило, отсеиваем:

  1. IP адреса Cloudflare и прочих CDN, если они используются. Посмотреть IP Cloudflare можно тут.
  2. Бекенд-сервера и просто сервера, которые активно взаимодействуют с атакованным сервером
  3. Свой IP и IP администраторов. Мы же не хотим остаться без доступов из-за того что кто-то подключался к MySQL?

Баним

По IP

Первое правило - забываем про iptables в плане бана по айпишникам. Причина проста - после ~10к адресов фаервол начнёт жутко тормозить. Вместо этого используем ipset.

Настраиваем IPSet и ставим правило с блокировкой на самый верх:

iptables -A INPUT -m set --match-set <список> src -j DROP

Так же есть смысл забанить целую страну, если это не повредит сервису - например вы работаете на рынок СНГ, а запросы идут с Африки.

Веб приложение

Как правило, на атакующем хосте может стоять веб-сервер (например nginx). Смотрим и анализуем логи, находим урлы на которые чаще всего стучатся или стучались боты и делаем их временный deny или 403.

Важно

При написании скрипта на парсинг логов и поиск вредителей важно парсить его последние ~100 строк. Может быть так, что при атаке лог начнет быстро расти и просто так отпарсить его не получится - это создаст дополнительную нагрузку на атакуемую систему.

Детектим SYN флуд

Суть такой атаки - забить канал связи, и ввести сетевой стек ОС в состояние, когда он не сможет принимать соединения. Суть такой атаки в том, чтобы посылать SYN пакет с несуществующим обратным адресом.

Задетектить SYN флуд легко, это делается через подсчёт полуоткрытых TCP соединений. В обычной ситуации их не должно быть совсем или должно быть небольшое количество.

netstat -na | grep ":1720\ " | grep SYN_RCVD
netstat -na | grep ":443\ " | grep SYN_RCVD

Как обороняться

Увеличиваем очередь полуоткрытых TCP соединений:

sysctl -w net.ipv4.tcp_max_syn_backlog=1024

Уменьшаем время удержания таких соединений, так как они забивают очередь:

sysctl -w net.ipv4.tcp_synack_retries=1

Включаем syncookies:

sysctl -w net.ipv4.tcp_syncookies=1

ICMP-флуд

Суть в забивании канала через отправку ping запросов.

Обороняться просто - можно выключить ответ на запросы ICMP ECHO:

sysctl net.ipv4.icmp_echo_ignore_all=1