nixp.ru v3.0

22 января 2017,
воскресенье,
19:12:22 MSK

DevOps с компанией «Флант»
Аватар пользователя IZLOM
IZLOM написал 8 июля 2011 года в 18:48 (3181 просмотр) Ведет себя как Гарри Поттер; открыл 1 тему в форуме, оставил 10 комментариев на сайте.

Какие можете предложить проверенные Вами решения для данной задачи? iptables хорош, но нужна автоматизация.

defender

iptables + ipset. (ipset уже включили в офиц ветку ядра).

IZLOM

И против кого работать будем? — против школоты. Нужно решение мощнее.

defender

Гм, мощнее не совсем понял… И при чем знесь школота? Ну хотите — TARPIT чтобы удаленным системам как можно «слаже» пришлось…

да, и смотря что защищать. Вот, например, на apache есть такая штука как evasive — модуль который детектит атаку и может «рассказать» об этом фаеру, роутеру, кому надо вобщем…

IZLOM

на сегодня хочу защитить веб. evasive не работает если атаки идут с разных IP-адресов, он думает что это пользователи.

rgo
IZLOM

 

И против кого работать будем? — против школоты. Нужно решение мощнее.

 

Если вас атакует не школота, то iptables не поможет, магистральный пров тупо обрежет вам интернет, поскольку гигабиты в секунду трафика положат все шлюзы этого провайдера.

 

Но это так, к слову пришлось. А вообще, вы в состоянии измыслить алгоритм отличения нормального пользователя от DDoS’ера? Это не всегда возможно, но почему-то мне кажется, что такой неудачный расклад выпал не вам, и значит алгоритм измыслить можно… Ну дык измысльте, закодьте на PHP (или что вы там используете на server-side?) и воткните в каждый php файл вызов этого алгоритма, который будет вычислять DDoS’еров, и оповещать iptables об их ip адресах.

Что именно стоит писать в iptables об этих адресах — это уже зависит от характера атаки. Если атакующих хостов много-много, то я думаю вряд ли придумается что-то лучше, чем DROP. А если их не так уж и много, но каждый из них много-много запросов в секунду шлёт, то можно им и подгадить… ;)

Да, я понимаю, решение «наколеночное», но у таких решений есть один огроменный плюс: они легче всего подстраиваются под постоянно изменяющиеся условия.

IZLOM

Если бы это была школота, она бы ддосила из своих ипишников, ну или чета мелкое. Тут побольше запросов и с разных А-подсетей.

Насчет провайдера можно не волноваться,  в случае гигабитного трафика — отправляем в нулл к тому же провайдеру, возможность есть.

И к алгоритму — плачевно но влип я. Да можно было бы детский скриптик наваять на ПХП, который проверяет дддосер или не ддосер, вот тут возможность отпадает. Скрипты я трогать не имею право, как собственно и подгадить им.

хостов нормально, неделю назад решилась проблема так:

-A INPUT -s **.0.0.0/255.0.0.0 -p tcp -m tcp --dport 80 -j REJECT --reject-with icmp-host-unreachable


теперь ребята из разных А ддосят, точнее флудят.

 

ЗЫ: возможно упростит задачу запросы идут такие GET / HTTP 1.0, из 1000 запросов, но 3 из них — реальные клиенты.

rgo
IZLOM

ЗЫ: возможно упростит задачу запросы идут такие GET / HTTP 1.0, из 1000 запросов, но 3 из них — реальные клиенты.

То есть DDoS’еры используют HTTP1.0, но 0.3% всех HTTP1.0-запросов всё же легитимны?

 

Нет, ну и всё же, алгоритм распознавания есть? Такой чтоб 100% можно было отсеивать кого-то? Если есть, то ты выпиши его сюда. Можно по-русски, не обязательно пользоваться языками типа PHP или C. Тогда можно будет искать инструментарий, который позволит согласно этому алгоритму метелить DDoS’еров.

Вообще, задача решаемая крайне сложно. Я наблюдал и участвовал (увы, лишь советами) в решении подобных проблем на ксакепе. Банить подсетями нельзя. По ip банить тоже не всегда можно, поскольку огромное количество народа сидит за NAT’ом, и запросто за таким NAT’ом может сидеть также и зомбированный комп. Соответственно забанив по ip зомби, забаним и грядку (может быть тысячи) потенциальных легитимных пользователей. Я многадумал тогда, и пришёл к выводу, что DDoS непобедим, единственное что можно сотворить — это максимально замедлить ботов, при этом по-минимуму зацепив этим замедлением легитимных пользователей. Но это канает только если сервер не справляется с DDoS из-за нехватки мощностей — процессоров маловато, или СУБД не справлятся, или ещё что-то.

