Инструментом атаки, чаще всего, становятся сети из управляемых злоумышленниками компьютеров, так называемые «ботнеты» (bot-nets).
Численность самых крупных «ботнетов» составляет десятки тысяч компьютеров, расположенных по всему миру. Злоумышленники находят на сайте страницу с наибольшим временем генерации, и нацеливают на нее ботнет. На сервер приходит множество запросов, которые «съедают» все вычислительные мощности, и, в результате, доступ пользователей к сайту становится невозможен.
Самые мощные ботнеты располагаются в крупных странах с большой численностью населения: Индия, Китай, Бразилия и т.д.
Если ваш сайт ориентирован на вполне конкретную языковую группу, например на русскоязычных пользователей Интернета, атаку на него можно значительно ослабить, если сервер перестанет обрабатывать запросы из «нежелательных» стран.
Рассмотрим реализацию защиты от DDoS с помощью GeoIP на примере сервера с операционной системой Debian и веб-сервером Apache2.
Устанавливаем модуль geoip
Перезапускаем веб-сервер
Cкачиваем и устанавливаем свежую GeoIP-базу
wget https://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz gunzip GeoIP.dat.gz mv GeoIP.dat.gz /usr/share/GeoIP
Создаем в корне сайта файл .htaccess со следующим содержимым (в данном случае мы разрешаем доступ к сайту только для России, Украины и сервера к самому себе, а также для IP-адреса 111.222.333.444 (это может быть удобным, когда необходимо исключить из блокировки конкрентые IP-адреса, например адреса поисковых роботов, или ваш собственный IP-адрес)
Order deny,allow SetEnvIf GEOIP_COUNTRY_CODE RU AllowCountry SetEnvIf GEOIP_COUNTRY_CODE UA AllowCountry Deny from all Allow from env=AllowCountry Allow from 111.222.333.444 Allow from 127.0.0.1
После выполнения последнего пункта ваш веб-сервер перестанет обрабатывать запросы из нежелательных стран. В случае с выделенным сервером этих мер может оказаться достаточно для защиты от атаки интенсивностью несколько сотен запросов в секунду.
Но что делать, если у вас не выделенный сервер, а VDS, да еще и не самый мощный?
Ответ прост! Будем снижать нагрузку, не допуская запросы из нежелательных стран до веб-сервера.
Делать это мы будем, анализируя файл error.log атакуемого домена. Именно туда веб-сервер пишет все заблокированные модулем GeoIP обращения к сайту.
Для начала необходимо создать и настроить файл «/root/ddos/ddos.pl». Настройка сводится к редактированию значения переменных в 7—12 строках скрипта.
#!/usr/bin/perl use MIME::Lite; use Date::Format; $email='admin@mysite.ru'; # e-mail, на который будут приходить уведомления о блокировке $domail=0; # 1 - отправлять, 0 - не отправлять уведомления о блокировке на e-mail $host="mysite.ru"; # название сайта, участвует только в заголовке писем-уведомлений $sleep_time=15; # периодичность выполнения скрипта в секундах $ban_time=20800; # длительность блокировки в секундах $log='/var/www/httpd-logs/mysite.ru.error.log'; # полный путь к error.log файлу %banned=(); %ignore=(); $do=1; open(F,") { s/\n//; $ip=(split(/ /,$_))[0]; $time=(split(/ /,$_))[1]; $banned{$ip}=$time; } close (F); open(F,") { s/\n//; $ignore{$_}=1; } close(F); while ($do) { fin: foreach $line(`/usr/bin/tail -100 "$log" | /bin/grep "denied by server" | /usr/bin/awk '{print \$8}' | /usr/bin/sort -n | /usr/bin/uniq -c | /usr/bin/sort -nr`) { ($i,$ip)=split(/ /,trim($line)); $ip=substr($ip,0,-1); if ( !exists($banned{$ip}) and !exists($ignore{$ip}) ) { $banned{$ip}=time; $cmd1 = `/sbin/iptables -v -A INPUT -m tcp -p tcp -j REJECT -s "$ip"`; $datee= time2str("%m/%d/%Y %H:%M", time); $cmd2 = `echo "$datee" "$ip" "$arr{$ip} - $cmd1" >> /root/ddos/ddos.log`; if($domail) { $data="$ip $arr{$ip} $s"; $msg = MIME::Lite->new ( From =>"", To =>$email, Subject =>"Blocked $ip by GeoIP on $host", Data =>$data ); $msg->send; } } } open(F,">/root/ddos/banned2_ip"); foreach $ip (keys %banned) { if (time-$banned{$ip}>$ban_time) { delete($banned{$ip}); `/sbin/iptables -D INPUT -m tcp -p tcp -j REJECT -s $ip`; } else { print F "$ip $banned{$ip}\n"; } } close (F); sleep($sleep_time); } sub trim($) { my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; }
Осталось лишь добавить в планировщик cron задание, которое будет проверять, запущен ли наш блокировщик, а в случае необходимости запускать его.
Для этого создадим файл /root/ddos/ddos_starter.pl со следующим содержимым:
#!/usr/bin/perl $l=`/bin/ps -A | /bin/grep "ddos.pl" | /usr/bin/wc -l`; if (!int($l)) { system("/root/ddos/ddos.pl &"); }
И добавим в crontab строку:
*/1 * * * * /root/ddos/ddos_starter.pl >/dev/null 2>&1
Просмотров: 1642
Все отлично работает по рекамендациям. Однозначно в закладках.
По поводу защиты ждем интересный материал. Пишите отлично получается.