使用ngx_lua配置WAF防火墙为网站防御CC攻击

tengxunyun cera

博客建站三年了,从未重视过网站安全问题,毕竟个人小博客没必要多在乎安全问题,然而今天有位未知的朋友用实际行动告诉我一定要重视网站安全,不然损失的就不只是流量!特别是加了CDN的网站,那流量跑得飞起,然后你会为巨额流量买单。下面是今天我被CC攻击的全过程,以及我对此次攻击做出的补救措施,第一次搞网站防御若有错误欢迎指正。

第一次CC攻击

早上10点15分,突然收到腾讯云发来的CDN流量包即将消耗殆尽的邮件及短信通知,当时我就懵了,按照我一天500M的流量来算,不应该不够呀。然后瞬间意识到被攻击了 ,登陆腾讯云后台看到今日消耗流量40G。心都凉了半截,然后我快速设置了下腾讯CDN的请求次数控制,之前没有限制。限制每IP每秒仅可请求20次,然后设置CDN带宽阈值,超过自动回源。

最坑爹的是腾讯的CDN日志有2个小时左右的延迟,我根本没办法使用封禁IP的方式来解决这个问题。快12点我才看到腾讯CDN的日志信息,发现了一大堆下面形式的请求记录。

 

使用ngx_lua配置WAF防火墙为网站防御CC攻击

攻击者模拟了百度的UA,使用GET方法大量请求我的首页,使用的ip据查大部分是腾讯云的,而且ip杂乱,总共有高达600+ip,封禁ip的方法行不通了。

第二次CC攻击

下午在一个WordPress交流群中交流今天上午被CC攻击的事,刚说完,立马就受到了第二波攻击。这一次由于我设置了超过请求频率就会返回404页面,所以遭受的损失少了许多。找客服交流了许久,没有任何办法防御CC攻击,CDN流量损失也挽回不了。我开始在自己服务器上使用ngx_lua配置WAF防火墙,用来防御一部分CC攻击。既然CDN不靠谱,那么我还是靠自己吧,关键是CDN的流量跑起来太心痛了!

使用ngx_lua配置WAF防火墙为Nginx开启防御功能有很多种方式,最简单的就是使用oneinstack一键安装包安装服务器环境,oneinstack在2019年1月1日更新版本中新增了ngx_lua功能,可以自动安装配置,小白必备。

另一种就比较麻烦,需要自己手动下载源码,编译安装,然后配置Nginx支持,设置防火墙规则等等,一两句话说不完,这里就不多说了,需要的可以自行百度。

第三次CC攻击

下午3点05分,第三次CC攻击来临,这位老兄今天是耗上我了,不打死我的小博客不死心呀。CDN跑了10多G流量后成功回源,然后我的服务器防火墙也记录下了被拦截的CC攻击请求,如下:

 

使用ngx_lua配置WAF防火墙为网站防御CC攻击

图中我们可以看到拦截了一批CC攻击,但是仍然有一批透过了防御。

使用lua脚本+memcached动态黑名单防御

既然lua自己的CC防御逻辑拦不住,那我们就写一段拦截脚本,把一段时间内访问次数过多的用户ip给封禁处理。这里就需要使用memcached内存缓存了,当然你也可以使用redis缓存,也可以直接写到文件中,内存的响应比较快,我采取了memcached内存缓存策略。

在lua脚本文件中写入如下代码:

ip_bind_time = 300  --封禁IP时间
ip_time_out = 1   --指定ip访问频率时间段  
connect_count = 60 --指定ip访问频率计数最大值  
local memcached = require "memcached"
local memc, err = memcached:new()
if not memc then
    ngx.say("failed to instantiate memc: ", err)
    return
end
local ok, err = memc:connect("127.0.0.1", 11211)
if not ok then
    ngx.say("failed to connect: ", err)
    return
end
is_bind , err = memc:get("bind_"..ngx.var.remote_addr) 
if is_bind == "1" then  
	memc:close()
	ngx.exit(403);
	return;
end  
  
start_time , err = memc:get("time_"..ngx.var.remote_addr)  
ip_count , err = memc:get("count_"..ngx.var.remote_addr)  
--如果ip记录时间大于指定时间间隔或者记录时间或者不存在ip时间key则重置时间key和计数key  
--如果ip时间key小于时间间隔,则ip计数+1,且如果ip计数大于ip频率计数,则设置ip的封禁key1  
--同时设置封禁key的过期时间为封禁ip的时间 
	  
if start_time == nil or os.time() - start_time > ip_time_out then  
	res , err = memc:set("time_"..ngx.var.remote_addr , os.time())  
	res , err = memc:set("count_"..ngx.var.remote_addr , 1)  
else  
	ip_count = ip_count + 1  
	res , err = memc:set("count_"..ngx.var.remote_addr,ip_count)  
		if ip_count >= connect_count then  
			res , err = memc:set("bind_"..ngx.var.remote_addr,1,ip_bind_time)  
		end  
end

重载后手动测试,连续刷新首页4次,成功返回403错误。然后使用Linux机器利用ab工具进行压力测试,并发1000,访问后发现仍然会对正常用户产生影响,网页打不开了。

貌似这个脚本会对封禁的黑名单发起的请求进行处理,1W个黑名单请求就会处理1W次,所以仍然会阻塞正常用户的访问,不过如果CC攻击是持续性的,那么这段脚本还是有点用处的,除了第一波会影响正常访问外,后面就会好很多。建议将黑名单加入服务器防火墙,不经过nginx,这样就不会出现卡顿情况,否则即使进入nginx黑名单,nginx也会处理请求,仍然会被消耗资源。

感觉很棒!可以赞赏支持我哟~

cera aliyun tengxunyun cloudiplc

