Рейтинг:-1

DDOS атака на http сервер и iptables не помогает (есть access_log)

флаг in

Я подвергаюсь DDOS-атаке, нацеленной на http-сервер, я пытаюсь использовать iptables и другие меры, но, похоже, ничего не работает. Вот часть access_log:

https://pastebin.com/6JFKmUi8

Много подключений, но iptables не остановит атаку, вот мои правила iptables:

iptables -A ВВОД -i lo -j ПРИНЯТЬ
iptables -A ВВОД -s 147.135.37.113 -j ПРИНЯТЬ

iptables -A ВВОД -f -j DROP
iptables -A INPUT -m состояние --state INVALID -j DROP
iptables -A INPUT -p tcp --tcp-flags ВСЕ ВСЕ -j DROP
iptables -A INPUT -p tcp --tcp-flags ВСЕ НЕТ -j DROP
iptables -A ВХОД -p TCP ! --syn -m состояние --state NEW -j DROP

iptables -N LOG_AND_DROP

iptables -N ПОРТ21
iptables -A PORT21 -m недавние --set --name lp21
iptables -A PORT21 -m недавние --update --seconds 30 --hitcount 3 --name lp21 -j DROP
iptables -A PORT21 -m недавние --update --seconds 300 --hitcount 10 --name lp21 -j LOG_AND_DROP

iptables -N ПОРТ22
iptables -A PORT22 -m недавние --set --name lp22
iptables -A PORT22 -m недавние --update --seconds 30 --hitcount 3 --name lp22 -j DROP
iptables -A PORT22 -m недавние --update --seconds 300 --hitcount 10 --name lp22 -j LOG_AND_DROP

iptables -N PORT80
iptables -A PORT80 -m недавние --set --name lp80
iptables -A PORT80 -m недавние --update --seconds 30 --hitcount 20 --name lp80 -j LOG_AND_DROP

iptables-N ПОРТ443
iptables -A PORT443 -m недавние --set --name lp433
iptables -A PORT443 -m недавние --update --seconds 30 --hitcount 20 --name lp443 -j LOG_AND_DROP

iptables -N ПОРТ10000
iptables -A PORT10000 -m недавние --set --name lp10000
iptables -A PORT10000 -m недавние --update --seconds 30 --hitcount 20 --name lp10000 -j LOG_AND_DROP

iptables-N PORT6900
iptables -A PORT6900 -m недавние --set --name lp6900
iptables -A PORT6900 -m недавние --update --seconds 30 --hitcount 10 --name lp6900 -j LOG_AND_DROP
iptables -A PORT6900 -m недавние --update --seconds 50 --hitcount 20 --name lp6900 -j LOG_AND_DROP

iptables-N ПОРТ6121
iptables -A PORT6121 -m недавние --set --name lp6121
iptables -A PORT6121 -m недавние --update --seconds 30 --hitcount 10 --name lp6121 -j LOG_AND_DROP
iptables -A PORT6121 -m недавние --update --seconds 50 --hitcount 20 --name lp6121 -j LOG_AND_DROP

iptables-N ПОРТ5121
iptables -A PORT5121 -m недавний --set --name lp5121
iptables -A PORT5121 -m недавние --update --seconds 30 --hitcount 10 --name lp5121 -j LOG_AND_DROP
iptables -A PORT5121 -m недавние --update --seconds 50 --hitcount 20 --name lp5121 -j LOG_AND_DROP

iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name pings --hashlimit-mode srcip --hashlimit 10/min --hashlimit-burst 10 --hashlimit-htable-expire 30000 -j ПРИНЯТЬ
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/min -j LOG --log-prefix "[Pings]"
iptables -A INPUT -p icmp -j DROP

iptables -A ВХОД -m состояние --state СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ

iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j PORT21
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j PORT22
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j PORT80
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j PORT443
iptables -A INPUT -p tcp --dport 10000 -m state --state NEW -j PORT10000

iptables -A INPUT -p tcp --dport 6900 -m state --state NEW -j PORT6900
iptables -A INPUT -p tcp --dport 6121 -m state --state NEW -j PORT6121
iptables -A INPUT -p tcp --dport 5121 -m state --state NEW -j PORT5121

iptables -A INPUT -p tcp --dport 21 -j ПРИНЯТЬ
iptables -A INPUT -p tcp --dport 22 -j ПРИНЯТЬ

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name p80 --hashlimit-mode srcip --hashlimit 50/мин --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ПРИНЯТЬ
iptables -A INPUT -p tcp --dport 443 -m hashlimit --hashlimit-name p443 --hashlimit-mode srcip --hashlimit 50/мин --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ПРИНЯТЬ
iptables -A INPUT -p tcp --dport 10000 -m hashlimit --hashlimit-name p10000 --hashlimit-mode srcip --hashlimit 50/мин --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ПРИНЯТЬ

iptables -A INPUT -p tcp --dport 6900 -j ПРИНЯТЬ
iptables -A INPUT -p tcp --dport 6121 -j ПРИНЯТЬ
iptables -A INPUT -p tcp --dport 5121 -j ПРИНЯТЬ

iptables -A LOG_AND_DROP -m limit --limit 10/мин -j LOG --log-prefix "[Журнал]"
iptables -A LOG_AND_DROP -j DROP

#iptables -A INPUT -m limit --limit 10/мин -j ЖУРНАЛ --log-prefix "[По умолчанию]"
iptables -A INPUT -d 147.135.37.113 -j DROP

Любые советы будут приветствоваться. Я пробую все, но ничего не работает.

