您当前的位置:首页 > 帮助中心 > 阿里云服务器知识库 >

阿里云代理商-凯铧互联分享:Nginx Lua Redis防止CC攻击

Nginx Lua Redis防止CC攻击实现原理:同一个外网IP、同一个网址(ngx.var.request_uri)、同一个客户端(http_user_agent)在某一段时间(CCseconds)内访问某个网址(ngx.var.request_uri)超过指定次数(CCcount),则禁止这个外网IP+同一个客户端(md5(IP+ngx.var.http_user_agent)访问这个网址(ngx.var.request_uri)一段时间(blackseconds)。

该脚本使用lua编写(依赖nginx+lua),将信息写到redis(依赖redis.lua)。

Nginx lua模块安装

重新编译nginx,安装lua模块

  1. pushd /root/oneinstack/src

  2. wget -c http://nginx.org/download/nginx-1.10.3.tar.gz

  3. wget -c http://mirrors.linuxeye.com/oneinstack/src/openssl-1.0.2k.tar.gz

  4. wget -c http://mirrors.linuxeye.com/oneinstack/src/pcre-8.39.tar.gz

  5. wget -c http://luajit.org/download/LuaJIT-2.0.4.tar.gz

  6. git clone https://github.com/simpl/ngx_devel_kit.git

  7. git clone https://github.com/openresty/lua-nginx-module.git

  8. tar xzf nginx-1.10.3.tar.gz

  9. tar xzf openssl-1.0.2k.tar.gz

  10. tar xzf pcre-8.39.tar.gz

  11. tar xzf LuaJIT-2.0.4.tar.gz

  12. pushd LuaJIT-2.0.4

  13. make && make install

  14. popd

  15. pushd nginx-1.10.3

  16. ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.0.2k --with-pcre=../pcre-8.39 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../lua-nginx-module --add-module=../ngx_devel_kit

  17. make

  18. mv /usr/local/nginx/sbin/nginx{,_bk}

  19. cp objs/nginx /usr/local/nginx/sbin

  20. nginx -t #检查语法

加载redis.lua

  1. mkdir /usr/local/nginx/conf/lua

  2. cd /usr/local/nginx/conf/lua

  3. wget https://github.com/openresty/lua-resty-redis/raw/master/lib/resty/redis.lua

在/usr/local/nginx/conf/nginx.conf http { }中添加:

  1. #the Nginx bundle:

  2. lua_package_path "/usr/local/nginx/conf/lua/redis.lua;;";

防止CC规则waf.lua

将下面内容保存在/usr/local/nginx/conf/lua/waf.lua

  1. local get_headers = ngx.req.get_headers

  2. local ua = ngx.var.http_user_agent

  3. local uri = ngx.var.request_uri

  4. local url = ngx.var.host .. uri

  5. local redis = require 'redis'

  6. local red = redis.new()

  7. local CCcount = 20

  8. local CCseconds = 60

  9. local RedisIP = '127.0.0.1'

  10. local RedisPORT = 6379

  11. local blackseconds = 7200

  12.  

  13. if ua == nil then

  14.     ua = "unknown"

  15. end

  16.  

  17. if (uri == "/wp-admin.php") then

  18.     CCcount=20

  19.     CCseconds=60

  20. end

  21.  

  22. red:set_timeout(100)

  23. local ok, err = red.connect(red, RedisIP, RedisPORT)

  24.  

  25. if ok then

  26.     red.connect(red, RedisIP, RedisPORT)

  27.  

  28.     function getClientIp()

  29.         IP = ngx.req.get_headers()["X-Real-IP"]

  30.         if IP == nil then

  31.             IP = ngx.req.get_headers()["x_forwarded_for"]

  32.         end

  33.         if IP == nil then

  34.             IP  = ngx.var.remote_addr

  35.         end

  36.         if IP == nil then

  37.             IP  = "unknown"

  38.         end

  39.         return IP

  40.     end

  41.  

  42.     local token = getClientIp() .. "." .. ngx.md5(url .. ua)

  43.     local req = red:exists(token)

  44.     if req == 0 then

  45.         red:incr(token)

  46.         red:expire(token,CCseconds)

  47.     else

  48.         local times = tonumber(red:get(token))

  49.         if times >= CCcount then

  50.             local blackReq = red:exists("black." .. token)

  51.             if (blackReq == 0) then

  52.                 red:set("black." .. token,1)

  53.                 red:expire("black." .. token,blackseconds)

  54.                 red:expire(token,blackseconds)

  55.                 ngx.exit(503)

  56.             else

  57.                 ngx.exit(503)

  58.             end

  59.             return

  60.         else

  61.             red:incr(token)

  62.         end

  63.     end

  64.     return

  65. end

Nginx虚拟主机加载waf.lua

在虚拟主机配置文件/usr/local/nginx/conf/vhost/oneinstack.com.conf

  1. access_by_lua_file "/usr/local/nginx/conf/lua/waf.lua";

测试

一分钟之内,一个页面快速点击20次以上,登录redis,看到black开通的key即被禁止访问(nginx 503)

linux运维:Nginx Lua Redis防止CC攻击


以上回复如果还未能解决您的问题,请联系凯铧互联售后技术支持。以上总结了Nginx Lua Redis防止CC攻击的处理办法说明。阿里云代理商凯铧互联提供阿里云服务器/企业邮箱等产品的代购服务,同样的品质,更多贴心的服务,更实惠的价格。 阿里云代理商凯铧互联会为您提供一对一专业全面的技术服务,同时还能为您提供阿里云其他产品购买的专属折扣优惠。通过凯铧互联购买可以获得折上折优惠!若您需要帮助可以直接联系我方客服,阿里云代理商凯铧互联专业技术团队为您提供全面便捷专业的7x24技术服务。 电话专线:136-5130-9831,QQ:3398234753。

为什么选择我们:

北京凯铧互联科技有限公司(简称凯铧互联)由多名前阿里云资深技术专家创立,核心员工来自阿里巴巴、腾讯等,作为阿里云,腾讯云百度云,金山云,华为云重要的合作伙伴,专注于为企业用户提供云计算及云计算的解决方案。总部设在,并在内蒙设有办事处。做为一家综合性方案商,凯铧互联向各行业用户提供基于云计算的各种解决方案。为用户获得优质服务的同时,秉承"专业规划、周到服务"的服务理念,根据用户的实际情况,充分考虑各种网络资源的特点及功效,为用户量身定北京做一套适合于其实际应用需求的网络应用方案。帮助用户利用互联网的力量展开新的营销方式,并大大缩短了项目实施周期,获得用户的一致好评。

阿里云服务器www.bjkaihua.com

阿里云主机www.bjkaihua.com

阿里云www.bjkaihua.com

阿里云代理商www.bjkaihua.com

北京服务器www.bjkaihua.com

云服务器www.bjkaihua.com

云主机www.bjkaihua.com

 


[2017-11-12 09:56:54]

在线咨询
售后咨询
扫一扫

扫一扫
凯铧科技

服务QQ
3287819116

返回顶部