Nginx IP 访问控制
在 Nginx 中,可以通过 allow 和 deny 指令轻松实现对特定 IP 或 IP 段的访问控制(黑白名单)。
🛠️ 基本语法
allow address | CIDR | unix: | all;:允许访问。deny address | CIDR | unix: | all;:拒绝访问。
匹配规则:Nginx 会按照配置文件中的顺序 从上到下 依次检查。一旦匹配成功,就会停止检查并执行相应的操作。
📝 配置示例
1. 阻止特定 IP 访问
如果您发现某个 IP 恶意请求,可以将其加入黑名单:
nginx
server {
listen 80;
server_name localhost;
location / {
# 拒绝特定 IP
deny 192.168.0.63;
deny 123.45.67.89;
# 允许其他所有 IP
allow all;
root /usr/share/nginx/html;
index index.html;
}
}2. 仅允许特定 IP/网段访问(白名单)
常用于内部管理后台或 API 接口:
nginx
location /admin/ {
# 只允许公司内部网段访问
allow 192.168.1.0/24;
allow 10.0.0.0/8;
# 拒绝除此之外的所有访问
deny all;
}🏗️ 作用域
allow 和 deny 指令可以放置在以下块中:
- http: 全局生效,影响所有虚拟主机。
- server: 仅对当前虚拟主机生效。
- location: 仅对匹配到的 URL 路径生效。
📂 使用外部文件管理 IP 列表
当黑名单 IP 非常多时,直接写在主配置文件中会显得混乱且难以维护。可以使用 include 指令导入外部文件。
创建一个文件
/etc/nginx/block_ips.conf:nginxdeny 192.168.1.1; deny 192.168.1.2; # ... 更多 IP在
nginx.conf中引入:nginxhttp { include block_ips.conf; # ... }
⚠️ 注意事项
- 顺序非常重要:
- 错误示例:nginx
allow all; deny 192.168.1.1; # 这行永远不会被执行,因为上面已经 allow all 了
- 错误示例:
- 反向代理下的真实 IP: 如果 Nginx 位于负载均衡器(如 SLB、CDN)之后,
$remote_addr可能是代理服务器的 IP。此时需要配合ngx_http_realip_module模块来获取真实的客户端 IP。
