访问控制与IP白名单
NGINX 提供基于 IP 的访问控制能力,通过 allow 和 deny 指令可精确限制哪些客户端可以访问特定资源。
核心指令
ngx_http_access_module 模块提供访问控制功能,默认编译并启用。
allow address|CIDR|unix:|all— 允许指定 IP 或网段访问deny address|CIDR|unix:|all— 拒绝指定 IP 或网段访问
指令按配置顺序逐条匹配,命中即停止。
基本配置
IP白名单
仅允许特定 IP 访问管理后台:
nginx
location /admin/ {
allow 192.168.1.100;
allow 10.0.0.0/8;
deny all;
proxy_pass http://backend;
}
匹配顺序从上到下,
deny all必须放在最后,否则会提前拒绝所有请求。
IP黑名单
拒绝已知恶意 IP,允许其他所有流量:
nginx
location /api/ {
deny 203.0.113.50;
deny 198.51.100.0/24;
allow all;
proxy_pass http://app_server;
}
高级用法
按 Location 独立控制
不同路径设置不同的访问策略:
nginx
server {
listen 80;
server_name example.com;
# 公开区域
location /public/ {
allow all;
}
# 内网接口
location /internal/ {
allow 172.16.0.0/12;
deny all;
}
# 运维管理
location /ops/ {
allow 192.168.1.0/24;
allow 10.10.10.5;
deny all;
}
}
全局+局部组合控制
在 server 块设置全局策略,在 location 块覆盖:
nginx
server {
listen 80;
server_name example.com;
# 全局拒绝恶意IP
deny 203.0.113.0/24;
location / {
# 继承server块策略
proxy_pass http://backend;
}
location /secure/ {
allow 10.0.0.0/8;
deny all; # 覆盖全局策略
proxy_pass http://secure_backend;
}
}
使用 include 管理IP列表
IP 较多时抽离到独立文件:
nginx
# ip_whitelist.conf
allow 192.168.1.0/24;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 203.0.113.100;
nginx
location /admin/ {
include /etc/nginx/conf.d/ip_whitelist.conf;
deny all;
proxy_pass http://backend;
}
将 IP 列表抽离到独立文件便于维护和版本控制,适合频繁变动的场景。
与 geo 模块配合
IP 数量庞大时,使用 geo 模块更高效:
nginx
http {
geo $whitelist {
default 0;
192.168.1.0/24 1;
10.0.0.0/8 1;
172.16.0.0/12 1;
}
server {
location /admin/ {
if ($whitelist = 0) {
return 403;
}
proxy_pass http://backend;
}
}
}
geo模块在内存中使用基数树匹配 IP,性能优于大量 allow/deny 指令。
要点总结
allow/deny指令按顺序逐条匹配,命中即停止deny all必须放在白名单规则的末尾- 不同 location 可独立设置访问策略
- 大量 IP 时使用
include文件或geo模块管理 geo模块使用基数树匹配,性能优于逐条 allow/deny- 被拒绝的请求返回 403 Forbidden
📝 发现内容有误?点击此处直接编辑