nginxip黑名单动态封禁的方法(nginx设置白名单)

nginxip黑名单动态封禁的方法(nginx设置白名单)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-12-12
文章简介

1.方案黑名单持久化到mysql(常见的方案是redis,但不利于控制,如:不同的ip设置不同的有效期、ip的crud、统计等等);通过lua-nginx-module,在nginx中开辟一块内

2025阿里云双十一服务器活动

1.方案

黑名单持久化到mysql(常见的方案是redis,但不利于控制,如:不同的ip设置不同的有效期、ip的crud、统计等等);

通过lua-nginx-module,在nginx中开辟一块内存(lua_shared_dict),lua将黑名单定期从mysql全量刷新至lua_shared_dict;

所有请求,都要到与lua_shared_dict中的ipcheck一下。

makeinstallprefix=/usr/local/luajit

2.2.安装nginx时,将lua模块编译进去

exportluajit_lib=/usr/local/luajit/lib

exportluajit_inc=/usr/local/luajit/include/luajit-2.1

https://www.fruan.com/post/configure--prefix=/nginx\

--with-ld-opt="-wl,-rpath,/usr/local/luajit/lib"\

--add-module=/opt/ngx_devel_kit-0.3.1rc1\

--add-module=/opt/lua-nginx-module-0.10.14rc3

ln-s/nginx/sbin/nginx/usr/sbin/nginx

3.配置

lua_package_path"/usr/local/lib/lua/?.lua;;";

lua_shared_dictip_blacklist4m;

if($http_x_forwarded_for~"^(\d+\.\d+\.\d+\.\d+)"){

#管理信息,访问该url可以查看nginx中的ip黑名单信息

location/get-ipblacklist-info{

access_by_lua_fileconf/lua/get_ipblacklist_info.lua;

#同步url,通过定时任务调用该url,实现ip黑名单从mysql到nginx的定时刷新

location/sync-ipblacklist{

access_by_lua_fileconf/lua/sync_ipblacklist.lua;

#生产域名配置,所有需要ip黑名单控制的location,都要包含以下语句

access_by_lua_fileconf/lua/check_realip.lua;

}

sync_ipblacklist.lua

localmysql_host="ipofmysqlserver"

--updateip_blacklistfrommysqlonceeverycache_ttlseconds

localmysql_connection_timeout=1000

localclient_ip=ngx.var.real_ip

localip_blacklist=ngx.shared.ip_blacklist

locallast_update_time=ip_blacklist:get("last_update_time");

iflast_update_time==nilorlast_update_time<(ngx.now()-cache_ttl)then

localmysql=require"resty.mysql";

red:set_timeout(mysql_connect_timeout);

localok,err,errcode,sqlstate=red:connect{

max_packet_size=1024*1024,

ngx.log(ngx.err,"mysqlconnectionerrorwhileretrievingip_blacklist:"..err);

new_ip_blacklist,err,errcode,sqlstate=red:query("selectip_addrfromip_blacklistwherestatus=0orderbycreate_timedesclimit10000",100)

ifnotnew_ip_blacklistthen

nginxip黑名单动态封禁的方法,nginx设置白名单

ip_blacklist:flush_all();

fork1,v1inpairs(new_ip_blacklist)do

ip_blacklist:set(v2,true);

ip_blacklist:set("last_update_time",ngx.now());

ngx.say("syncsuccessful");

get_ipblacklist_info.lua

--1万ip消耗不到1.5mngx.shared内存

--获取所有key会堵塞别的正常请求对ngx.shared内存的访问,因此只能取少数key展示

require"resty.core.shdict"

ngx.say("totalspace:"..ngx.shared.ip_blacklist:capacity().."<br/>");

ngx.say("freespace:"..ngx.shared.ip_blacklist:free_space().."<br/>");

ngx.say("lastupdatetime:"..os.date("%y%m%d_%h:%m:%s",ngx.shared.ip_blacklist:get("last_update_time")).."<br/>");

ngx.say("first100keys:<br/>");

ngx.say("--------------------------<br/>");

ip_blacklist=ngx.shared.ip_blacklist:get_keys(100);

forkey,valueinpairs(ip_blacklist)do

ngx.say(key..":"..value.."<br/>");

end

check_realip.lua

ifngx.shared.ip_blacklist:get(ngx.var.real_ip)then

returnngx.exit(ngx.http_forbidden);

end

3.3数据库设计

createtable`ip_blacklist`(

`id`int(11)notnullauto_increment,

`ip_addr`varchar(15)collateutf8mb4_bindefaultnull,

`status`int(11)default'0'comment'0:valid有效,1:invalid失效',

`effective_hour`decimal(11,2)default'24'comment'有效期,单位:小时',

`ip_source`varchar(255)collateutf8mb4_bindefaultnullcomment'黑名单来源',

`create_time`datetimedefaultcurrent_timestamp,

`modify_time`datetimedefaultcurrent_timestamponupdatecurrent_timestamp,

`remark`varchar(255)collateutf8mb4_bindefaultnullcomment'备注',

)engine=innodbdefaultcharset=utf8mb4collate=utf8mb4_bin;

createprocedureproc_ip_blacklist_status_update()

wheredate_add(create_time,intervaleffective_hourhour)<now();

createeventjob_ip_blacklist_status_update

callproc_ip_blacklist_status_update();

4crud

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

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

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

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

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

以上就是nginxip黑名单动态封禁的方法的详细内容,更多请关注主机测评网其它相关文章!

标签:
如何滚动docker中的nginx日志文件(dockernginxdaemonoff)
« 上一篇
返回列表
下一篇 »

如本文对您有帮助,就请抽根烟吧!