相关推荐

使用|Maverick|搭建|Wiki站点

使用 Maverick 搭建 Wiki 站点 Blog (https://www.zggsong.cn/archives/wiki.html) | GitHub (https://github.com/AlanDecode/Maverick-Theme-Galileo) | Demo (https://wiki.zggsong.cn/) 本文主要讲述了作者如何让使用基于 Python 构建静态博客生成器 Maverick (https://github.com/AlanDecode/Maverick),搭建 Wiki 站点。其中 Wiki 站点主题使用了 Kepler (https://github.com/AlanDecode/Maverick-Theme-Kepler),Maverick 用 GitHub Actions 自动构建。写完推送通过 Actions 自动构建生成静态页面,然后发布到 Github Pages。作者还进一步阐述了如何利用腾讯云开发 API 接入腾讯云,从而实现访问加速 效果就是寻常的左右分栏 #Wiki#,类似 Gitbook、语雀那样,用来记录一些零碎知识点并形成知识体系。 “在日常学习过程中,知识细小琐碎,有时甚至只是一句话,却时常有很重要的学习意义,放在博客一方面日后查找起来不方便,另一方面显得有些小题大做”,其实如何利用和规划,重要性大于形式本身

腾讯云服务器标准型S2实例配置性能应用场景选择详解

腾讯云服务器标准型S2实例是#均衡#计算、内存和#网络#资源型实例,#标准型S2实例#适用于通用型应用场景,分享标准型S2实例CPU配置性能、应用场景及如何选择: 腾讯云服务器标准型S2实例 腾讯云服务器标准型S2实例采用英特尔®至强® Broadwell处理器,搭配DDR4内存。S2实例属于较新一代的标准型实例,是一种计算、内存及网络平衡的实例规格。 2.4GHz基准主频的 Intel Xeon E5-2680 Broadwell(v4)处理器,DDR4 内存 最大售卖配置可达#56核#224GB 处理器与内存配比为1:2,1:4 计算、内存和网络资源的平衡 目前标准型S2实例的活动有很多,比如腾讯云服务器秒杀活动很多机型都是选择的标准型S2实例: 服务器秒杀: 地址:腾讯云服务器秒杀优惠活动 标准型S2实例规格族 规格 vCPU 内存 (GB) 网络 收发包 (pps) 队列数 内网 带宽能力 (Gbps) 主频 备注 S2.SMALL1 1 1 20万 1 1.5 2.4GHz – S2.SMALL2 1 2 20万 1 1.5 2.4GHz – S2.SMALL4 1 4 20万 1 1.5 2.4GHz – S2.MEDIUM2 …

腾讯云星星海SA2服务器配置性能如何|

腾讯云服务星星海SA2云服务器是根据自研技术性发布的云服务器,是新一代云服务器实体模型的硬件软件单独研发产品。开售至今,很受许多用户的热烈欢迎。小白最近对腾讯的云星Sa2服务器进行了性能评估,并对服务器的性能进行了测试。 官方网站:点击进入 腾讯云星星海SA2(标准型SA2)   星星海SA2实例特征 使用腾讯云自定义AMDCPU,主频达3.3GHz,100%CPU性能,提供超级单核L3缓存。标准型SA2更多内容可以查看官方文档:腾讯云标准型SA2实例规格参数 与上一代相比,CPU主频率提高了30%,网络性能提高了650%,图像转换性能提高了41%,视频编码和解码提高了50%,QPS提高了152%,MySQL提高了98%,POSTGRES提高了106%。而在2020年春节之后,腾讯、QQ、微信等内部业务长期超大流量探测,提供稳定的支持,不仅可以控制各种业务场景,与传统的物理机器相比,整体性能也提高了35%以上,成本降低了40%。 星星海SA2服务器硬件配置情况 该处理器是AMDCPU核心,频率为2595MHz(即,2.6GHz)。CPU的工作频率最高为3.3GHz。 服务器硬盘是一个高效云盘,I/O速率,性能在中等水平标准。高性能业务流程要求可切换为SSD云盘提升读写能力性能。 网络方面下载速度还是比较稳定的。由于腾讯云计算机房网络是多线bgp接入,包括中国电信/中国联通/中国移动/教育网络、国内网络,无论南北连通速度如何,都没有问题。 一般来说,sa2服务器的综合性能是好的。假如业务流程要求不高,费用预算不够,如同个人博客这些,大中小型网站都可以使用,没有问题。如果业务要求高且预算丰富,可以将云盘切换为SSD云盘,连续读写性能,带宽提升,例如配置2核4G5MSSD硬盘,每天运行数十万次访问,没有问题。如果要每天百万访问量其实可以购买更高的配置。星星海SA2最高有80核处理器、160GB内存。

LunaNode一年免费使用主机跑分测评

在LET上看到了一年体验套餐的帖子,于是申请了一个去使用了一下,下面是跑分。 ————————————————- nench.sh v2019.07.20-https://git.io/nench.sh 基准时间戳记:UTC 2020-04-21 03:01:04 ————————————————- 处理器:Intel®Xeon®CPU E5-2670 0 [url = home.php?mod = space&uid = 175] @ [/ url] 2.60GHz CPU核心数:1 频率:2599.998 MHz 内存:985M 掉期:511M 内核:Linux 4.15.0-66-Generic x86_64 磁盘: vda 16G硬盘 vdb 512M硬盘 CPU:SHA256杂凑500 MB     3.962秒 CPU:bzip2-压缩500 MB     6.477秒 CPU:AES加密500 MB     2.215秒 ioping:搜寻率     最小值/平均值/最大值/ mdev …

微信扫一扫,分享到朋友圈

使用ngx_lua配置WAF防火墙为网站防御CC攻击