nginx 防垃圾流量的perl清洗脚本

最近公司的网站经常遭受到不怀好意的网站联盟的无用的大量的垃圾流量的骚扰,既造成了流量的浪费,还影响到正常用户的访问(严重时还会导致apache进程的崩贵)。
首先分析日志,总结出垃圾流量的特征,在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脚本,增加一个白名单,减少误判的可能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值