Nginx提供了多种方式实现IP黑名单的动态封禁,以下是几种常用方法:
http {
geo $blacklist {
default 0;
# 手动添加IP
192.168.1.100 1;
10.0.0.1/24 1;
# 从文件加载
include /etc/nginx/conf.d/blacklist.conf;
}
server {
if ($blacklist) {
return 403;
# 或者 rewrite ^ /403.html;
}
}
}
需要安装ngx_http_lua_module
模块:
http {
lua_shared_dict ip_blacklist 1m;
init_by_lua_block {
local blacklist = ngx.shared.ip_blacklist
-- 初始加载黑名单
blacklist:set("192.168.1.100", true)
}
server {
access_by_lua_block {
local blacklist = ngx.shared.ip_blacklist
local ip = ngx.var.remote_addr
if blacklist:get(ip) then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
location /update_blacklist {
content_by_lua_block {
local blacklist = ngx.shared.ip_blacklist
local ip = ngx.var.arg_ip
local action = ngx.var.arg_action
if action == "add" then
blacklist:set(ip, true)
elseif action == "remove" then
blacklist:delete(ip)
end
ngx.say("OK")
}
}
}
}
Fail2Ban可以监控日志并自动更新Nginx黑名单:
Nginx Plus提供了键值存储功能:
http {
keyval_zone zone=blacklist:1m state=/etc/nginx/conf.d/blacklist.json;
keyval $remote_addr $blocked zone=blacklist;
server {
if ($blocked) {
return 403;
}
}
}
需要编译安装此模块:
http {
blacklist on;
blacklist_file /etc/nginx/blacklist.txt;
server {
location / {
blacklist_check on;
}
}
}
手动更新:直接编辑黑名单文件后重载Nginx
sudo nginx -s reload
API方式:通过HTTP API更新(如Lua方法中的/update_blacklist接口)
自动化工具:使用Fail2Ban、OSSEC等安全工具自动更新
以上方法可以根据实际需求和安全级别选择适合的方案组合使用。