И если так, то можно попробовать пересилить DDoS. Простейшие и наиболее естественные меры — прикрыть апач nginx’ом и отдавать весь статический контент через nginx. Настроить кеширование на nginx. Чтобы максимум запросов обрабатывалось бы nginx’ом без участия апача.

Кстати тут возникает следующий вопрос: чем именно мешает этот DDoS? Я могу раскрыть этот вопрос целым фонтаном вопросов. DDoS жрёт слишком много трафика? Не хватает мощности железа? Если железо слабое, то где узкое место? Процессор? Жёсткие диски? Что именно тормозит? Ядро, апач на пхп-скриптах, СУБД?

Ведь может быть, всего-то что надо — это напинать по яйцам веб-девелоперов, чтобы они оптимизировали работу с СУБД. А может надо ногою распахнуть дверь в кабинет директора, войти, стукнуть кулаком по столу, и потребовать новую железку под содержание сервера.

IZLOM

какг-бе если просмотреть http-status, и через секунду обновить можно увидеть такое

GET / HTTP/1.0


через секунду

GET /некий_скрипт HTTP/1.0


т.е. понятно что это человек, Ддосеры же постоянно GET / HTTP 1.0.

Nginx`ом прикрыта статика. Если перевесить Nginx на статическую страницу (А-ля сайт закрыт), то серву по барабану ДДос. Но вешаем только на динамику — через часика два сервер в глубоком небытие, приходится ремоут ребутом пользоваться. И ДДос мешает зависанием самого апача. Железо… Делка Р710-я, т.е. ни проц ни сас диски ни оператива.

Скрипты обрабатываются раз в минуту по такому принцыпу (bash):

ловим 10 000 пакетов tcpdump по порту 80, считаем кол-во повторяемых ипишников, если более 1000 — гоним парится. Это работало неделю назад, теперь ребята поняли систему, пошли поумнее — не дают эти 1000 пакетов собрать, даже 200 нету.

Насчет подсети — да неверно, но это единственное решение которое помогло 100% на хороший срок.

А скрипты… DLE, wordpress.

 

defender

HTTP/1.0 — я даже не могу вспомнить какие браузеры до сих пор пользуются 1.1. Разве-что проксики. Но тогда (если не «высокоанонимный») есть X-Forwarded-For. Вот, например на меня недавно напал робот DigExt DTS Agent. Но тут было просто — он представлялся в User-Agent. По нему в таблах и заблокировал:

-A ban_bots -p tcp -m string —string «DigExt; DTS Agent» —algo kmp  -j DROP

Можно отбрасывать весть HTTP/1.0 трафик в случае если нету  X-Forwarded-For.

rgo

Если идёт DDoS, то вряд ли в качестве клиента выступает браузер. Скорее какая-то наколенная поделка, которая вполне может ходить и через HTTP/1.0

defender

Об том собственно и речь. Что в большинстве случаев — это паразитный трафик..

IZLOM

Что в свою очередь чревато материальными последствиями =(

IZLOM

отлично, но то браузера разные, от 9 оперы,  до новейшого хрома.

Dmitry.Stolyarov

Постараюсь кратко изложить основные принципы, как мне это видится.

Здесь мы говорим не о «вообще DDoS» а о «HTTP DDoS». При чем таком, которому далеко до заваливания канала и с которым легко справляется Nginx на статике.

Вот основные вещи, на которых все базируется:

  • У пользовательского браузера есть поддержка cookie, сессиий и редиректов.
  • Гарантированно отличить пользователя от бота можно посредством CAPTCHA.
  • Реальный пользователь не может отправлять (цифры уменьшаются до тех пор, пока проблемы не исчезнут):
    • более 20 запросов в минуту;
    • более 100 запросов в час;
    • более 200 запросов в день.


Такую систему легко можно собрать на коленках, для этого потребуются:

  • Nginx
  • iptables
  • Анти DDoS морда (далее Морда)
  • Скрипт пополняющий iptables


Анти DDoS морда (далее Морда), это (тезисно):

  • Web-интерфейс на удобном вам языке программирования, мы обычно используем PHP.
  • Он должен выполняться сверх быстро (сервер должен справляться с нагрузкой в 2-3 тыс запросов в секунду на эту морду).
  • Морда считает запросы по IP.
  • Лимит запросов НЕ превышен — Морда пропускает запрос к основному сайт.
  • Лимит запросов превышен — Морда показывает каптчу.
  • Пользователь ТОЧНО БОТ если:
    • он продолжает долбиться в страницу с каптчей;
    • запросов от него сильно больше лимитов и ни одного ввода капчи.
  • Каптчу обыно генерировать очень долго, поэтому капчи прегенерируются раз в минуту (несколько сот штук).
  • При успешном вводе капчи — ставим куку на IP на 30 минут.


Скрипт пополняющий iptables, это:

  • Скрипт который запрашивает у Морды список IP, которые ТОЧНО боты и пополняет ipset.
  • ipset пополняется с timeout несколько часов.


Примерный алгоритм работы системы:

  • все запросы принимаем на Nginx;
  • статику отдаем сразу, не задумываясь (по регуляркам на статику);
  • остальные запросы шлем на Морду;
  • если морду отвечает X-Accel-Redirect — отдаем запрос реальному backend.


Итого получилось, что мы разбили нагрузку так:

  • самые отъявленные боты попадают в iptables и досвидания;
  • спорные случаи отсеиваются Мордой, которая сверх быстрая;
  • случайно забаненные пользователи могут ввести капчу.


Такой штукой мы отбивали DDoS ~10-15 000 в секунду с ботнета примерно в 150 000 узлов. DDoS прошел через 2 дня, поняли что бестолку.

Если надо — можем настроить, (495) 725-17-47, Дмитрий ;).

IZLOM

я же више писал:

1. Я не имею право свою морду высовывать в папку ВЕБ.

2. Лимитировать кол-во запросов тоже нет смысла, разные СЕТИ, не то что бы ИПишники.

3. зачем так сложно? все можно было решить iplimit, и не прибегая к капчам и  хедерам.

 

PS: решения вида «наваять на PHP/Python/perl на вебе» сразу отпадают, также и отпадает iptables`ами закрывать стринг «GET / HTTP 1.0» (втречал  и такой бред в рунете ). Лимитить по подсетям тоже не выход.

