Не секрет, что настоящую сильную 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
Надеюсь это никому не пригодится. А если пригодится, то надеюсь поможет устоять перед натиском врага. 🙂
Автор, Вы лично пробовали добавлять GeoIP в .htaccess? Как вел себя при этом апач? Нагрузка не росла ли за запредельно? Мне кажется, этот способ вряд-ли подходит для нагруженных проектов…
во-первых, здесь не идет речь ни о нагруженных проектах ни о серьезных DDoS-атаках, во-вторых, прямым текстом указано:
«будет лучше, если заблокировать страну в фаерволе, чтобы не было большой нагрузки на Apache».
Согласен! Если честно, я был поражен самой идеей «GeoIP в .htaccess»…