防止ip攻击需“识别+拦截+限流”三步联动,nginx通过全局/局部deny封禁、路径级访问控制、禁用高危方法、auth_basic认证、limit_req/limit_conn限流及geo白名单实现精准防护。

防止特定 IP 对系统组件发起攻击,核心是“识别+拦截+限流”三步联动,而不是只靠单一封禁。Nginx 本身不主动识别攻击行为,但可通过配置精准控制请求入口,把恶意流量挡在业务逻辑之前。
直接封禁已知恶意 IP
这是最快速的应急手段,适用于已确认的攻击源。
- 在 http 块中全局封禁(所有站点生效):
deny 203.0.113.45;deny 198.51.100.0/24; - 或在特定 server 或 location 块中局部封禁(如仅限制 /api、/admin 等敏感路径):
location /admin { deny 192.168.0.100; allow all; } - 注意顺序:deny/allow 指令按书写顺序执行,且默认隐含
deny all;建议显式写allow all放在最后,避免误拒
对关键组件路径做细粒度访问控制
系统组件(如后台接口、数据库管理页、健康检查端点)往往有固定路径,应单独设防。
- 限制仅内网或运维 IP 可访问:
location /phpmyadmin { allow 10.10.0.0/16; deny all; } - 禁用高危 HTTP 方法(如 PUT、DELETE、TRACE),防止文件篡改或信息探测:
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) { return 405; } - 配合
auth_basic对管理类路径二次验证,不依赖应用层登录:location /metrics { auth_basic "Admin Only"; auth_basic_user_file /etc/nginx/.htpasswd; }
为组件接口启用请求限流与连接压制
单纯封 IP 容易被绕过(如换代理、IP池),必须叠加速率与并发控制。
- 对登录、API 调用等高频入口,用
limit_req控制频率:limit_req_zone $binary_remote_addr zone=api_limit:10m rate=3r/s;location /api/v1/login { limit_req zone=api_limit burst=5 nodelay; } - 对下载、长连接类组件(如 WebSocket 管理端点),用
limit_conn控制并发:limit_conn_zone $binary_remote_addr zone=conn_limit:10m;location /ws/ { limit_conn conn_limit 2; } - burst 和 nodelay 参数要结合业务容忍度设置:burst 允许短时突发,nodelay 决定是否排队;暴力破解场景建议用
nodelay直接拒绝
用 geo 模块实现动态可信网络白名单
当允许访问的 IP 范围较固定(如公司出口、云厂商可信段),比逐条写 deny 更可维护。
- 在 http 块定义可信区域:
geo $trusted_net { default 0; 192.168.1.0/24 1; 203.0.113.0/28 1; } - 在 server 或 location 中调用:
if ($trusted_net = 0) { return 403; } - 优势:规则集中管理,支持 CIDR 段,后续增删只需改 geo 块,无需重启整个 Nginx(reload 即可)











