Есть ли жизнь под DDoS-ом? Докучаев Дмитрий aka Forb Хакер, номер #081, стр. 081-066-3 close f; system("/sbin/ipfw -q add 13 deny ip from $ip to me"); }}} Думаю, в этом коде ты сможешь разобраться и без дополнительных комментариев. Тем более что работу сценария я уже описал. Лимит соединений в моем случае был равным семерке. Помимо основной функции, скрипт выводит статистику соединений, чтобы администратор знал, кто в данный момент его атакует :). [изучаем журналы] Но и этот прием не дал стопроцентной защиты от атаки. Через пару часов показатель нагрузки реально снизился на 40%, апач перестал тормозить, но все равно чувствовалось, что атака продолжается. Причем, надо отметить, что стандартный файрвол успешно справлялся с натиском неприятеля, просто существовали какие-то специальные боты, которым удавалось обходить хитроумный скрипт. И я обнаружил этих ботов всего за несколько минут :). Для этого мне пришлось включить опцию verbose в моем фаерволе ipfw. Это делается простой командой sysctl -w net.inet.ip.fw.verbose=1. Затем я создал небольшое правило, обрабатывающее все пакеты. Данный рулес должен опережать по номеру правило, которое запрещает весь трафик на машину. Я выбрал в качестве идентификатора число 50000. Сама команда добавления выглядела следующим образом: ipfw add 50000 count log logamount 0 ip from any to me 80 Теперь можно было приступить к анализу файла /var/log/security. Туда, по умолчанию, стали записываться все обращения к серверу на 80 порт. Немного переделав вышеописанный сценарий, я стал перечитывать фиксированный фрагмент лога (командой tail -1000 /var/log/security) и брать оттуда число обращений. Результат не заставил себя долго ждать - всего после 2-3 запусков нагрузка на сервер вновь упала. Но подобным методом нельзя было защититься на все 100%, потому как за время своей работы скрипт уже успел забанить 20-30 легальных посетителей ресурса :). Это объясняется тем, что обычный пользователь при определенных условиях вполне может превысить мой лимит обращений (при обновлении страницы или при слабом канале). Вышеописанной защитой я пользовался три дня. За это время, как я уже говорил, в бане файрвола накопилось порядка сотни добропорядочных пользователей. Запускать сценарий приходилось три-четыре раза в день. Подобная защита, несомненно, действовала, но доверять ей на все сто процентов было нельзя. Поэтому я решил разработать новый вариант протекта против DDoS-атаки. В этом мне очень помогла система журналирования Apache. Мне захотелось посмотреть на запросы, которые боты посылают WWW-серверу. Как оказалось практически все реквесты были одинаковыми и неотличимыми от пользовательских. На первый взгляд в запросе фигурировал Referer, правильно оформленное обращение на рандомную, но существующую страницу и реальный UserAgent. Однако последнее поле заставило меня усомниться в правильности запроса. В большинстве залогированных строк UserAgent имел префикс Win 98.x. Видимо это и была единственная отличительная черта обычных реквестов от вражеских. В моей голове уже родился план новой защиты сервера от ботов. И уже через 15 минут я его реализовал в виде компактного Perl-сценария. Грех не привести его исходный код, потому как многим администраторам он пригодится. |