ip_hash本身不防攻击,仅固定同IP请求至单台后端;需结合真实IP还原、限流(如limit_req_zone $remote_addr zone=perip:10m rate=5r/s)、黑名单(deny高危网段)及替代策略(如cookie哈希、least_conn)综合防护。

ip_hash 本身不防御攻击,它只是把同一 IP 的请求固定分发到某台后端。若攻击者集中用少量代理 IP(如 IDC 出口、公开代理池)发起高频请求,所有流量会被 hash 到同一台后端,极易导致单点过载甚至服务不可用。真正有效的防护需要在 ip_hash 基础上叠加真实 IP 还原、请求限流、恶意网段拦截和路由策略优化。
先确保哈希依据是真实客户端 IP
如果前端有 CDN、WAF 或多层 Nginx 代理,$remote_addr 默认是上一跳内网地址,ip_hash 就会把所有用户错误地映射到同一台后端。必须启用 real_ip_module 还原原始 IP:
- 在 http 块中声明可信代理段:set_real_ip_from 192.168.0.0/16;、set_real_ip_from 10.0.0.0/8;(按实际代理出口网段调整)
- 指定头字段提取真实 IP:real_ip_header X-Forwarded-For; 或 real_ip_header X-Real-IP;
- 验证是否生效:检查 access.log 中 $remote_addr 是否已变为公网 IP,而非 10.x 或 172.x 地址
对真实 IP 实施精准限流
即使请求被固定分发,也能通过速率控制压制单个攻击源的冲击强度:
- 在 http 块定义限流区域:limit_req_zone $remote_addr zone=perip:10m rate=5r/s;(根据业务容忍度设为 3–10 r/s)
- 在 location 或 server 块中启用:limit_req zone=perip burst=15 nodelay;
- burst 允许短时突发,nodelay 避免排队延迟;若攻击特征明显(如无 Cookie、User-Agent 异常),可配合 map 指令进一步细分规则
主动屏蔽已知高危代理与爬虫网段
比依赖 ip_hash 被动分流更有效的是从源头拒绝恶意流量:
- 新建 blacklist.conf,逐行写入已知风险段:deny 114.114.114.0/24;、deny 221.228.228.0/24;
- 在 upstream 或 server 块中引入:include blacklist.conf;
- 定期从 AbuseIPDB、FireHOL 等开源威胁情报源更新该文件,并配合 reload 自动生效
必要时降级或替换 ip_hash 策略
当攻击持续且代理 IP 难以穷举时,应考虑更抗干扰的路由方式:
- 改用 hash $cookie_session_id consistent;:攻击者无合法 Cookie 时走轮询,天然分散压力
- 启用 least_conn; + 主动健康检查:动态将新请求导向连接数最少的节点,缓解单点堆积
- 在入口层校验 JWT 或 API Token,对未授权高频请求直接拦截,不进入 upstream 流程


















