识别并应对复杂恶意IP欺骗的关键是还原真实客户端IP、交叉验证请求特征、避免单点依赖;需配置real_ip相关指令提取真实IP,结合UA/Referer/时间戳等多维度识别异常,采用分层封禁策略并主动加固防御。

识别并应对复杂的恶意 IP 欺骗访问,关键在于还原真实客户端 IP、交叉验证请求特征、避免单点依赖。单纯靠 $remote_addr 就封禁,极易被伪造或误伤——尤其当攻击者通过代理、CDN、X-Forwarded-For 注入等方式混淆来源时。
第一步:确保真实 IP 被正确提取
如果 Nginx 前有 CDN、负载均衡或 WAF,$remote_addr 默认是上游节点 IP,不是用户真实地址。必须显式还原:
- 在
http块中启用set_real_ip_from,明确指定可信上游(如 Cloudflare、阿里云 SLB 的出口 IP 段); - 配置
real_ip_header X-Forwarded-For;或real_ip_header CF-Connecting-IP;(依 CDN 实际头字段而定); - 加一条
real_ip_recursive on;,支持多层代理链的递归解析; - 验证是否生效:临时加
log_format debug '$remote_addr - $http_x_forwarded_for — $realip_remote_addr';,比对日志中三者值是否一致。
第二步:用多维度组合识别欺骗行为
单看 IP 不可靠,需结合其他字段交叉判断异常模式:
-
UA + Referer + 请求路径突变:同一 IP 短时间内用不同 UA 访问
/wp-login.php、/api/v1/user、/admin/login,极可能是扫描器; -
Header 异常组合:如
X-Forwarded-For与CF-Connecting-IP不一致,或X-Forwarded-For含多个 IP 却无合法代理链(如出现私网地址+公网地址混排); -
请求时间戳矛盾:日志中
$time_local与$request_time显示请求耗时 200ms,但$upstream_response_time为 0.001s,说明可能绕过 upstream 直接打到 Nginx,属探测行为; -
空 UA 或畸形 UA:如
-、libwww-perl、sqlmap、masscan等明确工具标识,配合高频 404/403 可直接标记。
第三步:封禁策略要分层、可回滚、带上下文
不建议直接 deny 大量 IP 到配置文件——难维护、易冲突、热重载风险高。推荐组合方案:
-
短期应急:用
geo+map定义动态黑名单变量,配合if ($is_suspicious) { return 403; },支持脚本自动更新blacklist.conf并nginx -s reload; -
中长期防护:接入
fail2ban,但 filter 规则需自定义,例如匹配「10 分钟内 3 次 UA 为 sqlmap 且状态码为 404」,而非仅看 IP 频次; -
兜底防御:对所有非白名单来源,在关键 location(如
/login、/api/auth)强制校验$realip_remote_addr是否在可信地理库(如 APNIC 中国段)或是否携带有效 JWT,双因子过滤更稳; - 留痕与审计:封禁时记录完整上下文(IP、UA、Referer、原始 XFF、时间),写入独立日志,便于事后溯源和排除误封。
第四步:主动规避常见欺骗手法
针对典型欺骗手段提前加固:
- 禁止客户端伪造
X-Forwarded-For:在 Nginx 中添加underscores_in_headers on;并用map过滤非法头,或直接proxy_set_header X-Forwarded-For "";(若后端不依赖该头); - 关闭默认 server:防止恶意 IP 直接用 IP 地址访问,加一个
server { listen 80 default_server; server_name _; return 444; }(444 是 Nginx 特有“关闭连接”状态码); - 限制 HTTP 方法:对非必要路径(如静态资源)只允许
GET和HEAD,用if ($request_method !~ ^(GET|HEAD)$) { return 405; }; - 拒绝空 Host 头或非常规 Host:如
if ($host !~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$) { return 400; },防 Host 头注入。


















