我是靠谱客的博主 温柔枫叶,最近开发中收集的这篇文章主要介绍openresty+redis 限制访问,Web应用型防火墙,WAF,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.安装openresty

安装依赖

# yum -y install pcre-devel zlib-devel openssl-devel

官网:http://openresty.org/cn/download.html

1.15版本:https://openresty.org/download/openresty-1.15.8.2.tar.gz

# cd /software
# wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
# tar xvf openresty-1.15.8.2.tar.gz
# cd openresty-1.15.8.2
# ./configure && make && make install

2.写一个lua脚本

默认openresty安装在/usr/local/下
# vi /usr/local/openresty/waf_lua

着重填写前五行,其他直接复制 

local ip = "127.0.0.1"	-- redis服务器IP
local port = 6379  -- redis端口号
local passwd = 123  -- redis密码
local times = 3  -- redis访问次数限制
local expire_time = 600  -- redis拉黑时间/秒


------------------------------------


local function close_redis(red)
    if not red then
        return
    end
    local pool_max_idle_time = 10000
    local pool_size = 100
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
 
    if not ok then
        ngx_log(ngx_ERR, "set redis keepalive error : ", err)
    end
end
 
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)

local ok, err = red:connect(ip,port)
if not ok then
    return close_redis(red)
end

red:auth(passwd); 

local clientIP = ngx.req.get_headers()["X-Real-IP"]
if clientIP == nil then
   clientIP = ngx.req.get_headers()["x_forwarded_for"]
end
if clientIP == nil then
   clientIP = ngx.var.remote_addr
end
 
local incrKey = "user:"..clientIP..":freq"
local blockKey = "user:"..clientIP..":block"
 
local is_block,err = red:get(blockKey) -- check if ip is blocked
if tonumber(is_block) == 1 then
   ngx.exit(ngx.HTTP_FORBIDDEN)
   return close_redis(red)
end
 
res, err = red:incr(incrKey)
 
if res == 1 then
   res, err = red:expire(incrKey,1)
end
 
if res > times then
    res, err = red:set(blockKey,1)
    res, err = red:expire(blockKey,expire_time)
end
 
close_redis(red)

修改配置文件

# vim /usr/local/openresty/nginx/conf/nginx.conf

location / {
	index index.html index.html;
	access_by_lua_file /usr/local/openresty/waf_lua;
}

或者将这句access_by_lua_file放在您需要限制起访问的location中。

开启服务
# /usr/local/openresty/bin/openresty

3.验证

用浏览器访问主页,快速刷新,一会就403限制了。

从redis服务器中可以看到

1) "user:10.1.1.1:block"

被拉黑了

最后

以上就是温柔枫叶为你收集整理的openresty+redis 限制访问,Web应用型防火墙,WAF的全部内容,希望文章能够帮你解决openresty+redis 限制访问,Web应用型防火墙,WAF所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部