nginx扩展 OpenResty 实现防cc攻击教程

简介: 使用OpenResty实现CC攻击防护,包括两个主要步骤:限制请求速度和JS验证。首先,安装依赖(RHEL/CentOS需安装readline-devel, pcre-devel, openssl-devel,Ubuntu需安装libreadline-dev等)。然后,安装Luajit和OpenResty。在Nginx配置中,创建`lua`共享字典并设置`content_by_lua_file`调用lua脚本。lua脚本检查请求频率,超过限制则返回503,否则增加计数。同时,通过JS验证,生成随机码并重定向用户,用户需携带正确验证码请求才能访问。

使用openresty来实现防cc攻击的功能。openresty官网http://openresty.org/cn/index.html。下面是防cc攻击的流程图。 根据流程图,我们知道防cc攻击主要包括两部分,一是限制请求速度,二是给用户发送js跳转代码进行验证请求是否合法。

安装依赖

RHEL/Centos:

yum install readline-devel pcre-devel openssl-devel

ubuntu:

apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl

luajit安装

cd /tmp/

git clone http://luajit.org/git/luajit-2.0.git

cd luajit-2.0/

make && make install

ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit

ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/

openresty安装

cd /tmp

get http://agentzh.org/misc/nginx/ngx_openresty-1.2.4.13.tar.gz

tar xzf ngx_openresty-1.2.4.13.tar.gz

cd ngx_openresty-1.2.4.13/

./configure --prefix=/usr/local/openresty --with-luajit

make && make install

Nginx配置

nginx.conf:

   http{

   [......]

   lua_shared_dict limit 10m;

   lua_shared_dict jsjump 10m;

   

       server {

  #lua_code_cache off;

           listen       80;

           server_name  www.centos.bz;

   

           location / {

   default_type  text/html;

   content_by_lua_file "/usr/local/openresty/nginx/conf/lua";

           }

           location @cc {

               internal;

               root   html;

               index  index.html index.htm;

           }

       }

   }

/usr/local/openresty/nginx/conf/lua文件:

   local ip = ngx.var.binary_remote_addr

   local limit = ngx.shared.limit

   local req,_=limit:get(ip)

   if req then

           if req > 20 then

                   ngx.exit(503)

           else

                   limit:incr(ip,1)

           end

   else

           limit:set(ip,1,10)

   end

   

   local jsjump = ngx.shared.jsjump

   local uri = ngx.var.request_uri

   local jspara,flags=jsjump:get(ip)

   local args = ngx.req.get_uri_args()

   if jspara then

       if flags then

           ngx.exec("@cc")

       else

                   local p_jskey=''

                   if args["jskey"] and type(args["jskey"])=='table' then

                            p_jskey=args["jskey"][table.getn(args["jskey"])]

                   else

                            p_jskey=args["jskey"]

                   end

           if p_jskey and p_jskey==tostring(jspara) then

                           jsjump:set(ip,jspara,3600,1)

                           ngx.exec("@cc")

           else

                           local url=''

                           if ngx.var.args then

                                  url=ngx.var.scheme.."://"..ngx.var.host..uri.."&jskey="..jspara

                           else

                                  url=ngx.var.scheme.."://"..ngx.var.host..uri.."?jskey="..jspara

                           end

                           local jscode="window.location.href='"..url.."';"

                           ngx.say(jscode)

           end

       end

   else

   math.randomseed( os.time() );

       local random=math.random(100000,999999)

       jsjump:set(ip,random,60)

       local url=''

       if ngx.var.args then

           url=ngx.var.scheme.."://"..ngx.var.host..uri.."&jskey="..random

       else

           url=ngx.var.scheme.."://"..ngx.var.host..uri.."?jskey="..random

       end

       local jscode="window.location.href='"..url.."';"

       ngx.say(jscode)

   end

最后

lua代码部分解释

1、1-12行是限速功能实现,第5和第10行表示10秒钟内容最多只能请求20次。

2、14-48行是验证部分,24行中的3600表示验证通过后,白名单时间为3600秒,即1小时。

目录
相关文章
|
5月前
|
云安全 安全 BI
CC攻击该怎么防护更好
随着互联网发展,CC攻击成为严峻的网络安全问题。这种DDoS攻击通过操纵大量主机,向目标服务器发送大量请求,导致服务器资源耗尽。应对CC攻击,可以采取以下策略:部署高防IP或SCDN服务,限制请求频率,以及使用验证码验证。德迅云安全提供一站式安全加速解决方案,包括Web应用防火墙、CDN加速和抗DDoS防护,利用AI检测、智能语义解析等技术,有效防御各种网络攻击,同时保证网站内容的快速稳定访问。通过实时数据统计和安全可视化工具,便于监控和应对安全威胁。综合运用这些方法能有效降低CC攻击影响,保障Web应用程序的安全稳定运行。
|
1月前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
1月前
|
tengine 应用服务中间件 Linux
Tengine、Nginx安装PHP命令教程
要在阿里云Linux上安装PHP,请先更新YUM源并启用PHP 8.0仓库,然后安装PHP及相关扩展。通过`php -v`命令验证安装成功后,需修改Nginx配置文件以支持PHP,并重启服务。最后,创建`phpinfo.php`文件测试安装是否成功。对于CentOS系统,还需安装EPEL源和Remi仓库,其余步骤类似。完成上述操作后,可通过浏览器访问`http://IP地址/phpinfo.php`测试安装结果。
|
1月前
|
应用服务中间件 Linux nginx
Mac os 安装 nginx 教程(success)
这篇文章是关于如何在Mac OS系统上使用Homebrew安装nginx及其依赖,并解决安装过程中可能出现的权限问题。
80 0
Mac os 安装 nginx 教程(success)
|
3月前
|
云安全 负载均衡 安全
CC攻击和DDoS攻击
【8月更文挑战第17天】
96 4
|
3月前
|
应用服务中间件 nginx
[nginx]编译安装openresty
[nginx]编译安装openresty
|
4月前
|
Ubuntu 应用服务中间件 Linux
Linux学习之Ubuntu 20中OpenResty的nginx目录里内容和配置文件
总的来说,OpenResty的Nginx配置文件是一个强大的工具,它允许你以非常灵活的方式定义你的Web服务的行为。
82 2
|
4月前
|
JavaScript 应用服务中间件 nginx
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
206 10
|
4月前
|
应用服务中间件 网络安全 nginx
Nginx简易防CC策略规则
Nginx简易防CC策略规则
55 1
|
4月前
|
应用服务中间件 Linux 网络安全
nginx安装的详细教程(包括命令行安装和编译安装)
nginx安装的详细教程(包括命令行安装和编译安装)