Search
Write a publication
Pull to refresh

Еще раз nginx против DDOS

Впервые данный скрипт был применен в проекте ********, который находился под ddos неделю.
Чтобы облегчить жизнь серверу клиенту, было предложено переехать на сервер с каналом пошире — uplink 1Gbps (как оказалось позднее — решение верное).
После переезда и стандартного тюнинга сетевой подсистемы, перехода на связку nginx + php-cgi(spawn-fcgi), а также тюнинга базы данных MySQL стало возможным работать на сервере некоторое время до момента недоступности. Изучив все наработки, которые были доступны, решил использовать возможности веб-сервера nginx.

Был создан скрипт, который позволял отличить ботов от обычных пользователей и отделить поисковых ботов на основе известных ip от ботов атакующих подсетей. Принцип работы данного скрипта заключается в принудительном присвоении cookies.
Клиент заходящий на сайт обычно не против их использовать.
Боты используемые в примитивной атаке, как правило этого делать не могут. Результат использования данного скрипта — ddos 500Mbps — сайт работает достаточно уверенно. (Тип DDOSа — атака на корневую директорию и случайный перебор страниц, по-видимому перед этим специально собранных с помощью паука, а также вызов несуществующих страниц и файлов. Замер был осуществлен с помощью системы мониторинга Zabbix.) Нагрузка на сервер при этом не превышала 1-2 LA, что для данного железа — пустяки. К сожалению реакцию скрипта на больший DDOS проверить не удалось — сервер был заблокирован хостером, при этом, повторюсь — сам сайт работал вполне уверенно.

Недостаток этой схемы заключается в том, что многие мобильные клиенты не сохраняют cookies, в связи с этим при заходе на защищаемый сайт происходит постоянное обновление страницы без возможности использования ресурса. Как дальнейший вариант возможного улучшения скрипта — добавление возможности распознавания мобильных клиентов и автоматическое отключение данного скрипта для таких клиентов. Но это решение не является однозначным, так как есть высокая вероятность что в сети атакующих ботов будут мобильные клиенты или стационраные клиенты будут выдавать себя за мобильных.

А теперь собственно сам скрипт.

Эта часть размещена в контексте http

#SEARCH BOT
geo $bot {
default no;
87.250.224.0/19 yes;
95.108.128.0/17 yes;
93.158.128.0/18 yes;
83.222.0.0/19 yes;
213.180.192.0/19 yes;
77.88.0.0/18 yes;
178.154.160.0/22 yes;
66.249.64.0/19 yes;
}
#SEARCH BOT


Эта часть выполнена в виде отдельного модуля (СПАСИБО Сысоеву за замечательный проэкт)

if ($bot = no){
set $check_bot "no";
}
if ($bot = yes){
set $check_bot "yes";
}
if ($cookie_antiflood !~* "nobodybots"){
set $check_bot "xz$check_bot";
}
if ($check_bot = "xzno"){
rewrite ^(.*)$ /set_cookie$1 permanent;
break ;
}
location ~ ^/set_cookie/ {
add_header Set-Cookie "antiflood=nobodybots; path=/; httpOnly";
rewrite ^/set_cookie/(.*)$ /$1 permanent;
break ;
}


И наконец самое интересное — включение нашего стороннего модуля

include /path_to_module/name_module.conf;

Тут есть тонкость модуль вставляется в контексте корневого location.
Разумеется nginx должен быть собран с поддержкой GEO.

И еще один скрит до кучи.

Отсекаем вредных/ненужных пауков

