Пограничные войны

Автор: | 9 мая 2010

Не секрет, что настоящую сильную DDoS-атаку может отбить (отфильтровать) только серьезная железка [магистрального] провайдера. Бороться своими силами (силами серверной ОСи) можно только с небольшими атаками и с разными другими мелкими неприятностями, как то подбор паролей (брутфорс), наплыв нецелевого траффика (китайцев на русский сайт 🙂 ), взлом сайтов и т.п.

От наплыва посетителей из нежелательных стран можно бороться путем блокирования IP-адреса по коду страны, для этого понядобится установленный GeoIP и следующий  код в файле .htaccess:

SetEnvIf GEOIP_COUNTRY_CODE CN BadCountry
SetEnvIf GEOIP_COUNTRY_CODE TW BadCountry
Order Deny,Allow
Deny from env=BadCountry

Allow from 1.2.3.4 # разрешенный адрес заблокированнй страны
Allow from 2.3.4.5 # разрешенный адрес заблокированнй страны

Можно открыть доступ только определенным странам:

SetEnvIf GEOIP_COUNTRY_CODE UA GoodCountry
SetEnvIf GEOIP_COUNTRY_CODE RU GoodCountry
Order Allow,Deny
Allow from env=GoodCountry
Under Attack: рубим с плеча

Если сайт подвергается DDoS-атаке и вы определили, что все запросы идут из какой-то определенной страны, будет лучше, если заблокировать страну в фаерволе, чтобы не было большой нагрузки на Apache.

 

wget https://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip GeoIPCountryCSV.zip
make -C /usr/ports/www/nginx fetch
tar tvf /usr/ports/distfiles/nginx-0.7.65.tar.gz | grep geo2
tar xvf /usr/ports/distfiles/nginx-0.7.65.tar.gz nginx-0.7.65/contrib/geo2nginx.pl
mv nginx-0.7.65/contrib/geo2nginx.pl . && chmod 700 geo2nginx.pl && rm -rf nginx-0.7.65/
cat GeoIPCountryWhois.csv | ./geo2nginx.pl | grep CN | awk '{print $1}' > ips.list

В файле ips.list мы получим список IP-сетей выбранной страны (в данном случае – Китая/CN).
NB
База данных GeoIP может содержать незначительные погрешности.

Добавляем правило в фаервол, например:

ipfw add deny all from table\(1\) to me

Может оказаться, что система собрана без фаервола, если есть исходники, можем быстренько собрать:

cd /usr/src/sys/modules/ipfw

Редактируем Makefile, нужно раскомментировать строку:

CFLAGS+= -DIPFIREWALL_DEFAULT_TO_ACCEPT

иначе отрубим машину от сети =)
Дальше:

make
cp ipfw.ko /boot/kernel/.
kldload ipfw
cd -

Проверяем:

ipfw show

Должна выводиться строчка "{цифры} allow ip from any to any".

Заливаем список айпишников скриптом:

#!/bin/sh

lips=`cat ips.list`
for f in ${lips}
do
   IP=$f
   /sbin/ipfw table 1 add $IP
done

Можем проверить, блокируются ли забаненные айпишники:

ipfw show

Количество забаненных сетей:

ipfw table 1 list | wc -l

Надеюсь это никому не пригодится. А если пригодится, то надеюсь поможет устоять перед натиском врага. 🙂

Пограничные войны: 3 комментария

  1. Victor

    Автор, Вы лично пробовали добавлять GeoIP в .htaccess? Как вел себя при этом апач? Нагрузка не росла ли за запредельно? Мне кажется, этот способ вряд-ли подходит для нагруженных проектов…

    1. NetSpider Автор записи

      во-первых, здесь не идет речь ни о нагруженных проектах ни о серьезных DDoS-атаках, во-вторых, прямым текстом указано:
      «будет лучше, если заблокировать страну в фаерволе, чтобы не было большой нагрузки на Apache».

Добавить комментарий