Nginx Lua 防 CC 模块

该模块使用 Nginx Lua 语言编写,用于限制单个用户和 IP 的访问频率,防止恶意攻击,提高网站稳定性。

核心代码:

function denycc()
  if CCDeny then
    local uri = ngx.var.uri
    CCcount = tonumber(string.match(CCrate, '(.*)/'))
    CCseconds = tonumber(string.match(CCrate, '/(.*)'))
    local token = getClientIp() .. uri
    local limit = ngx.shared.limit
    local req, _ = limit:get(token)
    if req then
      if req > CCcount then
        ngx.exit(503)
        return true
      else
        limit:incr(token, 1)
      end
    else
      limit:set(token, 1, CCseconds)
    end
  end
  return false
end

代码说明:

  1. CCDeny:表示是否开启防 CC 功能,建议设置为 true
  2. CCrate:控制访问频率,格式为 请求次数/秒数,例如 10/60 表示每分钟最多允许 10 次访问。
  3. getClientIp():获取客户端 IP 地址的函数,需要根据实际情况进行调整。
  4. ngx.shared.limit:共享内存区域,用于存储访问记录。
  5. token:由 IP 地址和 URI 组成,用于标识访问用户。
  6. req:获取当前用户访问次数。
  7. CCcount:允许的访问次数。
  8. CCseconds:允许访问的秒数。

屏蔽 IP 的时间 (900 秒):

可以在函数中添加以下代码来实现:

local limit_ip = ngx.shared.limit_ip
local ip = getClientIp()
if limit_ip:get(ip) then
  ngx.exit(503)
  return true
else
  limit_ip:set(ip, true, 900)
end

这段代码会将客户端的 IP 作为 key,设置一个值为 true 的键值对存储在一个共享内存区域中,有效期为 900 秒。如果在有效期内再次访问该 IP,函数会直接返回 503,拒绝访问。

注意:

  1. ngx.shared.limitngx.shared.limit_ip 需要在 Nginx 配置文件中进行声明,并设置适当的内存大小。
  2. 该模块只是一个简单的示例,实际应用中需要根据实际情况进行调整和完善。

部署:

  1. 将代码保存为 denycc.lua 文件。
  2. 在 Nginx 配置文件中添加 lua_shared_dict limit 10m;lua_shared_dict limit_ip 10m; 来声明共享内存区域。
  3. 使用 location 指令将该模块应用到特定的 URL 上,例如:
location / {  
  content_by_lua 'require 'denycc' denycc()'; 
  ... 
}

总结:

该防 CC 模块可以有效限制单个用户和 IP 的访问频率,防止恶意攻击,提高网站稳定性。开发者可以根据实际情况进行调整和完善。

Nginx Lua 防 CC 模块 - 限制访问频率和IP

原文地址: https://www.cveoy.top/t/topic/oyYE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录