屏蔽CC攻击

ban特征

需要有tcpdump工具

apt-get install tcpdump
tcpdump -s0 -A -n -i any | grep -o -E '(GET|POST|HEAD).*'
tcpdump -s0 -A -n -i any | grep -o -E '(GET|POST|HEAD|Host).*'

tcpdump还有其他的命令:

tcpdump -s0 -A -n -i any | grep  ^User-Agent
tcpdump -s0 -A -n -i any | grep -o -E '(X-Forwarded-For).*'
tcpdump -s0 -A -n -i any | grep -o -E '(Referer).*'
Paste_Image.png

像这种某一个页面被重复请求,并且服务器CPU和流量大增,那肯定是cc了。

我们需要使用nginx来限制访问频率,以及ban掉这些特征


limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
        listen   80;
        server_name www.mysite.com;

         #访问日志
       # access_log /mnt/www/mysite/logs/access.log;
        #error_log /mnt/www/mysite/logs/access.log;

        #静态文件直接从目录返回
        location ^~ /static/ {
                root /mnt/www/mysite/app;
        }

        #搜索页面判断来路,并且设置
        location ^~ /search {
                #非淘客喵来路全部禁止访问搜索
                if ($http_referer !~* .*\.mysite.com){
                        return 403;
                }
                #deny all;
                #搜索限制访问次数
                limit_conn addr 2;
                limit_req zone=one burst=3 nodelay;
                proxy_pass http://127.0.0.1:8000;
                break;
        }

        #其他页面
        location / {
                #限制访问次数
                limit_conn addr 3;
                limit_req zone=one burst=5;

            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            #文件不存在则转到gunicorn服务
            if (!-f $request_filename) {
                proxy_pass http://127.0.0.1:8000;
                break;
            }
        }
    }

BAN IP

用这个命令查看大于并发大于20的IP,里面有些是服务器的云盾或者之类的IP段,ban掉就无法访问了

#查询访问次数大于20次的ip
#-c 2000的意思是,总访问数达到2000次退出并返回结果
tcpdump -i eth1 -tnn dst port 80 -c 2000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |awk -v str=20 '{if ($1>str){print $1,$3}}'| head -20
Paste_Image.png

监听到有很多ip大量访问,最前面是访问次数。
那么我们可以写一个脚本利用iptables防火墙ban掉他们。

cd /root
vi deny.sh

写入以下脚本

#!/bin/bash
#Author:ZhangGe&Corek
#Desc:Auto Deny Black_IP Script.
#Date:2016-11-16
#从第一个参数取得限制阈值,如果未设置最高并发,将设置为30
if [[ -z $1 ]];then
        num=30
else
        num=$1
fi
 
#进入到脚本所在目录
cd $(cd $(dirname $BASH_SOURCE) && pwd)
 
#取得当前请求大于阈值$num的IP列表
iplist=`tcpdump -i eth1 -tnn dst port 80 -c 5000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |awk -v str=$num '{if ($1>str){print $3}}'`
 
#循环IP列表进行筛选和处理
if [[ ! -z $iplist ]];
then
        for black_ip in $iplist
            do
                #取得IP所在段
                ip_section=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`
                #先检查白名单中是否存在匹配的IP段(为了支持整段IP为白名单)
                grep -q $ip_section ./white_ip.txt
                if [[ $? -eq 0 ]];then
                        #若发现black_ip和白名单的一个段匹配,则写入到待验证列表,并暂时放过
                        echo $black_ip >>./recheck_ip.txt
                else
                        #若不再白名单当中,则直接将black_ip加入到防火墙的DROP规则当中,并记录

                        #封单IP
                        #iptables -nL | grep $black_ip || iptables -I INPUT -s $black_ip -j DROP
                        #echo $black_ip >>./black_ip.txt
                        #直接封IP段
                        iptables -nL | grep $ip_section.0/24 || iptables -I INPUT -s $ip_section.0/24 -j DROP
                        echo $ip_section.0/24 >>./black_ip.txt
                fi
           done
fi

保存后。
我们建立一个白名单txt,把服务器IP和爬虫IP以及阿里云云盾的IP段写进去,要是这些IP被ban掉,web就无法访问了
比如

vi white_ip.txt
#写入
#服务器的IP
106.14.30.*
#云盾IP
140.205.16.*

保存。

运行,后面的参数20表示这段结果中访问数大于20的段全部ban掉

nohup ./deny.sh 20

附上iptables的操作

#查看ban掉的IP
iptables -nL
#清空iptables防火墙的记录
iptables -F
#将某个ip单独ban
iptables -I INPUT -s 115.219.59.126 -j DROP
#将某个IP取消屏蔽
iptables -D INPUT -s 119.182.160.132 -j DROP
#屏蔽ip段
iptables -I INPUT -s 115.219.59.0/24 -j DROP

2017年8月1日更新

其实最有用的还是屏蔽来路,现在的很多CC都是用脚本嵌套刷,来路都是各种乱七八糟的网页。

编辑站点nginx配置文件

cd /etc/nginx/sites-available
vi mysite

内容如下

server {
        listen   80;
        server_name www.mysite.com;
        #修改最大上传为10M,默认为2M,超出大小出现413 Request Entity Too Large错误
        client_max_body_size 10M;
      
         #搜索页面防CC
        location ^~ /search {
                set $deny 1;
                if ($http_referer ~* .*\.mysite.com){
                        set $deny 0;
                }
                if ($http_referer ~* .*\.baidu.com){
                        set $deny 0;
                }
                if ($http_referer ~* .*\.sogou.com){
                        set $deny 0;
                }
                if ($http_referer = ''){
                        set $deny 0;
                }
                #如果来路验证不通过,则拒绝
                if ($deny = 1){
                        rewrite .+ http://www.163.com redirect;
                        #rewrite ^/(.*) http://www.163.com redirect;
                        #return 403;
                }

            #将访客IP加入headers中,否则获取到的将是127.0.0.1
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            #如果请求的文件不存在,则将路由转发到gunicorn的8000端口
            if (!-f $request_filename) {
                proxy_pass http://127.0.0.1:8000;
                break;
            }

        }

        #默认请求,nginx反向代理(动态页面转发至gunicorn)
        location / {
            #将访客IP加入headers中,否则获取到的将是127.0.0.1
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            #如果请求的文件不存在,则将路由转发到gunicorn的8000端口
            if (!-f $request_filename) {
                proxy_pass http://127.0.0.1:8000;
                break;
            }
        }

        #静态文件请求转发给目录
        location ^~ /static/ {
                root /var/www/mysite/app;
        }
    }




立竿见影,加上这个nginx配置,然后重启nginx。

Paste_Image.png

马上带宽就降了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容