openresty+nginx开发web/waf(2)

本文介绍如何在Nginx中实现IP白名单和黑名单功能,包括如何获取客户端IP地址,以及通过Lua脚本实现精确的黑白名单控制。黑白名单可以有效防止恶意攻击和未授权访问。

mvc 中加上waf模块

lite/mvc.lua

-- waf begin

local ret, waf = pcall(require, "waf") -- 安全引入rewrite模块,假如没有也不会报错

if ret then
    local c_ret, r_ret = pcall(waf.exec)
    -- c_ret 表示执行成功,r_ret 表示已重定向,两者都为true,则表示重写成功,则不继续往下执行
    if c_ret and r_ret then
        return
    end
end

-- waf end

这个不一定要在mvc里面做,也可以直接在access_by_lua阶段做

获取用户IP

function get_client_ip()
    local ip = ngx.req.get_headers()["x_forwarded_for"]
    if not ip then
       ip = ngx.var.remote_addr
    else
       ip = ngx.re.gsub(ip, ",.*", "")
    end
    return ip
end

白名单实现

原理就是预先设置好一个白名单列表,然后判断ip是否在列表中,在则不做处理,不在则直接调用ngx.exit中断当前请求

-- 实际情况可以根据需要将ip放在共享内存,或者redis当中,这里为了简单直接写死了
local white_list_str = "127.0.0.1,192.168.0.168"
local white_list = {}
local it, err = ngx.re.gmatch(white_list_str, '([0-9]+)[.]([0-9]+)[.]([0-9]+)[.]([0-9]+)')
while true do
    local m, err = it()
    if err then
        ngx.log(ngx.ERR, "error: ", err)
        return
    end
    if not m then   break   end
    white_list[m[0]] =  true
end

local ip = get_client_ip()
if not white_list[ip] then
    ngx.exit(444)
    return true
end
return false

黑名单实现

原理就是预先设置好一个黑名单列表,然后判断ip是否在列表中,在则直接调用ngx.exit中断当前请求,不在则不做处理,跟白名单刚好相反

-- 实际情况可以根据需要将ip放在共享内存,或者redis当中,这里为了简单直接写死了
local black_list_str = "127.0.0.1,192.168.0.168"
local black_list = {}
local it, err = ngx.re.gmatch(black_list_str, '([0-9]+)[.]([0-9]+)[.]([0-9]+)[.]([0-9]+)')
while true do
    local m, err = it()
    if err then
        ngx.log(ngx.ERR, "error: ", err)
        return
    end
    if not m then   break   end
    black_list[m[0]] =  true
end

local ip = get_client_ip()
if black_list[ip] then
    ngx.exit(444)
    return true
end
return false

黑白名单

前面的黑白名单只能单独使用,混合使用还有一点问题,主要是白名单部分,判断不在白名单就直接中断请求了,只要稍微调整一下代码就可以了

local ip = get_client_ip()
-- 先检查白名单,在白名单内,则直接放行
if white_list[ip] then
    return false
end
-- 如果在黑名单内直接中断请求
if black_list[ip] then
    ngx.exit(444)
    return true
end

访问 http://localhost

然后,把waf.lua 里面的white_list_str、black_list_str中的127.0.0.1去掉看效果

转载于:https://my.oschina.net/phybrain/blog/1577010

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值