Nginx在server块中通过allow/deny实现IP访问控制,必须严格遵循“先allow后deny all”的顺序,否则未匹配IP默认放行;代理场景需配合set_real_ip_from和real_ip_header还原真实IP;大量规则应抽离为独立文件并用include引入。

直接在 server 块里写 allow 和 deny 就能实现——但顺序和收尾必须严格,否则规则无效。
规则必须按顺序匹配且以 deny all 结尾
Nginx 对 IP 的判断是“自上而下、命中即停”,不支持回溯或逻辑组合。所以:
- 所有
allow行必须写在deny之前 - 必须以
deny all;收尾,否则未显式允许的 IP 默认放行(Nginx 默认策略是开放) - 单条规则不支持逗号分隔,多个 IP 或网段要分行写
正确示例:
server {
listen 80;
server_name example.com;
allow 203.123.45.67;
allow 192.168.10.0/24;
deny all;
}
代理环境下真实 IP 识别是前提
如果请求经过 CDN、WAF 或负载均衡,$remote_addr 拿到的是代理节点 IP,不是用户真实 IP。此时需额外配置:
- 用
set_real_ip_from声明可信代理地址(如 CDN 回源 IP 段) - 用
real_ip_header X-Forwarded-For或X-Real-IP指定取哪个 header - 确保代理确实透传了真实 IP,且未被伪造(建议校验
X-Forwarded-For首段 + 可信链路)
配置片段示例:
set_real_ip_from 192.168.200.0/24; set_real_ip_from 2001:db8::/32; real_ip_header X-Forwarded-For; real_ip_recursive on;
大量 IP 管理建议抽离为独立文件
当允许列表超过 5–10 个 IP 或网段时,硬编码在 server 块里难维护、易出错。推荐做法:
- 新建一个配置文件,比如
/etc/nginx/conf.d/whitelist.conf - 在里面只写
allow行,末尾加deny all; - 在 server 块中用
include /etc/nginx/conf.d/whitelist.conf;引入 - 每次更新只需改文件、执行
nginx -t && nginx -s reload
验证与调试不能跳过
配置生效前务必验证,上线后也要确认行为符合预期:
- 运行
nginx -t检查语法,避免 reload 失败导致服务中断 - 用
curl -H "X-Forwarded-For: 203.123.45.67" http://yourdomain.com模拟真实请求 - 查看 error log(
error_log /var/log/nginx/error.log notice;),搜索 “access forbidden” 或 “client denied by rule” - 注意:403 响应体默认为空,如需友好提示,可配
error_page 403 /403.html;并提供静态页面


















