简单来说就是拒绝服务式攻击,通过调用客户端对你的服务器发起大量的正常请求,导致你的系统负载增加,用户访问变慢。
日志示例:
192.168.1.2 | - | 06/Jul/2020:17:03:12 +0800 | GET xxx.apk HTTP/1.1 | 200 | 15606384 | 15606128 | xxx.com | http://xxx.html | Mozilla/5.0 | - | - | 192.168.1.2,192.168.2.2 | 0.760 | -
日志格式:
log_format xxx '$remote_addr | $remote_user | $time_local | $request | $status | '
'$bytes_sent | $body_bytes_sent | $host | $http_referer | $http_user_agent | '
'$upstream_addr | $gzip_ratio | $http_x_forwarded_for | $request_time | $upstream_response_time';
在我们的web服务器,只要用户有访问,日志肯定存在客户端ip,那么我们先对这个ip进行分析。
获取访问前10的ip段:
cat /data/logs/www/*.log | grep " 200 " |awk '{print $1}' | awk -F'.' '{print $1"."$2"."$3}'| sort | uniq -c | sort -nr | head -n 10
根据某ip段获取他的全部访问地址:
cat /data/logs/www/*.log | grep " 200 " | grep '^192.168.1' | awk '{print $1}' | sort -n | uniq
注:根据上面2条命令,访问前10的ip段及ip端对应的ip已经被我们找到。
至于为什么是" 200 "状态码了?200状态码表示客户端的请求已处理,并且返回客户端请求的资源,代表这个请求是正常的。
获取到ip之后就存在2种情况:
你的域名走了cdn:
1)你把你访问前10的地址与cdn的ip进行对比,看下是否是cdn的ip,如果是cdn的ip,那么你就的得查询cdn的日志了,看下是有什么ip在采集数据或者攻击,导致大量回源,当然也得分析你cdn的策略,是不是策略失效等等。
2)如果大量访问的ip段,不是cdn与蜘蛛爬虫的,那么你就得进一步分析。
你的域名没有走cdn:
1)参照上面2步骤。
注:怎么查是否是cdn的ip?如果你走的是百度云,阿里云,腾讯云cdn的话,直接去他们的云上,找到内容分发网络选项,然后开启此功能,进去到这个页面就可以找到相应的ip分析工具。
通过上面步骤,我们已经得到了我们域名访问前10的ip段了,那么就需要进一步处理,让分析结果更准确。
获取ip访问的内容:
cat /data/logs/www/*.log | grep " 200 " | grep '^192.168.1' | awk -F'|' '{print $4}'| awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10
这个时候,你获取的ip访问前10的内容,看下访问次,如果只对某个几个文件进行大量的访问,那么你就需要留心这个ip,但是如果对一堆文件进行访问,也需要留心。
看起来是不是有些重复?
假设198.168.1.0/24段截取的ip有3个,分别是192.168.1.3,192.168.1.4,192.168.1.5
1)上面ip对a.html,b.htnl.c.html访问次数达到几千次,你想想一个正常的用户怎么可能有这么多访问量了?那就有人说了,这个ip是内网的出口也不是不可能啊。当然也不能因此打上是ddos攻击标签,先把他记录下来。
2)上面的ip对a.html......a..n.html大量文件进行访问,你想想一个正常的用户怎么会对大量文件进行访问了,现在一个正常的页面请求是需要返回很多资源的,每个资源对于服务器来说都是一次http请求,那么你就得看这些资源的重复请求次数,如果量大,你也得考虑把他记录下来,是不是有人在采集你的数据。
分析域名,有个前提,那就是你当前服务器上部署多个服务,然而你不知道哪是哪个服务
获取访问的量大的域名:
cat /data/logs/www/*.log | grep ' 200 ' | awk -F'|' '{print $8}' | sort -n | uniq -c
看下是针对哪个域名进行大量访问,这个时候你需要联系业务部门,看下他们流量是不是有增长,如果有增长,服务器长点流量的问题不大,就可以缩小排查范围了。
获取Referer,也就是用户从哪个页面访问过来的。
cat /data/logs/www/*.log | grep ' 200 ' | awk -F'|' '{print $9}' | sort -n | uniq -c | sort -nr
一般有下面3种情况?
1)源referer是你们的地址,那么访问正常
2)源referer为—,也就是为空,首先你的查看你的服务器是否允许源Referer为空?然后是有些浏览器支持源地址为空,如果准许的话分析他没有意义,不准许,直接在Nginx添加返回403就行。
3)源Referer为别人域名的,这个时候你跟业务联系,别人域名的源Referer是不是跟我们项目有合作,有的话,就不禁了,没有的话,则禁止
获取客户端:
cat /data/logs/www/www.qyuedu.com-new-http.log | grep ' 200 ' | awk -F'|' '{print $10}' | sort -n | uniq -c | sort -nr
如果192.168.1.0下面的3个ip,客户端都是一样的(需要排除各种蜘蛛爬虫的客户端,像百度爬虫的客户端: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) )
通过上诉步骤,我们已经分析了ip,内容,域名,Referer,客户端,那么对数据有了一个比较细致的了解。个人觉得遵循下列几点去判断当前ip是否是doss攻击还是别人采集你的数据?
1)根据ip的访问量判断数据是否异常,需要你的数据量做对比!
2)根据ip的访问内容判断访问数据是否正常?访问内容是单一还是多样化!
3)根据ip客户端判断访问ip是否正常?比如客户端都是统一一个:Mozilla/5.0 然后是没有具体的后缀的,用户的手机访问基本有后缀的
4)根据ip的访问referer来看,是不是你们的referer,不是的话,存在盗链的可能
基本可以通过这上面4点初略的分析出,造成服务器异常的ip是否是正常的访问ip,我对造成异常的ip基本是靠封ip的方式解决。还有一点要记住,别把百度云和蜘蛛爬虫的ip给封了!
这篇总结先写到这把,以后有了再来补充,欢迎各位大佬指点,完善其中的不足!