Впервые данный скрипт был применен в проекте ********, который находился под ddos неделю.
Чтобы облегчить жизнь серверу клиенту, было предложено переехать на сервер с каналом пошире — uplink 1Gbps (как оказалось позднее — решение верное).
После переезда и стандартного тюнинга сетевой подсистемы, перехода на связку nginx + php-cgi(spawn-fcgi), а также тюнинга базы данных MySQL стало возможным работать на сервере некоторое время до момента недоступности. Изучив все наработки, которые были доступны, решил использовать возможности веб-сервера nginx.
Был создан скрипт, который позволял отличить ботов от обычных пользователей и отделить поисковых ботов на основе известных ip от ботов атакующих подсетей. Принцип работы данного скрипта заключается в принудительном присвоении cookies.
Клиент заходящий на сайт обычно не против их использовать.
Боты используемые в примитивной атаке, как правило этого делать не могут. Результат использования данного скрипта — ddos 500Mbps — сайт работает достаточно уверенно. (Тип DDOSа — атака на корневую директорию и случайный перебор страниц, по-видимому перед этим специально собранных с помощью паука, а также вызов несуществующих страниц и файлов. Замер был осуществлен с помощью системы мониторинга Zabbix.) Нагрузка на сервер при этом не превышала 1-2 LA, что для данного железа — пустяки. К сожалению реакцию скрипта на больший DDOS проверить не удалось — сервер был заблокирован хостером, при этом, повторюсь — сам сайт работал вполне уверенно.
Недостаток этой схемы заключается в том, что многие мобильные клиенты не сохраняют cookies, в связи с этим при заходе на защищаемый сайт происходит постоянное обновление страницы без возможности использования ресурса. Как дальнейший вариант возможного улучшения скрипта — добавление возможности распознавания мобильных клиентов и автоматическое отключение данного скрипта для таких клиентов. Но это решение не является однозначным, так как есть высокая вероятность что в сети атакующих ботов будут мобильные клиенты или стационраные клиенты будут выдавать себя за мобильных.
А теперь собственно сам скрипт.
Эта часть размещена в контексте http
Эта часть выполнена в виде отдельного модуля (СПАСИБО Сысоеву за замечательный проэкт)
И наконец самое интересное — включение нашего стороннего модуля
Тут есть тонкость модуль вставляется в контексте корневого location.
Разумеется nginx должен быть собран с поддержкой GEO.
И еще один скрит до кучи.
Отсекаем вредных/ненужных пауков
Можно разместить как в контексте http так и в контексте location
Еще раз обращаю внимание, что это частное решение для частного конкретного вида атаки. Так сказать — быстро и сердито. При более сложных атаках возможно использование самообучаемого firewall на базе связки iptables/ipset и в уж совсем тяжелых случаях — обращение в специализированные фирмы занимающиемя решениями таких задач.
Чтобы облегчить жизнь серверу клиенту, было предложено переехать на сервер с каналом пошире — 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 и в уж совсем тяжелых случаях — обращение в специализированные фирмы занимающиемя решениями таких задач.