本文主要是介绍Nginx 访问控制的多种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Nginx访问控制的多种方法》本文系统介绍了Nginx实现Web访问控制的多种方法,包括IP黑白名单、路径/方法/参数控制、HTTP基本认证、防盗链机制、客户端证书校验、限速限流、地理位置控制等基...
一、IP 白名单与黑名单
1. 允许/拒绝指定IP
location /admin/ {
allow 192.168.1.100; # 仅允许该IP访问
allow 10.0.0.0/24; # 或允许整个网段
deny all; # 其他全部拒绝
}2. 全局黑名单
http {
geo $block_ip {
default 0;
1.2.3.4 1;
5.6.7.0/24 1;
}
server {
if ($block_ip) {
return 403;
}
...
}
}geo模块适合大规模黑名单。
二、基于路径、方法、参数的访问控制
1. 路径限制
location /private/ {
deny all;
}2. 方法限制
location /api/ {
if ($request_method !~ ^(GET|POST)$) {
return 405;
}
}3. 参数限制
location /api/ {
if ($arg_token = "") {
return 403;
}
}三、HTTP 基本认证(Basic Auth)
1. 启用账号密码访问控制
location /secure/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}.htpasswd文件可用htpasswd工具生成。
四、Referer/UA 防盗链与防刷
1. 防盗链(Referer控制)
location /static/ {
valid_referjavascripters none blocked *.example.com;
if ($invalid_referer) {
return 403;
}
}2. 防刷(UA控制)
if (js$http_user_agent ~* "curl|bot|spider") { return 403; }
五、客户端证书校验(mTLS)
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
...
}适用于金融、政企等高安全场景。
六、限速限流(流量控制)
1. 单IP限速
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
location /api/ {
limit_req zone=req_limit burst=10 nodelay;
}2. 连接数限制
limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_conn conn_limit 10;
七、地理位置访问控制(GeoIP)
需安装第三方模块(如 ngx_http_geoip_module),可按国家/地区控制访问:
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default 0;
CN 1; # 仅允许中国
}
server {
if ($allowed_country = 0) {
return 403;
}
}八、API 安全与精细控制
1. 精细化路径/参数/方法控制
location /api/admin/ {
allow 127.0.0.1;
deny all;
}
location ~* /api/(delete|update)/ {
if ($request_method != "POST") {
return 405;
}
}2. 配合 OpenResty/Lua 动态访问控制
可以根据业务逻辑、数据库、Redis等动态判断是否允许访问。
九、企业级访问控制建议
- 重要接口建议多重保护(IP+密码+限流+Referer)
- 敏感路径建议只对内网或特定用户开放
- 日志记录所有被拒绝的访问,便于审计和溯源
- 定期更新黑名单、白名单,防止失效
- 结合 WAF、API 网关、堡垒机等安全产品提升防护等级
十、访问控制常见问题排查
- 控制未生效?
- 检查 location 优先级、正则匹配顺序。
- 误封正常用户?
- 检查 IP/Referer/UA 规则,避免误伤。
- 限流后接口不可用?
- 合理设置 burst,允许偶发高峰。
- 黑名单太大影响性能?
- 用 geo、map 或 Lua 动态判断,避免配置膨胀。
十一、完整访问控制配置示例
http {
geo $block_ip {
default 0;
1.2.3.4 1;
5.6.7.0/24 1;
}
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
listen 80;
server_name www.example.com;
if ($block_ip) { return 403; }
location /admin/ {
allow 192.168.1.100;
deny all;
auth_basic "Admin";
auth_basic_user_file /etc/nginx/.htpasswd;
}
location /static/ {
valid_referers none blocked *.example.com;
if ($invalid_referer) { return 403; }
}
location /api/ {
limit_req zone=req_limit burst=20 nodelay;
if ($request_method !~ ^(GET|POST)$) { return 405; }
if ($arg_token = "") { return 403; }
}
}
}十二、多级访问控制策略
1. 服务全局、Server级、Location级控制
- http块:全局黑名单/限流/Geo
- server块:站点级白名单/认证
- location块:路径级精细控制
示例:
http {
geo $block_ip { ... }
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
server {
if ($block_ip) { return 403; }
location /admin/ {
allow 10.0.0.0/8;
deny all;
}
location /api/ {
limit_req zone=req_limit burst=10 nodelay;
}
}
}建议高优先级规则(如黑名单)放在上层,局部规则覆盖全局。
十三、基于Header的访问限制
1. 按Header内容限制访问
常用于API签名、Token、特定应用接入。
location /api/secuandroidre/ { if ($http_x_token != "your-secret-token") { return 403; } }
2. 按Referer、Origin防止CSRF
if ($http_origin !~* ^https://trusted\.example\.com$) {
return 403;
}十四、按时间段控制访问
适用于限时活动、夜间维护、灰度发布等。
map $time_iso8601 $block_time {
default 0;
~T02:..:.. 1; # 02点整点到02:59:59 拒绝
}
server {
if ($block_time) {
return 403;
}
}也可用 Lua/定时脚本实现更复杂的时间控制。
十五、灰度/AB测试的访问控制
1. 按用户ID、Cookie、IP分流
map $cookie_abtest $upstream_group {
default "old";
"A" "new";
}
server {
location / {
proxy_pass http://$upstream_group;
}
}可结合 Lua 实现更灵活的灰度策略。
十六、动态黑白名单(与外部系统结合)
1. 结合 Redis/MySQL 实现动态名单
- 用 OpenResty/Lua 读取 Redis/MySQL,将名单实时更新到共享内存,支持热更新。
- 适合大规模名单、频繁变更场景。
示例:
Access_by_lua_block { local redis = require "resty.redis" local red = redis:new() red:connect("127.0.0.1", 6379) local is_blocked = red:get("ip:" .. ngx.var.remote_addr) if is_blocked == "1" then ngx.exit(403) end }
十七、日志、告警与审计
1. 记录被拒绝访问的请求
log_format rejectlog '$remote_addr $request $status $http_user_agent $time_local'; access_log /var/log/nginx/reject.ljsog rejectlog if=$access_denied;
$access_denied 可用 map/Lua 动态赋值。
2. 集成告警
- 结合 ELK、Prometheus、Zabbix,监控 403/405 等异常请求,自动触发告警。
十八、自动化管理与集中策略
1. 配置集中管理
- 采用 include 引入统一黑白名单、认证配置,便于多站点维护。
include /etc/nginx/whitelist.conf; include /etc/nginx/blacklist.conf;
2. 自动化工具
- 配合 Ansible/SaltStack/Puppet 实现名单、限流、认证等策略的自动分发和热更新。
十九、与WAF/堡垒机/认证系统集成
1. WAF防护
- 可用 Nginx+OpenResty/Lua-resty-waf 或接入云WAF,实现SQL注入、XSS等攻击防护。
2. 堡垒机/认证系统
- 重要接口后端部署堡垒机或认证代理,前端Nginx只允许堡垒机IP访问。
3. 第三方认证(OAuth2、JWT等)
- 可用 Lua 动态解析JWT、OAuth2 Token,按业务规则控制访问。
二十、常见安全场景实战
1. 管理后台只允许公司IP+二次认证
location /admin/ {
allow 10.0.0.0/8;
deny all;
auth_basic "Admin Only";
auth_basic_user_file /etc/nginx/.htpasswd;
}2. API接口防刷+签名校验
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
if ($http_x_sign = "") { return 403; }
}3. 静态资源防盗链+限速
location /static/ {
valid_referers none blocked *.example.com;
if ($invalid_referer) { return 403; }
limit_rate 100k;
}二十一、访问控制优化建议
- 分层分级设计,重要资源多重防护
- 动态名单、限流、认证与自动化结合,提升响应和运维效率
- 日志与监控全覆盖,异常及时告警
- 定期安全审计和回溯,防止策略失效或被绕过
到此这篇关于Nginx 访问控制的多种方法的文章就介绍到这了,更多相关Nginx 访问控制内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Nginx 访问控制的多种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!