此文章是个人建站两年以来的对攻防的总结点,只是个人拙见,欢迎大佬们在评论中补充
站长们最头痛的事情莫过于网站(服务)又又又被攻击了,本篇文章总结常见的攻击和防御方式
简单介绍这种攻击的原理
CC(Challenge Collapsar ,挑战黑洞),CC 攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。CC 主要是用来攻击页面的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC 就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量 CPU 时间)的页面,造成服务器资源的浪费。
本人有幸遇到过几次 CC 攻击,每次都是把服务器 CUP 消耗到 100%,造成无法正常浏览网站。
其实防御 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;
}
}
如果只做了限流,依然不能阻止攻击,只是速度变慢了而已,其实我们可以通过 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 攻击一般是针对 IP 发起的,所以呢,我们如果用了 CDN ,那别人就只能获取到我们的 CDN 节点 IP 。 如果遭遇到 DDOS 攻击,最简单的方式就是换个 IP ,套上一层 CDN 。 否者呢,有钱就买防御、堆硬件硬抗了,没钱的话呢,只能放弃挣扎了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.