网站如何防御 CC 和 DDOS 攻击

2021-12-01 09:41:20 +08:00
 1340976576

此文章是个人建站两年以来的对攻防的总结点,只是个人拙见,欢迎大佬们在评论中补充

站长们最头痛的事情莫过于网站(服务)又又又被攻击了,本篇文章总结常见的攻击和防御方式

CC 攻击

简单介绍这种攻击的原理

CC(Challenge Collapsar ,挑战黑洞),CC 攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。CC 主要是用来攻击页面的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC 就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量 CPU 时间)的页面,造成服务器资源的浪费。

本人有幸遇到过几次 CC 攻击,每次都是把服务器 CUP 消耗到 100%,造成无法正常浏览网站。

防御方式一,CND

其实防御 CC 攻击的方式有很多种,如果您是不差钱的主儿,可以直接上高防御 CDN ,利用 CDN 的原理将流量引入到云平台,等待数据清洗后,再将正常的流量回源到你的服务器,当然了,其实普通的 CDN 通过简单的配置也可以达到防御目的,例如设置单 IP 访问限制

免费 CDN
1.百度免费版本 CDN,一天 10GB 流量,无防护功能: https://su.baidu.com/
2.360 推出的免费 CDN 网站卫士(还没体验过): https://wangzhan.qianxin.com/

另外付费的 CDN 品牌就更多了,阿里云、腾讯云、又拍云(站长符合条件可免费使用)、七牛云等等, 使用 CDN 内容分发平台,不但可以防御攻击,还可以提升网站静态内容的访问速度。

防御方式二,限流

即使用了 CDN ,对自己的服务应用安全依然不可忽视。比如 CDN 到期了,或者失效了,失去了 CDN 的保护,我们的服务就相当于在裸奔,哪怕只是单个 IP 就能对服务器产生致命的攻击(例如,不断对服务器的某个较大的静态资源,开启几十个线程疯狂请求,那我们的服务器每秒钟可能遭遇到上千次请求)。 以为个人的经验,就是在应用前部署一个 Nginx ,通过反向代理的方式请求我们的应用。 这样,无论是做安全设置,还是配置 SSL 证书,对我们的应用都是无侵入的,并且 nginx 是一个高性能的 http 的服务器,可以在应用前抗下大量垃圾请求

我个人对 nginx 的配置如下:
主要看以下下部分,include blockip.conf; 是加载一个外部的文件,我们从外部加载一个 IP 黑名单,格式为:deny 112.10.185.152;
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
limit_req zone=allips burst=5 nodelay;

以上内容设置了:漏桶算法的限流,并且配置了一个外部 IP 黑名单,下面我们再详细讲如何统计攻击者 IP


http {
    include blockip.conf;
   
    # zone 表示生成一个大小为 10M ,名字为 one 的内存区域,用来存储访问的频次信息
    # 表示允许相同标识的客户端的访问频次,这里限制的是每秒 20 次,即每秒只处理 20 个请求
    limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;

    autoindex on;
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    client_max_body_size 100m;

    server {
        
        #burst 爆发的意思,这个配置的意思是设置一个大小为 5 的缓冲区当有大量请求(爆发)过来时,
        #超过了访问频次限制的请求可以先放到这个缓冲区内等待,
        limit_req zone=allips burst=5 nodelay;

        listen 80;
        server_name xxxx.com www.xxxx.com;

        location / {
            set_real_ip_from 0.0.0.0/0;
            real_ip_header X-Forwarded-For;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 反向代理到应用上
            proxy_pass http://127.0.0.1:880;
        }

        error_page 500 502 503 504 /50x.html;
    }
}

防御方式三,拉黑 IP

如果只做了限流,依然不能阻止攻击,只是速度变慢了而已,其实我们可以通过 nginx 的日志分析出攻击者 ip ,直接拉黑 IP 地址,这样这个 IP 访问不到我们了

在上一步我们在 nginx 中引入了一个外部文件 include blockip.conf; 我们可以写一个脚本把 nginx 日志中的攻击 IP 写入到这个文件中