if ($http_user_agent ~ ("almaden"|"^Anarchie"|"^ASPSeek"|"^attach"|"^autoemailspider"|"^BackWeb"|"^Bandit"|"^BatchFTP"|"^BlackWidow"|"^Buddy"|"^bumblebee"|"^CherryPicker"|"^ChinaClaw"|"^CICC"|"^Collector"|"^Copier"|"^Crescent"|"^Custo"|"^DA"|"^DIIbot"|"^DISCo"|"^Downloader"|"^Drip"|"^DSurf15a"|"^eCatch"|"^EirGrabber"|"email"|"^EmailCollector"|"^EmailSiphon"|"^EmailWolf"|"^ExtractorPro"|"^EyeNetIE"|"^FileHound"|"^FlashGet"|"FrontPage"|"^GetRight"|"^GetSmart"|"^GetWeb!"|"^gigabaz"|"^Go!Zilla"|"^Go-Ahead-Got-It"|"^gotit"|"^Grabber"|"^GrabNet"|"^Grafula"|"^grub-client"|"^HMView"|"^httpdown"|"HTTrack"|"^HTTrack"|".*httrack.*"|"^ia_archiver"|"^Indy*Library"|"^InterGET"|"^InternetLinkagent"|"^InternetSeer.com"|"^Iria"|"^JBH*agent"|"^JetCar"|"^JOC"|"^JustView"|"^larbin"|"^LeechFTP"|"^LexiBot"|"^lftp"|"^likse"|"^Link"|"^Link*Sleuth"|"^LinkWalker"|"^Mag-Net"|"^Magnet"|"^Memo"|"^Microsoft.URL"|"^Mirror"|"^Mozilla*MSIECrawler"|"^Mozilla.*Indy"|"^Mozilla.*NEWT"|"^MSFrontPage"|"^MSIECrawler"|"^MSProxy"|"^Navroad"|"^NearSite"|"^NetAnts"|"^NetMechanic"|"^NetSpider"|"^NetZIP"|"^NICErsPRO"|"^Ninja"|"^Octopus"|"^Openfind"|"^PageGrabber"|"^pavuk"|"^pcBrowser"|"^Ping"|"^PingALink"|"^Pockey"|"^psbot"|"^Pump"|"^QRVA"|"^RealDownload"|"^Reaper"|"^Recorder"|"^ReGet"|"^Scooter"|"^Seeker"|"^Siphon"|"^sitecheck.internetseer.com"|"^SiteSnagger"|"^SlySearch"|"^SmartDownload"|"^Snake"|"^SpaceBison"|"^sproose"|"^Stripper"|"^Sucker"|"^SuperBot"|"^SuperHTTP"|"^Surfbot"|"^Szukacz"|"^tAkeOut"|"^URLSpiderPro"|"^Vacuum"|"^VoidEYE"|"^WebAuto"|"^webcollage"|"^WebCopier"|"^WebEMailExtrac.*"|"^WebFetch"|"^WebHook"|"^WebLeacher"|"^WebMiner"|"^WebMirror"|"^WebReaper"|"^WebSauger"|"^Website"|"^Webster"|"^WebStripper"|"^WebWhacker"|"WebWhacker"|"^WebZIP"|"^Wget"|"^Whacker"|"^Widow"|"^WWWOFFLE"|"^[Ww]eb[Bb]andit"|"^x-Tractor"|"^Xaldon"|"^Xenu"|"^Zeus.*Webster"|"^Zeus"|"^Bot.mailto:craftbot@yahoo.com"|"^DISCo.Pump"|"^Download.Demon"|"^Download.Wonder"|"^EasyDL.2.99"|"^Express.WebPictures"|"^Go.!Zilla"|"^Image.Stripper"|"^Image.Sucker"|"^Internet.Ninja"|"Indy.Library"|"^JOC.Web.Spider"|"^Mass.Downloader"|"^MIDown.tool"|"^Mister.PiX"|"^MS.FrontPage*"|"^Offline.Explorer"|"^Offline.Navigator"|"^Papa.Foto"|"^Teleport.Pro"|"^WebGo.IS"|"^Website.eXtractor"|"^Website.Quester"|"^Web.Downloader"|"^Web.Image.Collector"|"^Web.Sucker"|"^Xaldon.WebSpider"))
{return 444;
break;
}

Можно разместить как в контексте http так и в контексте location
Еще раз обращаю внимание, что это частное решение для частного конкретного вида атаки. Так сказать — быстро и сердито. При более сложных атаках возможно использование самообучаемого firewall на базе связки iptables/ipset и в уж совсем тяжелых случаях — обращение в специализированные фирмы занимающиемя решениями таких задач.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.