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

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

https://pastebin.com/6JFKmUi8

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

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 147.135.37.113 -j ACCEPT

iptables -A INPUT -f -j DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

iptables -N LOG_AND_DROP

iptables -N PORT21
iptables -A PORT21 -m recent --set --name lp21
iptables -A PORT21 -m recent --update --seconds 30 --hitcount 3 --name lp21 -j DROP
iptables -A PORT21 -m recent --update --seconds 300 --hitcount 10 --name lp21 -j LOG_AND_DROP

iptables -N PORT22
iptables -A PORT22 -m recent --set --name lp22
iptables -A PORT22 -m recent --update --seconds 30 --hitcount 3 --name lp22 -j DROP
iptables -A PORT22 -m recent --update --seconds 300 --hitcount 10 --name lp22 -j LOG_AND_DROP

iptables -N PORT80
iptables -A PORT80 -m recent --set --name lp80
iptables -A PORT80 -m recent --update --seconds 30 --hitcount 20 --name lp80 -j LOG_AND_DROP

iptables -N PORT443
iptables -A PORT443 -m recent --set --name lp433
iptables -A PORT443 -m recent --update --seconds 30 --hitcount 20 --name lp443 -j LOG_AND_DROP

iptables -N PORT10000
iptables -A PORT10000 -m recent --set --name lp10000
iptables -A PORT10000 -m recent --update --seconds 30 --hitcount 20 --name lp10000 -j LOG_AND_DROP

iptables -N PORT6900
iptables -A PORT6900 -m recent --set --name lp6900
iptables -A PORT6900 -m recent --update --seconds 30 --hitcount 10 --name lp6900 -j LOG_AND_DROP
iptables -A PORT6900 -m recent --update --seconds 50 --hitcount 20 --name lp6900 -j LOG_AND_DROP

iptables -N PORT6121
iptables -A PORT6121 -m recent --set --name lp6121
iptables -A PORT6121 -m recent --update --seconds 30 --hitcount 10 --name lp6121 -j LOG_AND_DROP
iptables -A PORT6121 -m recent --update --seconds 50 --hitcount 20 --name lp6121 -j LOG_AND_DROP

iptables -N PORT5121
iptables -A PORT5121 -m recent --set --name lp5121
iptables -A PORT5121 -m recent --update --seconds 30 --hitcount 10 --name lp5121 -j LOG_AND_DROP
iptables -A PORT5121 -m recent --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 ACCEPT
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 INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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 ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name p80 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m hashlimit --hashlimit-name p443 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000 -m hashlimit --hashlimit-name p10000 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT

iptables -A INPUT -p tcp --dport 6900 -j ACCEPT
iptables -A INPUT -p tcp --dport 6121 -j ACCEPT
iptables -A INPUT -p tcp --dport 5121 -j ACCEPT

iptables -A LOG_AND_DROP -m limit --limit 10/min -j LOG --log-prefix "[Log]"
iptables -A LOG_AND_DROP -j DROP

#iptables -A INPUT -m limit --limit 10/min -j LOG --log-prefix "[Default]"
iptables -A INPUT -d 147.135.37.113 -j DROP

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

-1
задан 30 August 2021 в 00:18
3 ответа

Поговорите со своим провайдером (выглядит как 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

1
ответ дан 30 August 2021 в 01:25

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

iptables -A INPUT -i eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eno1 -m state --state INVALID -j DROP
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p icmp -j ACCEPT
iptables -A INPUT -i eno1 -j DROP

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

0
ответ дан 2 September 2021 в 14:40

Несколько вещей приходят мне на ум:

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

iptables -A INPUT -m string --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 туалет iphash
  • ipset смыть туалет

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

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

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

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

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

0
ответ дан 2 September 2021 в 19:18

Теги

Похожие вопросы