nginx ip黑白名单是低开销网关防护手段:白名单默认拒绝、显式允许,黑名单默认放行、精准拦截;超百条时宜用geo/map模块提升性能,并需结合限流、日志审计与https双配置实现纵深防御。

在Nginx作为网关层防护时,IP黑白名单是最直接、低开销的访问控制手段。它不依赖后端逻辑,所有判断都在请求进入阶段完成,能有效拦截扫描器、暴力破解、爬虫等恶意流量。
白名单配置:只放行可信来源
适用于管理后台、运维接口、内网API等敏感路径。核心原则是“默认拒绝,显式允许”:
- 在
location块中先写deny all,再逐条写allow,顺序不能颠倒(Nginx按顺序匹配,遇到第一条匹配即生效) - 支持单IP(如
allow 10.20.30.40;)、CIDR网段(如allow 192.168.5.0/24;),避免写死大量单IP - 若白名单IP较多,建议抽离到独立文件(如
/etc/nginx/conf.d/whitelist.conf),用include引入,便于统一维护和脚本更新
黑名单配置:快速封禁已知风险IP
适合应对突发攻击或临时封禁行为异常的客户端。特点是“默认放行,精准拦截”:
- 在
location块中直接写deny规则,无需加allow all(Nginx默认允许未被deny的请求) - 可配合日志分析工具(如fail2ban)自动提取高频错误请求的IP,生成
deny指令并热重载Nginx - 注意避免误封:不要对
/根路径全局黑名单,应限定在高危路径(如/login、/wp-admin)下使用
高性能方案:geo与map模块替代硬编码
当IP列表超过百条,或需频繁更新时,allow/deny线性匹配会拖慢性能。推荐用变量机制提升效率:
- 用
geo模块定义白名单:在http块中声明geo $allowed { default 0; 1.2.3.4 1; 10.0.0.0/8 1; },然后在location中用if ($allowed = 0) { return 403; } - 用
map模块实现黑名单:类似地定义map $remote_addr $blocked { "1.2.3.4" 1; default 0; },再用if ($blocked) { return 403; } - 两者都支持
include外部文件(如include /etc/nginx/ip_blacklist.map;),配合nginx -s reload即可热更新,无需重启进程
生产环境加固建议
单纯靠IP过滤不够,需结合其他机制形成纵深防御:
- 将黑白名单与
limit_req限流联动,例如对非白名单IP启用更严格的QPS限制 - 返回状态码建议用
403而非444(关闭连接),便于前端或监控系统识别拦截意图 - 记录被拦截的IP到独立access日志(用
log_format加字段$allowed或$blocked),方便审计与溯源 - 避免在HTTPS server块中遗漏黑白名单配置——HTTP和HTTPS的
server是独立的,需分别设置










