首先分析日志,总结出垃圾流量的特征,在apache前端增加nginx代理,利用nginx来完成流量的清理,只有正常的流量才交给后端的apache来处理。 1、根据nginx的访问日志,根据匹配规则查出来源域名,按照来源域名的在一定时间内的访问量来确定屏蔽对象将下面的脚本放入到系统定时任务中,定时(2-5分钟,可根据具体情况做相应调整)执行。 确定一个判断不正常的流量的数量,凡是大于该数量的来源一律清洗。 当然这里有可能会有误判,所以在后面将正常的来源地址过滤掉。 cat purge_traffic.sh #!/bin/bash if [ -f /var/log/nginx/www-access.log ]; then tail -10000 /var/log/nginx/www-access.log | grep -E 'cps_site|tracert.php\?source' | awk -F'"' '{if ($4 ~ /http:/){print $4}}' | awk -F '/' '{print $3}' | grep -v -E '\.xxx\.cn|\.baidu\.com|google\.com' | sort | uniq -c | sort -nr | head -60 > /tmp/cps_site.log cat /tmp/cps_site.log | awk '{if( $1 > 100 ){print $2}}' > /tmp/purge_cps.log fi 2、nginx中调用的perl脚本,当请求进来时,通过下面的脚本判断Referer地址是否来自上面生成的需要清理的域名。 perl判断脚本,当发现来源地址匹配时返回1 cat purgetraffic.pm package purgeTraffic; use nginx; sub purge { my $r = shift; my $ua = $r->header_in("Referer"); if(! $ua ) { return 0; } open(FILES, "/tmp/purge_cps.log") || return 0; @cps_file=<FILES>; close(FILES); foreach (@cps_file) { my $eachcps = $_; chomp $eachcps; #$r->print($eachcps .'| '); if ( $ua =~ m/$eachcps/ ) { #return HTTP_NOT_ALLOWED; return 1; } } return 0; } 1; __END__ 3、nginx.conf中调用perl脚本,符合清洗规则的来源直接返回404, http { ... perl_modules /etc/nginx; perl_require purgetraffic.pm; ... perl_set $purge purgeTraffic::purge; server { server_name www.xxx.cn; if ($purge = 1) { return 404; } #屏蔽垃圾流量 ... } } 重新加载nginx,完成自动流量清洗 还可以稍微修改一下perl脚本,增加一个白名单,减少误判的可能。 转载请保留固定链接: https://linuxeye.com/configuration/1038.html |