Nginx 访问控制的多种方法

2025-12-08 20:50

本文主要是介绍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;
}
android

五、客户端证书校验(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等动态判断是否允许访问。

九、企业级访问控制建议

  1. 重要接口建议多重保护(IP+密码+限流+Referer)
  2. 敏感路径建议只对内网或特定用户开放
  3. 日志记录所有被拒绝的访问,便于审计和溯源
  4. 定期更新黑名单、白名单,防止失效
  5. 结合 WAF、API 网关、堡垒机等安全产品提升防护等级

十、访问控制常见问题排查

  1. 控制未生效?
    • 检查 location 优先级、正则匹配顺序。
  2. 误封正常用户?
    • 检查 IP/Referer/UA 规则,避免误伤。
  3. 限流后接口不可用?
    • 合理设置 burst,允许偶发高峰。
  4. 黑名单太大影响性能?
    • 用 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;
}

二十一、访问控制优化建议

  1. 分层分级设计,重要资源多重防护
  2. 动态名单、限流、认证与自动化结合,提升响应和运维效率
  3. 日志与监控全覆盖,异常及时告警
  4. 定期安全审计和回溯,防止策略失效或被绕过

到此这篇关于Nginx 访问控制的多种方法的文章就介绍到这了,更多相关Nginx 访问控制内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Nginx 访问控制的多种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156397

相关文章

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

windows下安装Nginx全过程

《windows下安装Nginx全过程》文章介绍了HTTP和反向代理服务器的概念,包括正向代理和反向代理的区别,并详细描述了如何安装和配置Nginx作为反向代理服务器... 目录概念代理正向代理反向代理安装基本属性nginx.conf查询结构属性使用运行重启停止总结概念是一个高性能的HTTP和反向代理we

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