У меня есть сайт с 1 ГБ VPS, работающий на Ubuntu 10.04 LTS. Я использую nginx в качестве веб-сервера. Сайт работает в относительно стабильной конфигурации в течение трех лет и обрабатывает около 4 миллионов просмотров страниц в месяц.
В течение последних 16 часов я наблюдал, как мне кажется, "умеренную" DDoS-атаку. Исходящий трафик увеличился в 5 раз, а загрузка ЦП увеличилась примерно втрое. Я вижу в своих журналах nginx один или два IP-адреса, которые каждую секунду отправляют несколько запросов одновременно (1-10 каждый). Эти запросы, похоже, идут не на мой URL-адрес, а напрямую на мой IP-адрес. Поскольку мне удобнее работать с nginx.conf, я установил там отдельный серверный блок "по умолчанию", чтобы улавливать этот трафик и регистрировать его. Я настроил его на регистрацию этого трафика и возвращение ему кода ошибки 444. Я также установил limit_req_zone и limit_conn_zone для этого трафика, хотя, поскольку это разные IP-адреса, отправляющие запросы, это мало влияет. Вот соответствующий раздел nginx.conf:
limit_req_zone $binary_remote_addr zone=ddos:25m rate=1r/m;
limit_conn_zone $binary_remote_addr zone=blockedfuckers:20m;
server {
listen 80 default_server;
server_name _;
access_log /var/log/nginx/a2.log hackers;
limit_req zone=ddos nodelay;
limit_conn blockedfrakers 1;
return 444;
}
Это снизило загрузку ЦП примерно на 30%, но исходящий трафик по-прежнему высок, а ЦП по-прежнему в два раза больше нормы. По какой-то причине журнал показывает, что отправляемые запросы представляют собой ответ 400, а не 444, которые я пытаюсь отправить. Например:
109.198.195.28 [12/Mar/2013:22:49:24 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
107.199.204.111 [12/Mar/2013:22:49:36 -0400], REQLENGTH: 0, STATUS: 400, HTTPHEADER: -
Мне они кажутся «пустыми» запросами, поэтому я пытаюсь настроить iptables так, чтобы они просто отбрасывались, но несколько вещей, которые я пробовал, не сработали. Есть идеи, как я могу настроить таргетинг и отбросить этот трафик?
Если вы уверены, что полезная нагрузка TCP равна 0, вы можете попробовать с параметром --length iptables. Эти параметры соответствуют полезной нагрузке уровня 3. Это правило должно работать:
iptables -I INPUT -p tcp --dport 80 -m length --length 20 -j DROP
Размер заголовка TCP обычно составляет 20 (может быть и больше, но попробуйте с 20 и посмотрите результаты). Таким образом, это правило отбрасывает пакеты, которые содержат только пакет с заголовком TCP и без полезной нагрузки.