插件窝 干货文章 nginx ip黑名单动态封禁的方法

nginx ip黑名单动态封禁的方法

blacklist Nginx 封禁 使用 988    来源:    2025-04-24

Nginx IP黑名单动态封禁方法

Nginx提供了多种方式实现IP黑名单的动态封禁,以下是几种常用方法:

1. 使用Nginx的ngx_http_geo_module模块

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;
        }
    }
}

2. 使用Lua脚本动态加载黑名单

需要安装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")
            }
        }
    }
}

3. 结合Fail2Ban动态封禁

Fail2Ban可以监控日志并自动更新Nginx黑名单:

  1. 安装Fail2Ban
  2. 创建Nginx过滤器
  3. 配置Fail2Ban jail规则

4. 使用Nginx Plus的键值存储

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;
        }
    }
}

5. 使用第三方模块ngx_http_blacklist_module

需要编译安装此模块:

http {
    blacklist on;
    blacklist_file /etc/nginx/blacklist.txt;

    server {
        location / {
            blacklist_check on;
        }
    }
}

动态更新方法

  1. 手动更新:直接编辑黑名单文件后重载Nginx

    sudo nginx -s reload
    
  2. API方式:通过HTTP API更新(如Lua方法中的/update_blacklist接口)

  3. 自动化工具:使用Fail2Ban、OSSEC等安全工具自动更新

最佳实践建议

  1. 对于高流量网站,建议使用共享内存方式存储黑名单
  2. 定期清理长时间未活动的IP
  3. 结合日志分析和自动化工具实现智能封禁
  4. 考虑使用CDN/WAF等更高级别的防护方案

以上方法可以根据实际需求和安全级别选择适合的方案组合使用。