直播平台开发之如何通过Nginx防御CC攻击

发布来源:云豹科技
发布人:云豹科技
2022-08-11 09:56:15

直播平台开发最基础也是最重要的目标,就是稳定的系统服务,用户体验是建立在系统服务上的,但是当系统受到攻击后,系统服务必定会受到影响,从而影响用户体验。今天我们以CC攻击为例,分析一下直播平台开发时,如果通过Nginx防御CC攻击,保持服务稳定。

一、主动抑制方法

1、调整最大连接数

直播平台开发为了让Nginx支持更多的并发连接数,根据实际情况对工作线程数和每个工作线程支持的最大连接数进行调整。

例如设置“worker_processes 10”和“worker_connections 1024”,那这台服务器支持的最大连接数就是10×1024=10240。


worker_processes 10;
events {
use epoll;
worker_connections 10240;
}


2、控制用户请求

Nginx 提供了2个限制用户连接的模块:LimitZone和LimitReq,LimitZone可以根据条件进行并发连接数控制,例如可以定义以下代码:


http {
limit_zone   my_zone  $binary_remote_addr  10m;
server {
location /somedir/ {
limit_conn   my_zone  1;
}
}
}


在上面的代码中,“limit_zone my_zone $binary_remote_addr 10m”的意思是定义一个名称为my_zone的存储区域、my_zone中的内容为远程IP地址、my_zone的大小为10M;“location /somedir/”的意思是针对somedir目录应用规则;“limit_conn my_zone 1”的意思是针对上面定义的my_zone记录区记录的IP地址在指定的目录中只能建立一个连接。

LimitReq可以根据条件进行请求频率的控制,例如可以定义以下代码:


http {
limit_req_zone  $binary_remote_addr  zone=my_req_zone:10m   rate=1r/s;
...
server {
...
location /somedir/ {
limit_req_zone   zone= my_req_zone  burst=2;
}


其中“limit_req_zone $binary_remote_addr zone=my_req_zone:10m rate=1r/s”的意思是定义一个名称为my_req_zone的存储区域,my_req_zone内容为远程IP地址,my_req_zone大小为10M,my_req_zone中的平均请求速率只能为1个每秒;“location /somedir/”的意思是针对somedir目录应用规则;“limit_req_zone zone= my_req_zone burst=2”的意思是针对上面定义的my_req_zone记录区记录的IP地址在请求指定的目录中的内容时最高2个每秒的突发请求速率。

当有连接触发上诉规则时,Nginx会报“503 Service Temporarily Unavailable”的错误,返回503,停止用户请求。

二、被动防御方法

直播平台开发实现被动防御,可以采用封禁IP地址方法。访问者通过浏览器正常访问网站,一般与服务器建立的连接一般不会超过20个,我们可以通过脚本禁止连接数过大的IP访问。

以下脚本通过netstat命令列举所有连接,将连接数最高的一个IP禁止访问,比如连接数超过100,则通过 iptables阻止访问:


cat refuse.sh
#!/bin/sh
status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1`
NUM=`echo $status|awk '{print $1}'`
IP=`echo $status|awk '{print $2}'`
result=`echo "$NUM > 100" | bc`
if [ $result = 1 ]
then
echo IP:$IP is over $NUM, BAN IT!
/sbin/iptables -I INPUT -s $IP -j DROP
Fi


加入计划任务执行:

运行crontab -e,将上述脚本添加到crontab每分钟自动运行:

* * * * * /root/refuse.sh

通过ab工具进行服务器压力测试:

# ab -n 1000 -c 100 http://www.test.com/index.php

测试完成后,我们就可以看到系统中有IP被封的提示:


tail /var/spool/mail/root
IP:xx.xx.xx.xx is over 1000, BAN IT!


到此结束

三、屏蔽请求

直播平台开发还可以根据特征码屏蔽请求,这对防御CC攻击效果较好。

当服务器遭遇CC攻击时,我们可以快速查看日志,分析其请求的特征,比如User-agent。

下面的是某一次CC攻击时的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate

我们将User-agent中带有“must-revalidate”的请求全部拒绝访问:


if ($http_user_agent ~ must-revalidate) {
return 403;
}


直播平台开发实现CC攻击防御后,可以有效提升系统服务的安全性和稳定性,为用户提供良好的服务环境。

声明:以上内容为云豹科技原创,未经作者本人同意,禁止转载,否则将追究相关法律责任www.yunbaokj.com

声明:
以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任