一次DDos防御过程全记录

2022-03-11 09:24:48 浏览数 (1)

# 事情起因

一个小伙伴找到我,说新做的创业项目刚有点起色,每天断断续续有了收入。这几天,莫名其妙的就没法访问了,要不就卡得要死。也不知道什么原因?让我帮忙看看。

废话不多说,直接开始干活。

让他把访问日志,发给我。然后统计了一下,访问量。好家伙,一个小破站,单IP访问量好几万的就就两千多个,妥妥的DDos攻击哇。如图,

每个IP地址访问网站的次数 日志统计命令:

代码语言:javascript复制
cat httpd_access.log | awk '{print  $1}'| sort -k 1 | uniq -c | sort -rnk 1  | grep -v '::' > result.txt

# 解决办法

先了解情况,服务部署在阿里云服务器上,同时腾讯云上也有另一个站,遇到了同样的情况。打开了默认的安全配置,说还是有点效果的。给我发了张截图:

免费版安全服务拦截次数 看到截图,近两千万次的攻击,拦截了两千次,跟没有不一样么?然后因为流量过大,被封2小时。一天被搞个几次,都快哭啦。

直接上高防吧,简单粗暴。抛开技术层面的东西,ddos的战争拼到最后,拼的就是钱!结果小伙伴说,太贵啦!高防基础版,一个月就大几千块,是在负担不起。服务器资源才一百多块钱。问问有没有其他的方法。

我想起了自己当初搞网站,遇到过ddos。也是因为没钱,买不起高防。自己用iptables ipset自动封IP,然后死挺。弄好之后,网站恢复正常访问。就不管他啦。那就试试吧。

具体步骤:

centos7下,采用iptables ipset 自动封IP方法。

因为对firewall不熟悉,卸载,装iptables ipset

安装服务

代码语言:javascript复制
service firewalld stop
systemctl disable firewalld.service 
yum remove firewalld
yum install iptables-services  iptables  ipset ipset-service
systemctl enable ipset
systemctl enable iptables
iptables脚本

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m set --match-set blackiplist src -m tcp --dport 80 -j DROP
iptables -A INPUT -p tcp -m set --match-set blackiplist src -m tcp --dport 443 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 4848 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8  -j  DROP
iptables -A INPUT -j  DROP

iptables -A OUTPUT -p udp -d  183.60.82.98  --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -d  183.60.83.19  --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -j DROP


service iptables save
service iptables restart
iptables -nvL

添加ipset黑名单

代码语言:javascript复制
ipset create blackiplist hash:ip timeout 86400 hashsize 4096 maxelem 1000000

设置计划任务

代码语言:javascript复制
*/3 * * * *  /usr/bin/bash  /root/cron-for-ddos.sh > /dev/null 2>&1

脚本内容

代码语言:javascript复制
#!/bin/bash
time=`env LC_ALL=en_US.en date -d '1 minute ago' ' %e/%b/%G:%H:%M'`
log='/var/log/nginx/acc.log' #日志路径

tail -n  30000 "log" | grep "$time" |awk '{print  $1}'| sort -k 1 | uniq -c | sort -rnk 1 | grep -v '::' > /tmp/blackiplist.txt


while IFS=' ' read a b
do
    if [ "$a" -gt "60" ];then
        /usr/sbin/ipset  add  blackiplist  $b
    else
        break
    fi
done < /tmp/blackiplist.txt

部署好之后,下次攻击封掉了一部分IP,然后又没法访问啦!!没办法,等后台看了下。国内的云服务真是坑人呐,哪怕买了固定带宽,只要超过阈值,就封你两小时。完全没脾气。当初我的服务部署在国外,从没因为带宽问题被封过。

没办法,只好换其他方法。然后有用CDN抗ddos攻击流量,把真实的服务器IP隐藏起来。配置好后,解决了因为流量过大导致的被云提供商封掉的问题。稳定运行了将近一天时间,抗住了几波攻击,本以为对方会知难而退,结果没过多久,小伙伴又找来啦。说网站又不行啦。

心中一万只草泥马在奔腾,继续搞。远程登陆,分析日志,还是ddos,这次是针对业务端口发起的cc。直接服务器负载100%。然后导致正常用户访问出现404错误。

因为现在真实节点,处于cdn的后面。所有的流量都是cdn节点回源请求,通过iptables ipset的方法已经不起作用。

这次就用nginx做应用层访问控制,将请求过于频繁的IP直接返回403错误。通过CDN将403缓存。

配置步骤:

在nginx的配置文件目录的conf.d下创建blackip.conf

里面内容格式

deny 195.91.122.67; deny 195.91.122.19;

设置计划任务

代码语言:javascript复制
*/3  * * * *  /usr/bin/sh  /var/scripts/add_blackip_for_ddos_per_min.sh > /dev/null 2>&1

add_blackip_for_ddos_per_min.sh 脚本内容

代码语言:javascript复制
#!/bin/bash
m_time=`env LC_ALL=en_US.en date -d '1 minute ago' ' %e/%b/%G:%H:%M'`
log='/www/wwwlogs/nginx_acc.log'

conf='nginx/blackip.conf' #配置文件路径

筛选攻击IP

代码语言:javascript复制
tail -n  100000 $log  | grep "$m_time" |awk '{print  $1}'| sort -k 1 | uniq -c | sort -rnk 1 | grep -v '::' > /tmp/blackip_per_min.txt
cat /tmp/blackip_per_min.txt | awk '{if($1>60)print "deny "$2";"}' >> $conf

nginx加载配置

代码语言:javascript复制
/opt/nginx/sbin/nginx  -s reload

配置完成后,网站恢复了正常。我和小伙伴说,如果对面继续升级攻击方式的话,没办法,直接买高防吧。专业的事情,找专业的人搞,怕花钱也没法了。你这是得罪谁了,被人盯着打。

结果,抗了一天,又挂啦。直接买了高防,用高防抗了一天。高防也超过了攻击阈值,又被封了。吐槽一下,某云的安全服务真是抢钱!用了他家的服务,没过多久,就会变成他家的全家桶。

本文共 964 个字数,平均阅读时长 ≈ 3分钟

0 人点赞