前言
一个小伙伴找到我,说新做的创业项目刚有点起色,每天断断续续有了收入。这几天,莫名其妙的就没法访问了,要不就卡得要死。也不知道什么原因?让我帮忙看看。
废话不多说,直接开始干活。
让他把访问日志,发给我。然后统计了一下,访问量。好家伙,一个小破站,单IP访问量好几万的就就两千多个,妥妥的DDos攻击哇。如图,
# 日志统计命令
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,然后死挺。弄好之后,网站恢复正常访问。就不管他啦。那就试试吧。
实施
更换iptables
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
重启iptables服务
service iptables save
service iptables restart
iptables -nvL
添加ipset黑名单
ipset create blackiplist hash:ip timeout 86400 hashsize 4096 maxelem 1000000
设置计划任务
*/3 * * * * /usr/bin/bash /root/cron-for-ddos.sh > /dev/null 2>&1
#!/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
没办法,只好换其他方法。然后有用CDN抗ddos攻击流量,把真实的服务器IP隐藏起来。配置好后,解决了因为流量过大导致的被云提供商封掉的问题。稳定运行了将近一天时间,抗住了几波攻击,本以为对方会知难而退,结果没过多久,小伙伴又找来啦。说网站又不行啦。
心中一万只草泥马在奔腾,继续搞。远程登陆,分析日志,还是ddos,这次是针对业务端口发起的cc。直接服务器负载100%。然后导致正常用户访问出现404错误。
因为现在真实节点,处于cdn的后面。所有的流量都是cdn节点回源请求,通过iptables+ipset的方法已经不起作用。
这次就用nginx做应用层访问控制,将请求过于频繁的IP直接返回403错误。通过CDN将403缓存。
nginx配置过程
修改nginx配置
deny 195.91.122.67;
deny 195.91.122.19;
计划任务
*/3 * * * * /usr/bin/sh /var/scripts/add_blackip_for_ddos_per_min.sh > /dev/null 2>&1
#!/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
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加载配置
/opt/nginx/sbin/nginx -s reload
结果,抗了一天,又挂啦。直接买了高防,用高防抗了一天。高防也超过了攻击阈值,又被封了。吐槽一下,某云的安全服务真是抢钱!用了他家的服务,没过多久,就会变成他家的全家桶。
评论 (0)