www. 
 .com    .biz    .info    .msk.ru    .net  
 .su    .org    .ru    .spb.ru   .рф 
О компании  Блог  FAQ  Клиенты и отзывы  Официальный твиттер-аккаунт IO-HOSTS
Вход для клиентов:
 Забыли пароль?
На главную Написать письмо в службу поддержки Карта сайта Поиск


Хостинг для всех
популярных CMS!


Репутация: исключительно положительные отзывы от более чем 3000 клиентов за все время работы на рынке.

Супердоступность: самый низкий тариф виртуального хостинга на российском рынке: 63 рубля в год.

Квалификация: штат сертифицированных, вежливых и грамотных системных администраторов.


Фабрика
знаний

Фабрика знаний IO-HOSTS

Знание — это еще не совсем сила, если не иметь соответствующего опыта применения. В этом разделе сотрудники службы поддержки, системные администраторы и другие специалисты IO-HOSTS делятся знаниями и собственным опытом со всеми желающими.

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



31/12/2009: Защита сервера от DDoS с помощью модуля GeoIP для Apache2


Инструментом атаки, чаще всего, становятся сети из управляемых злоумышленниками компьютеров, так называемые «ботнеты» (bot-nets).

Численность самых крупных «ботнетов» составляет десятки тысяч компьютеров, расположенных по всему миру. Злоумышленники находят на сайте страницу с наибольшим временем генерации, и нацеливают на нее ботнет. На сервер приходит множество запросов, которые «съедают» все вычислительные мощности, и, в результате, доступ пользователей к сайту становится невозможен.

Самые мощные ботнеты располагаются в крупных странах с большой численностью населения: Индия, Китай, Бразилия и т.д.

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

Рассмотрим реализацию защиты от DDoS с помощью GeoIP на примере сервера с операционной системой Debian и веб-сервером Apache2.

Устанавливаем модуль geoip
apt-get install libapache2-mod-geoip

Перезапускаем веб-сервер
/etc/init.d/apache2 restart

Cкачиваем и устанавливаем свежую GeoIP-базу
wget http://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


  © 2007—2012 ООО «ИО-ХОСТС».
Лицензии на предоставление услуг №74102, №74221.
     Контактная информация    Наши кнопки    Документы    SLA