.png)
http 서버를 대상으로 하는 DDOS 공격을 받고 있습니다. 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
시스템의 DDOS 방지 보호 기능에 대해 공급자(OVH와 유사)에게 문의하세요. 전부는 아니지만 대부분의 평판이 좋은 제공업체는 이에 대해 도움을 줄 수 있는 방법을 가지고 있습니다. 그 외에도 해당 foro URL에 도달하는 모든 클라이언트에 대한 웹 서버 로그를 감시하고 IPTables 규칙을 자동으로 추가하는 멋진 fall2ban 규칙을 수행하는 것을 고려할 수 있습니다. 그 외에도 거기에 뭔가를 넣을 수 있습니다. 아마도 아주 작은 1바이트 파일일까요? 또는 웹 서버를 cloudflare나 다른 CDN 서비스 뒤에 두세요. 해당 트래픽의 대부분은 몇 가지 방법으로 처리될 수 있으며 서버나 사용자에게 그렇게 많은 스트레스를 가해서는 안 됩니다. 하지만 파일 시스템을 가득 채우는 로그 파일을 조심하세요! 이는 누구도 원하지 않는 완전히 다른 문제를 일으킬 수 있습니다.
DoS 공격으로부터 아파치를 보호하기 위해 Fail2ban을 사용하는 방법에 대한 자세한 내용은 다음을 확인하십시오.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
내 마음에는 몇 가지가 떠오른다.
- iptables와 함께 문자열 일치를 사용할 수 있습니다.
iptables -A INPUT -m 문자열 --algo bm --string "GET /foro" -j DROP
또는 가능하다면 시스템에서 TARPIT를 사용하여
iptables -A INPUT -m 문자열 --algo bm --string "GET /foro" -j TARPIT
- Fail2ban을 사용하는 대신 예를 들어 마지막 1000줄의 로그를 검색하고 ipsets와의 일치를 차단하는 스크립트를 직접 만드세요. iptables 스크립트에 다음을 추가하세요.
- ipset 화장실 파괴
- ipset -N 화장실 iphash
- IPset 수세식 변기
그런 다음 스크립트를 사용하여 차단하려는 IP 주소를 텍스트 파일에 추가하십시오. 결국 모든 IP 주소를 해당 화장실 목록에 루프하면 됩니다.
- ipset -화장실 "$ipaddress"
ipset, 특히 마스크를 사용하는 것은 IP 주소를 차단하는 것보다 훨씬 더 효율적인 방법입니다. 약 20,000개의 주소가 차단되어 있고 약 200개의 네트워크가 있습니다.
내 매우 지저분한 스크립트에 대한 아이디어를 얻을 수도 있습니다. https://pastebin.com/4v5se0kh
나는 그것이 지저분하다는 것을 알고 있지만 그것은 나에게 훨씬 빠르고 Fail2ban보다 훨씬 쉽습니다. 나는 그 스크립트의 이름을 suc2ban으로 지정했습니다. 로그 파일과 일치하는 항목을 찾으면 됩니다(auth.log를 사용하는 내 예제 대신 apache access.log가 있을 수 있음).