Рейтинг:1
флаг in

Поговорите со своим провайдером (выглядит как OVH) об их защите от ddos ​​в вашей системе. Не все, но большинство авторитетных провайдеров могут помочь вам в этом.Кроме того, вы можете подумать о том, чтобы создать причудливое правило fail2ban, которое отслеживает журналы вашего веб-сервера для любого клиента, нажимающего на этот URL-адрес foro, и просто автоматически добавляет для них правило IPTables. Кроме того, вы можете туда что-то поместить... может быть, очень маленький 1-байтовый файл? Или поместите свой веб-сервер за чем-то вроде cloudflare или какой-либо другой службой CDN. Большая часть этого трафика может быть обработана несколькими способами, и это не должно сильно нагружать ваш сервер или вас. Однако следите за файлами журналов, заполняющими вашу файловую систему! Это может создать совершенно другую проблему, которая никому не нужна.

ознакомьтесь с этим для получения дополнительной информации об использовании fail2ban для защиты apache от DoS-атак: https://apache.tutorials24x7.com/blog/protect-apache-from-brute-force-and-ddos-attacks-using-fail2ban

Nikita Kipriyanov avatar
флаг za
Я пытался использовать fail2ban для смягчения DDoS-атаки. Это непригодно для этого. Например, когда вы запускаете/останавливаете или перезагружаете его (что вы будете часто делать для DDoS), он сначала *разбанит* всех, а потом снова банит. Этот процесс занимает около часа, если у вас забанено более 20000 адресов, не очень многообещающе! На самом деле fail2ban — довольно низкокачественное программное обеспечение, несмотря на его популярность, даже для проблемы, для решения которой оно предназначено.
t3ln3t avatar
флаг in
Если в ваших списках блокировки более 20 000 адресов, fail2ban не подходит! Вам нужно аппаратное решение, которое делает это. CiscoGuard или что-то, чем они заменили этот продукт. Большинство программ UNIX/Linux начинает давать сбои, когда в списках имеется такое количество текстовых записей. Postfix и sendmail перешли на скомпилированные БД и хэши 20 лет назад, потому что текстовые файлы не могли быть быстро проанализированы.
Nikita Kipriyanov avatar
флаг za
Нет, специальное оборудование не требуется. Помните, что любое «специальное оборудование», подобное этому, — это не что иное, как сильно переоцененный древний кремний, на котором работает какое-то умное программное обеспечение. Если вам удастся запустить такое программное обеспечение на том же компьютере, это будет работать нормально. Например, если вы собираетесь что-то блокировать с помощью linux netfilter, используйте ipset (который использует растровые изображения или хэши, т.е. «программный CAM»), и основная проблема заключается в том, как заполнить ipset. fail2ban вряд ли поможет. Проблема в том, что если у вас «исчерпывающий» DDoS, у вас наверняка *будет* 20000+ адресов для бана, так что fail2ban не поможет с таким DDoS.
Hermenegildo Gonzalez avatar
флаг in
Спасибо. Я попробую fail2ban, и да, Cloudflare поможет. Журналы http отключены, пока атака продолжается.
Рейтинг:0
флаг id

Мне приходит на ум пара вещей:

  1. Вы можете использовать сопоставление строк с iptables:

iptables -A INPUT -m строка --algo bm --string "GET/foro" -j DROP

или, если возможно, в вашей системе, с помощью TARPIT

iptables -A INPUT -m string --algo bm --string "GET /foro" -j TARPIT

  1. Вместо использования fail2ban создайте свой собственный скрипт, который сканирует журналы, например, последние 1000 строк, и блокирует совпадения с ipsets. Добавьте это в свой скрипт iptables:
  • ipset уничтожить туалет
  • ipset -N туалет айфаш
  • ipset сливной унитаз

Затем используйте свой скрипт, чтобы добавить IP-адреса, которые вы хотите заблокировать, в текстовый файл.В конце концов вам просто нужно зациклить все IP-адреса в этом списке туалетов.

  • ipset - Туалет "$ipaddress"

Использование ipset и особенно масок гораздо эффективнее, чем блокировка IP-адресов. У меня заблокировано около 20 000 адресов и около 200 сетей.

Вы могли бы получить некоторые идеи о моем очень, очень грязном сценарии. https://pastebin.com/4v5se0kh

Я знаю, что это грязно, но у меня это работает намного быстрее и намного проще, чем fail2ban. Я назвал этот скрипт suc2ban. Вам просто нужно найти свои собственные совпадения для вашего файла журнала (у вас, вероятно, есть apache access.log, а не мой пример, который использует auth.log).

Рейтинг:0
флаг in

Проблема решена с помощью этого простого iptables (возможно, другие правила были слишком запутанными)

iptables -A INPUT -i eno1 -m состояние --state СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
iptables -A INPUT -i eno1 -m состояние --state INVALID -j DROP
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 22 -m state --state NEW -j ПРИНЯТЬ
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 21 -m state --state NEW -j ПРИНЯТЬ
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 80 -m state --state NEW -j ПРИНЯТЬ
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 443 -m state --state NEW -j ПРИНЯТЬ
iptables -A ВВОД -i eno1 -p icmp -j ПРИНЯТЬ
iptables -A ВВОД -i eno1 -j DROP

Атаки продолжаются, но сервер не рушится.

exeral avatar
флаг lk
согласно вашим журналам, DDOS кажется нежелательным http (s) запросом. Я не понимаю, как эти правила, которые также разрешают http(s), могут смягчить атаку. но ваша проблема решена, это важнее!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.