直接用allow和deny指令可构建稳定IP黑白名单:白名单须“先allow后deny all”置于location/server块内,黑名单需“deny在allow all前”,推荐include抽离规则并用geo模块提升可维护性。

直接用 allow 和 deny 指令就能构建稳定、可维护的 IP 黑白名单,关键在规则顺序、作用域选择和配置组织方式。生产环境不追求花哨,而要逻辑清晰、便于审计、避免误拦。
白名单:只放行指定 IP 或网段,其余一律拒绝
适用于管理后台、内部 API、CI/CD 回调等敏感路径。核心原则是“先 allow,后 deny all”,且必须写在 location 或 server 块内——http 块中写无效。
- 允许多个 IPv4 网段:每行一条
allow 10.10.0.0/16;、allow 172.16.5.0/24; - 支持 IPv6:如
allow 2001:db8:abcd::/48; - 单个 IP 也可写:如
allow 192.168.1.200; - 最后一行必须是
deny all;,否则前面的 allow 不起隔离作用
示例(限制仅内网和运维跳板机访问):
location /admin/ {
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 203.0.113.50;
deny all;
}
黑名单:拦截已知恶意源,其余默认放行
常用于封禁扫描器、爬虫 IP 段或历史攻击源。重点是把 deny 放在 allow all 之前,否则会被提前放行。
- 可叠加多条
deny:如deny 198.51.100.0/24;、deny 203.0.113.64/27; - 禁止单个 IP:直接写
deny 192.168.1.101; - 末尾加
allow all;是必须的,否则所有请求都会被隐式拒绝
示例(全局拦截高危 C 段):
location / {
deny 203.203.203.0/24;
deny 192.0.2.128/25;
allow all;
}
集中管理:用 include 抽离规则,避免重复与散落
多个站点或 location 都需黑白名单时,硬编码易出错、难同步。推荐将规则单独成文件,再用 include 引入。
- 创建统一规则文件,例如
/etc/nginx/conf.d/ip-whitelist.conf - 内容保持简洁:只含
allow/deny语句,末尾带deny all;或allow all; - 在各
location中写include /etc/nginx/conf.d/ip-whitelist.conf; - 修改后务必先运行
nginx -t校验语法,再nginx -s reload
这样更新策略只需改一个文件,所有引用位置自动生效,也方便 Git 版本控制和灰度发布。
进阶建议:geo 模块提升可读性与扩展性
当黑白名单规模超过 10 条,或需要按地域、部门、环境分组时,geo 比纯 allow/deny 更清晰。
-
geo必须定义在http块顶层,不能放在server内 - 用变量标记信任状态,例如
$is_internal = 1表示内网 IP - 在
location中用if ($is_internal = 0) { return 403; }控制访问 - 支持
default值,未匹配 IP 自动落入默认分支,逻辑更可控
这种方式把“判断逻辑”和“执行动作”分离,后续接入 GeoIP 或动态黑名单服务也更平滑。


















