Nginx 实现 IP 黑白名单过滤需用 allow/deny 指令,置于 location/server/http 块中,按自上而下顺序匹配;白名单末尾加 deny all,黑名单可省略 allow all;支持 IPv4/IPv6、网段、include 外部文件,无需第三方模块。

在 Nginx 中实现 IP 黑白名单过滤,核心是使用 allow 和 deny 指令,配合 deny all 或 allow all 构建访问控制规则。这些指令必须放在 location、server 或 http 块中,且遵循“自上而下匹配、先匹配先生效”的原则。
配置黑白名单的基本语法
规则按顺序写入,Nginx 逐条匹配,遇到第一条匹配项即停止:
-
allow 192.168.1.100;—— 允许该 IP 访问 -
allow 192.168.1.0/24;—— 允许整个网段 -
deny 203.123.45.67;—— 拒绝该 IP -
deny all;—— 拒绝所有未明确允许的请求(常用于白名单场景末尾)
注意:deny all 必须放在所有 allow 之后,否则前面的 allow 不生效;反之,黑名单场景通常以 allow all 结尾(但一般不写,默认即允许)。
只允许指定 IP 访问(白名单模式)
适用于后台管理页、API 调试接口等敏感路径:
location /admin/ {
allow 1.2.3.4;
allow 2001:db8::1;
allow 192.168.0.0/16;
deny all;
}
这样只有列出的 IPv4、IPv6 或网段可访问 /admin/ 下所有资源,其余一律返回 403 Forbidden。
拒绝特定 IP 访问(黑名单模式)
适合临时封禁恶意扫描或攻击源:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">location / {
deny 198.51.100.25;
deny 203.0.113.0/24;
# 可继续添加更多 deny 行
proxy_pass http://backend;
}}
被拒绝的 IP 请求会直接返回 403,不会转发到后端。如需记录日志,可搭配 log_format 和 $remote_addr 单独标记。
用 include 外部文件管理大量 IP 规则
当黑白名单条目较多时,避免硬编码在配置中,推荐拆分为独立文件:
- 新建
/etc/nginx/conf.d/ip-blacklist.conf,内容为多行deny xxx; - 在对应
location或server块中加入:include /etc/nginx/conf.d/ip-blacklist.conf; - 修改后执行
nginx -t && nginx -s reload生效
这种方式便于脚本自动更新(例如从威胁情报同步封禁 IP),也利于配置版本管理。
不需要第三方模块,纯官方功能即可完成。关键是规则顺序和 deny all 的位置,配错会导致全部放行或全部拦截。











