nginx ip黑名单动态封禁的例子

2019-10-17 16:32:47刘景俊

get_ipblacklist_info.lua

-- 调用URL查看黑名单信息
-- 1万IP消耗不到1.5M ngx.shared内存
-- 获取所有KEY会堵塞别的正常请求对ngx.shared内存的访问,因此只能取少数key展示
require "resty.core.shdict"
ngx.say("total space: " .. ngx.shared.ip_blacklist:capacity() .. "<br/>");
ngx.say("free space: " .. ngx.shared.ip_blacklist:free_space() .. "<br/>");
ngx.say("last update time: " .. os.date("%Y%m%d_%H:%M:%S",ngx.shared.ip_blacklist:get("last_update_time")) .. "<br/>");
ngx.say("first 100 keys: <br/>");
ngx.say("--------------------------<br/>");
ip_blacklist = ngx.shared.ip_blacklist:get_keys(100);
for key, value in pairs(ip_blacklist) do
 ngx.say(key .. ": " .. value .. "<br/>");
end

check_realip.lua

if ngx.shared.ip_blacklist:get(ngx.var.real_ip) then
 return ngx.exit(ngx.HTTP_FORBIDDEN);
end

3.3 数据库设计

CREATE TABLE `ip_blacklist` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ip_addr` varchar(15) COLLATE utf8mb4_bin DEFAULT NULL,
 `status` int(11) DEFAULT '0' COMMENT '0: valid 有效, 1: invalid 失效',
 `effective_hour` decimal(11,2) DEFAULT '24' COMMENT '有效期,单位:小时',
 `ip_source` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '黑名单来源',
 `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
 `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
 
 
CREATE PROCEDURE proc_ip_blacklist_status_update()
-- 将过期的IP状态改为失效
begin 
 update ip_blacklist
 set status=1
 where date_add(create_time,INTERVAL effective_hour hour) < now();
 commit;
end;
 
 
CREATE EVENT job_ip_blacklist_status_update
ON SCHEDULE EVERY 1 MINUTE
ON COMPLETION PRESERVE
ENABLE
DO
call proc_ip_blacklist_status_update();

4 CRUD

黑名单产生有手工的方式,也有自动的方式,或者两者兼有。

自动的方式有通过python分析elk日志,将恶意IP自动写入mysql,这是个大话题,这里不涉及。

手工的方式可以人肉查看elk请求日志,发现恶意IP,手工填入mysql,这里推荐一个开源的CRUD工具,用户体验很nice(比直接navicat好多了),当然也可以自己写……

项目地址:https://github.com/jonseg/crud-admin-generator

项目的强大之处在于,所有表都帮你生成菜单,然后这些表的CRUD就直接用了。

具体操作见官方说明,就不赘述了。

以上这篇nginx ip黑名单动态封禁的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易采站长站。