Защита от Ддос с помощью Nginx и модуля Geoip (ограничение по странам)

Тема в разделе "Защита от Ddos-атак", создана пользователем Devider, 28 авг 2013.

  1. Ботнеты, используемые в дешевых (или "школьных") ддос-атаках состоят почти на 100% из иностранных IP-адресов: там может быть много зараженных китайских, иранских, иракских, индонезийских машин. Русские провайдеры более-менее реагируют на абузы, поэтому ддос русскими ботами сопоставим с некоторыми потерями для ддосера, а значит стоит дороже.

    Спрашивается, зачем нам пускать на сервер IP азиатских стран или даже фильтровать такой траффик, когда его можно целиком перекрыть. Один из таких способов: привязка к серверу Nginx модуля Geoip, что позволит указать в настройках список разрешенных или запрещенных стран.

    1) Итак, первым делом устанавливаем Nginx и модуль Geoip.

    2) Далее идем на страницу http://www.maxmind.com/app/geolitecountry и скачиваем latest GeoLite Country Binary Format, это бесплатный вариант базы стран и соответствующих им блоков IP адресов. Распаковываем архив и кидаем файл GeIP.dat в папку /usr/local/etc/nginx/conf/geo (FreeBSD) или /etc/nginx/conf.d (CentOS) . Осталось отредактировать конфиги nginx.

    Открываем nginx.conf, дописываем в секцию http следующий блок директив:
    Код:
    geoip_country /usr/local/etc/nginx/conf/geo/GeoIP.dat; # подключаем GeIP базу
    map $geoip_country_code $bad_country { # модуль map создает переменные, значения которых зависят от других переменных, очень полезная штука
    default 1; # значение по умолчанию
    include geo/good_countries; # инклудим файл, к нему вернемся чуть позже
    }
    
    Этот блок map, означает, что все страны находящиеся в базе данных, являются запрещенными по умолчанию, а в файле good_countries, будут перечислены разрешенные страны. Если у вас например ситуация, когда разрешенных стран больше чем запрещенных, можно легко инвертировать данную логику и создать файл bad_countries со списком запрещенных стран, разрешив все остальные.

    Теперь настройки хоста. Я предпочитаю держать хосты в отдельной папке, например hosts, каждый в своем файле.

    Код:
    server {
    listen IP:80;
    server_name testhost.com;
    
    if ($bad_country){ # если данная переменная установлена, то есть если страна не перечислена в файле good_countries
          return 444; # выдаем клиенту пустой ответ ( незачем отдавать 403 ошибку или еще какую-либо )
    }
    
    }
    Теперь вернемся к файлу good_countries. Тут все предельно просто, коды стран, которым разрешен доступ на сайт, перечислены в следующем формате:

    Код:
    TM 0;
    UA 0;
    UZ 0;
    RU 0;
    Чтобы изменения вступили в силу нужно перезагрузить Nginx:
    Код:
    /etc/init.d/nginx reload 
    Проверить, работает geoip модуль или нет, можно, удалив из списка разрешенных стран свою, и попробовав зайти на сайт.


    В основу материала взята статья: http://gnu.su/news.php?extend.1453
     
    Последнее редактирование модератором: 15 авг 2014
    28 авг 2013
  2. судя по статистике QRATOR, опубликованной где-то на хабре
    такой метод защиты становится с каждым годом все менее и менее эффективным, т.к. чаще начинают использовать ботнеты из России
     
    16 июн 2014
  3. По России Netcraft nginx обслуживал или проксировал 19.21% самых нагруженных сайтов в июне, в т.ч. соцсети. Жаль, что культура - кто кого остается неизменной - так что будем ждать nginx 2...
     
    25 июн 2014
  4. Его можно использовать в связке с другими методами.

    Кроме того, русские ботнеты дороже и их можно абузить.

    А QRATOR, как и подобные конторы, зарабатывают деньги в том числе на незнании клиентов. Простая настройка Nginx могла бы уберечь многих владельцев сайтов от лишних трат. И наивно думать, что антиддос-сервисы будут помогать им в этом.
     
    Последнее редактирование: 29 авг 2014
    15 авг 2014
  5. Вы конечно извините за нубские вопросы но подскажите пожалуйста куда кидать архив в убунту 10.04 и вместо testhost.com писать свой сайт я правильно понял?
     
    29 авг 2014
  6. Это не важно, главное в конфиге прописать путь до модуля. Можно разместить его в папке с Nginx, в Ubuntu (как и в Centos и Debian) он находится в папке etc/nginx. Создадим в этой папке подпапку GeoIP и пропишем путь в etc/nginx/nginx.conf:
    Код:
    geoip_country /etc/nginx/GeoIP/GeoIP.dat; # подключаем GeIP базу
    map $geoip_country_code $bad_country { # модуль map создает переменные, значения которых зависят от других переменных, очень полезная штука
    default 1; # значение по умолчанию
    include geo/good_countries.txt; # инклудим файл, к нему вернемся чуть позже
    }
    Где good_countries.txt будет содержать коды стран.
    Код:
    TM 0;
    UA 0;
    US 0;
    UZ 0;
    RU 0;
    BY 0;
    NL 0;
    GE 0;
    
    Можно составить список стран, основываясь на данных геотаргетинга счетчика (в любом счетчике есть статистика заходов по странам). Буквенные обозначения стран можно посмотреть здесь.

    Чтобы не нагружать сервер мы отдаем клиенту пустой ответ. Но можно отдавать страницу с сообщением о ддос-атаке и даже формой обратной связи, чтобы пользователь мог сообщить о недоступности сайта.
     
    Последнее редактирование: 29 авг 2014
    29 авг 2014

Поделиться этой страницей