插件窝 干货文章 基于Nginx如何实现访问控制、连接限制

基于Nginx如何实现访问控制、连接限制

访问 控制 blacklist Nginx 629    来源:    2025-04-25

Nginx访问控制与连接限制实现方案

一、访问控制实现

1. 基于IP的访问控制

location / {
    # 允许特定IP访问
    allow 192.168.1.1;
    allow 192.168.1.0/24;

    # 拒绝其他所有IP
    deny all;

    # 默认处理
    proxy_pass http://backend;
}

2. 基于密码认证的访问控制

location /admin {
    auth_basic "Administrator's Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    # 其他配置...
}

创建密码文件:

htpasswd -c /etc/nginx/.htpasswd username

3. 基于Referer的访问控制

valid_referers none blocked server_names *.example.com;

if ($invalid_referer) {
    return 403;
}

4. 基于User-Agent的访问控制

if ($http_user_agent ~* (wget|curl|python|java)) {
    return 403;
}

二、连接限制实现

1. 限制连接数(ngx_http_limit_conn_module)

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location /download/ {
            limit_conn addr 1;  # 每个IP同时只能有1个连接
        }
    }
}

2. 限制请求速率(ngx_http_limit_req_module)

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=one burst=20 nodelay;
            # 平均速率10请求/秒,突发允许20请求
        }
    }
}

3. 限制带宽

location /download/ {
    limit_rate 100k;  # 限制下载速度为100KB/s
    limit_rate_after 1m;  # 下载1MB后开始限速
}

三、高级访问控制

1. 基于地理位置(GeoIP模块)

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    map $geoip_country_code $allowed_country {
        default no;
        US yes;
        CA yes;
        GB yes;
    }

    server {
        if ($allowed_country = no) {
            return 403;
        }
    }
}

2. 动态黑名单

http {
    # 创建共享内存区域存储黑名单IP
    lua_shared_dict ip_blacklist 10m;

    server {
        location / {
            access_by_lua_block {
                local blacklist = ngx.shared.ip_blacklist
                local client_ip = ngx.var.remote_addr

                if blacklist:get(client_ip) then
                    ngx.exit(ngx.HTTP_FORBIDDEN)
                end
            }
        }

        location /blacklist {
            content_by_lua_block {
                -- 通过API动态添加IP到黑名单
                local blacklist = ngx.shared.ip_blacklist
                local ip = ngx.var.arg_ip
                blacklist:set(ip, true, 3600)  -- 黑名单1小时
                ngx.say("Added "..ip.." to blacklist")
            }
        }
    }
}

四、最佳实践建议

  1. 分层防御:结合多种访问控制方法实现深度防御
  2. 日志记录:记录被拒绝的访问以便分析
  3. 性能考虑:复杂的访问控制规则可能影响性能,应在测试环境中验证
  4. 定期审查:定期审查访问控制规则,确保其符合当前安全需求
  5. 错误处理:为被拒绝的访问提供友好的错误页面

以上配置可根据实际需求组合使用,构建适合您应用场景的安全访问控制体系。