%20.png)
Я нахожусь под DDOS-атакой, нацеленной на http-сервер, я пробую iptables и другие меры, но ничего не работает. Вот часть access_log:
Множество подключений, но 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
Поговорите со своим провайдером (кажется, 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
решение2
Проблема решена с помощью простого 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
Атаки продолжаются, но не приводят к обрушению сервера.
решение3
Мне на ум приходит пара вещей:
- Вы можете использовать string-match с iptables:
iptables -A ВВОД -m строка --algo bm --string "GET /foro" -j ОТБРОСИТЬ
или, если это возможно в вашей системе, с TARPIT
iptables -A ВХОД -m string --algo bm --string "GET /foro" -j TARPIT
- Вместо использования fail2ban, создайте свой собственный скрипт, который сканирует логи, например, на последние 1000 строк, и блокирует совпадения с ipsets. Добавьте это в свой скрипт iptables:
- ipset уничтожить туалет
- ipset -N туалет iphash
- туалет со сливом ipset
Затем используйте свой скрипт, чтобы добавить IP-адреса, которые вы хотите заблокировать, в текстовый файл. В конечном итоге вам просто нужно будет зациклить все IP-адреса в этом списке туалетов.
- ipset -A туалет "$ipaddress"
Использование ipset и особенно масок гораздо более эффективный способ, чем блокировка IP-адресов. У меня заблокировано около 20 000 адресов и около 200 сетей.
Возможно, вы почерпнете некоторые идеи из моего очень-очень запутанного сценария. https://pastebin.com/4v5se0kh
Я знаю, что это грязно, но у меня это работает гораздо быстрее и намного проще, чем fail2ban. Я назвал этот скрипт suc2ban. Вам просто нужно найти собственные соответствия для вашего файла журнала (у вас, вероятно, есть apache access.log, а не мой пример, который использует auth.log).