一、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_referers none blocked *.example.com;
if ($invalid_referer) {
return 403;
}
}2. 防刷(ua控制)
if ($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/secure/ {
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.log 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 访问控制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论