# 事情起因
一个小伙伴找到我,说新做的创业项目刚有点起色,每天断断续续有了收入。这几天,莫名其妙的就没法访问了,要不就卡得要死。也不知道什么原因?让我帮忙看看。
废话不多说,直接开始干活。
让他把访问日志,发给我。然后统计了一下,访问量。好家伙,一个小破站,单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分钟