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

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黑名单动态封禁的方法的详细内容,更多请关注主机测评网其它相关文章!
本文来源:国外服务器--nginxip黑名单动态封禁的方法(nginx设置白名单)
本文地址:https://www.idcbaba.com/guowai/3058.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。