通过 awk 统计出统计攻击 Ip ,脚本命令解释:
第 1 行:查找最近 50000 行 nginx 的访问日志(根据自己的访问量判断)
第 2 行:将 ip 拼接 url 统计出来,(如果攻击者每次变换 url ,可以只统计 ip)
第 3 、4 行:数据排序,将出现大于 300 次的 ip 写进黑名单

tail -n50000 /usr/local/nginx/logs/access.log \
|awk '{print $1,$7}' \
|sort|uniq -c|sort -rn \
|awk '{if($1>300)print "deny " $2 ";"}' > /usr/local/nginx/conf/blockip.conf

以上就是个人对 CC 攻击的防御措施,当然了,上面的方式呢比较简陋,但是对于一般的小站点基本上也够用了。

DDOS 攻击

DDOS 攻击一般是针对 IP 发起的,所以呢,我们如果用了 CDN ,那别人就只能获取到我们的 CDN 节点 IP 。 如果遭遇到 DDOS 攻击,最简单的方式就是换个 IP ,套上一层 CDN 。 否者呢,有钱就买防御、堆硬件硬抗了,没钱的话呢,只能放弃挣扎了。

4110 次点击
所在节点    信息安全
16 条回复
NeverNot
2021-12-01 10:05:23 +08:00
头像眼熟,群里见过,技术帖子点个赞
justrand
2021-12-01 10:35:33 +08:00
出现大于 300 次的 ip 写进黑名单?
这个我想问下,有的一个网站有 n 资源比如 css ,js ,图片啥的,一个人访问一次可能就有几十个 ip 统计记录了,再访问几个二级页面,很容易一个 ip 访问 300 次记录的?
bug123
2021-12-01 10:40:33 +08:00
有人爬我的站点把我爬挂了,对方开了一堆代理来请求,每秒百来个吧,我就一个单核的机器,最后忍不可忍吐了一堆脏数据给对方
1340976576
2021-12-01 10:45:14 +08:00
@justrand 技术不能认死理,我只是举个例子,你可以根据请求时间分析,例如 1 分钟内,单 IP 访问超过 300 次
yuxiu
2021-12-01 10:55:41 +08:00
cdn 、cpu 几个缩写拼错了。另外限流的能力如果用 tengine 的话,还支持基于 remote-client-ip + uri 的基于相同路径的限流,同时还能设置限流后的默认返回,挺方便的
hayhong123
2021-12-01 11:33:11 +08:00
可以 学习了
bestmos
2021-12-01 11:53:48 +08:00
@yuxiu 事实证明,插在中文中的英文缩写顺序错了也不影响阅读
bronco
2021-12-01 12:21:51 +08:00
表示预防性拉黑 UC Cloud HK AS 之后,隔三差五就能在 WAF 日志里看到各种扫描 log……
newmlp
2021-12-01 13:40:57 +08:00
@justrand 拉黑没什么作用。。。虽然你能阻止别人进你店里,但是人家把你门堵了,你照样提供不了正常服务
pupboss
2021-12-01 13:51:55 +08:00
@justrand 这个不难的,静态文件是另一套限制,一分钟 300 主要针对 API ,尤其是登陆 /搜索这种敏感 /耗时的 API
privil
2021-12-01 13:51:57 +08:00
推荐一个 go 写的 waf 软件 JANUSEC
lysS
2021-12-01 14:18:24 +08:00
遇到攻击,如何快速区分是 CC 还是 DDOS?
1340976576
2021-12-01 20:52:08 +08:00
@lysS 不需要区分,一般 DDOS 攻击,云服务平台会把你加入到黑洞。。。因为平台也承受不起这么大流量灌入
alexmy
2021-12-02 00:10:29 +08:00
不交钱,就在云平台的小黑屋等到死。
noisywolf
2021-12-13 08:46:00 +08:00
@lysS 看带宽占用, 入网带宽上 G 级别, 不过现在一般都是混合型攻击.
yundun2021
2022-01-10 15:26:49 +08:00
@lysS DDoS 一般是打流量,带宽会变很高,CC 一般是通过大量代理 ip 访问你的网站,服务器 cpu 会被占满

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819210

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX