Не секрет, что настоящую сильную DDoS-атаку может отбить (отфильтровать) только серьезная железка [магистрального] провайдера. Бороться своими силами (силами серверной ОСи) можно только с небольшими атаками и с разными другими мелкими неприятностями, как то подбор паролей (брутфорс), наплыв нецелевого траффика (китайцев на русский сайт 🙂 ), взлом сайтов и т.п.
От наплыва посетителей из нежелательных стран можно бороться путем блокирования IP-адреса по коду страны, для этого понядобится установленный GeoIP и следующий код в файле .htaccess:
1 | SetEnvIf GEOIP_COUNTRY_CODE CN BadCountry |
2 | SetEnvIf GEOIP_COUNTRY_CODE TW BadCountry |
4 | Deny from env =BadCountry |
Можно открыть доступ только определенным странам:
1 | SetEnvIf GEOIP_COUNTRY_CODE UA GoodCountry |
2 | SetEnvIf GEOIP_COUNTRY_CODE RU GoodCountry |
4 | Allow from env =GoodCountry |
Under Attack: рубим с плеча
Если сайт подвергается DDoS-атаке и вы определили, что все запросы идут из какой-то определенной страны, будет лучше, если заблокировать страну в фаерволе, чтобы не было большой нагрузки на Apache.
1 | wget https://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip |
2 | unzip GeoIPCountryCSV.zip |
3 | make -C /usr/ports/www/nginx fetch |
4 | tar tvf /usr/ports/distfiles/nginx-0.7.65. tar .gz | grep geo2 |
5 | tar xvf /usr/ports/distfiles/nginx-0.7.65. tar .gz nginx-0.7.65/contrib/geo2nginx.pl |
6 | mv nginx-0.7.65/contrib/geo2nginx.pl . && chmod 700 geo2nginx.pl && rm -rf nginx-0.7.65/ |
7 | cat GeoIPCountryWhois.csv | ./geo2nginx.pl | grep CN | awk '{print $1}' > ips.list |
В файле ips.list мы получим список IP-сетей выбранной страны (в данном случае – Китая/CN).
NB
База данных GeoIP может содержать незначительные погрешности.
Добавляем правило в фаервол, например:
1 | ipfw add deny all from table\(1\) to me |
Может оказаться, что система собрана без фаервола, если есть исходники, можем быстренько собрать:
1 | cd /usr/src/sys/modules/ipfw |
Редактируем Makefile, нужно раскомментировать строку:
1 | CFLAGS+= -DIPFIREWALL_DEFAULT_TO_ACCEPT |
иначе отрубим машину от сети =)
Дальше:
2 | cp ipfw.ko /boot/kernel/. |
Проверяем:
Должна выводиться строчка "{цифры} allow ip from any to any".
Заливаем список айпишников скриптом:
7 | /sbin/ipfw table 1 add $IP |
Можем проверить, блокируются ли забаненные айпишники:
Количество забаненных сетей:
1 | ipfw table 1 list | wc -l |
Надеюсь это никому не пригодится. А если пригодится, то надеюсь поможет устоять перед натиском врага. 🙂
Автор, Вы лично пробовали добавлять GeoIP в .htaccess? Как вел себя при этом апач? Нагрузка не росла ли за запредельно? Мне кажется, этот способ вряд-ли подходит для нагруженных проектов…
во-первых, здесь не идет речь ни о нагруженных проектах ни о серьезных DDoS-атаках, во-вторых, прямым текстом указано:
«будет лучше, если заблокировать страну в фаерволе, чтобы не было большой нагрузки на Apache».
Согласен! Если честно, я был поражен самой идеей «GeoIP в .htaccess»…