PS1: пока кручу в сторону snort (snort.org), только туговато с ним.

Dmitry.Stolyarov

Морда стоит отдельно, может стоять вообще на отдельном сервере. Остальное делает Nginx. Вы, видимо, не до конца поняли как это работает.

Лимитировать кол-во запросов смысл есть. И это не лимит, а лимит после которого надо «подтвердить», что ты реальный пользователь. Про разные сети и ипишники — я говорил, что у нас получилось отбить DDoS с примерно 150 000 узлов такой штукой.

iplimit бред, так как не позволяет отличить пользователя от бота.

Разумеется, что кроме лимитирования кол-ва запросов в той самой Морде можно, выявив общие особенности между запросами ботов, фильтровать еще и по ним.

Я описал наш реальный опыт защиты от такого DDoS.

Разумеется ваша конкретная ситуация требует какой-то трансформации метода, но в общем и целом описанная система является хорошей стартовой площадкой для наращивания дальнейшего функционала. Nginx может обрабатывать до 10К запросов в секунду, вот это предел для таких систем.

IZLOM

Способ возможно Вам и помог. Но использовать капчу… Как объяснить владельцу атакуемого сайта, что у него перед входом на его сайт светится капча? Если он толком ДДос от ДОС отличить не может… будет проблема.

Dmitry.Stolyarov
  1. Владелец сайта эту капчу и не увидит. На нее нарвутся в основном пользователи дурных провайдеров (очень-много-человек-за-одним-IP) и боты.
  2. Объяснить очень просто: без капчи ваш сайт работать не будет.

Тут стоит понимать, что в таком деле всегда важнее всего критерии, по которым отличаем пользователей от ботов. Чем лучше критерии тем меньше пользователей видят капчу. При этом капча в 1000 раз лучше, чем бан по iptables.

IZLOM

либо я чего-то не понимаю, либо данное решение нам не поможет. Как решение может помочь если ДДОС, и посетители С РАЗНЫХ  А-ПОДСЕТЕЙ?

 

Два. Вебморда — уже не статика, а значит уже тут будет апач вешаться, тогда смысл от нёё?

Dmitry.Stolyarov

Да, с разных подсетей. С тысяч разных подсетей. Именно такой случай у нас и был.

Морда — это не статика, но ее можно сделать очень быстрой. Очень-очень-очень быстрой:

  1. Хранить базу IP не в СУБД, а в memcache (а еще лучше в apc).
  2. Капчи нужно генерировать по крону, раз в минуту.

На виртуалке с 2-мя ядрами (4 треда) от E5530 наша версия справляется с ~2 500 запросами в секунду. При размере морды в ~4Кб это чуть менее 80 Мбит/с.

Если по каким-то причинам 2500/с мало — могу предложить сделать морду на Си++. Boost Asio + собственный парсер HTTP у меня на ноутбуке (T9300) может ответить на ~8000 запросов в секунду, значит на нормальном сервере эта цифра будет раза в два больше… В общем тут надо исходить от задач. Еще можно морду воткнуть на нескольких серверах, Nginx умеет редундить, как все помнят.

IZLOM

На такую систему никто не согласен. Увы.

ЗЫ: 53 портик вебом не прикроешь.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.