nginx黑白名单依赖allow和deny指令,顺序决定结果;白名单先allow后deny all,黑名单先deny后allow all;需按server块隔离配置,配合real_ip_module处理cdn/https场景,并推荐geo或include提升可维护性。

白名单:只放行指定 IP,其余一律拒绝
适用于管理后台、调试接口等需严格限制访问的场景。关键逻辑是“先允许多个合法来源,最后统一拒绝其他所有请求”:
- 在 server 或 location 块中逐行写
allow,支持单 IP(如allow 192.168.1.100;)和 CIDR 网段(如allow 10.0.0.0/8;) - IPv6 同样支持,例如
allow 2001:db8::/32; - 必须在所有
allow之后加deny all;,否则未匹配的请求会默认放行 - 示例配置:
location /admin/ {<br> allow 192.168.50.0/24;<br> allow 127.0.0.1;<br> deny all;<br> }
黑名单:禁止特定 IP,其余照常访问
适合屏蔽已知攻击源或恶意扫描段。重点在于“先拒绝黑名单,再放行全部”,顺序反了就失效:
- 把
deny规则写在allow all;前面,每条deny对应一个要封禁的 IP 或网段 - 可叠加多条,比如同时封
deny 198.51.100.0/24;和deny 203.0.113.64/27; -
allow all;必须放在最后,作为兜底放行项 - 示例配置:
location / {<br> deny 203.0.113.5;<br> deny 198.51.100.12;<br> allow all;<br> }
按域名独立控制:多个站点互不影响
同一台服务器跑多个域名时,黑白名单必须写在各自的 server 块内,不能放到全局 http 层或共用 location 中:
- 每个
server_name对应一个独立的 server 块 - 在 admin.example.com 的 server 块里设白名单,在 www.example.com 的 server 块里设黑名单,两者完全隔离
- 避免误配导致全站被锁或某站点失控
- 注意 HTTPS 和 CDN 场景下,真实客户端 IP 可能被覆盖,需配合
real_ip_module还原
进阶建议:提升可维护性与扩展性
当规则变多、需频繁更新或跨多个 server 复用时,推荐以下方式:
- 用
geo指令在 http 块预定义变量(如$is_trusted),再在 location 中用if ($is_trusted = 0) { return 403; }控制 - 将 IP 列表抽成外部文件,如
/etc/nginx/conf.d/ip-blacklist.conf,然后用include引入,便于统一管理和脚本自动更新 - 测试配置前务必执行
nginx -t,重载用nginx -s reload,避免配置错误导致服务中断











