news 2026/8/11 11:22:53

Nginx通过CDN获取真实IP并实现精准封禁配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx通过CDN获取真实IP并实现精准封禁配置指南

1. 项目背景与核心需求

当网站启用CDN服务后,所有客户端请求都会先经过CDN节点,这使得Nginx日志中记录的IP地址全部变成了CDN服务器的IP。这种场景下,传统的deny指令会直接屏蔽CDN节点IP,导致所有流量被阻断。我们需要一种机制,能够穿透CDN获取真实的客户端IP,并基于真实IP实施精准封禁。

典型的业务场景包括:

  • 防御CC攻击时精准封禁攻击源
  • 针对恶意爬虫实施IP黑名单
  • 限制特定地区的访问权限
  • 防止暴力破解等安全威胁

2. 核心技术原理解析

2.1 HTTP头部传递机制

CDN服务商普遍采用X-Forwarded-For(XFF)头部传递原始IP,其格式为:

X-Forwarded-For: 客户端IP, 代理服务器1 IP, 代理服务器2 IP...

例如经过多层代理的情况:

X-Forwarded-For: 203.0.113.45, 198.51.100.22, 192.0.2.67

2.2 Nginx变量处理逻辑

Nginx内置变量说明:

  • $remote_addr:直接TCP连接的客户端IP(即CDN节点IP)
  • $http_x_forwarded_for:完整的XFF头信息
  • $realip_remote_addr:realip模块解析后的真实IP

3. 完整配置方案实现

3.1 基础环境准备

确认Nginx编译时包含--with-http_realip_module

nginx -V 2>&1 | grep -o with-http_realip_module

3.2 核心配置代码

http { # 定义可信CDN IP段(必须配置) set_real_ip_from 203.0.113.0/24; set_real_ip_from 198.51.100.0/24; # 使用从右向左的解析方式 real_ip_recursive on; real_ip_header X-Forwarded-For; # IP黑名单存储路径 geo $blocked_ip { default 0; include /etc/nginx/conf.d/ip_blacklist.conf; } server { location / { if ($blocked_ip) { return 403; # 或使用更激进的措施 # return 444; } # 正常业务配置... } } }

3.3 黑名单管理方案

动态更新黑名单的脚本示例:

#!/bin/bash # 添加IP到黑名单 echo "1.2.3.4 1;" >> /etc/nginx/conf.d/ip_blacklist.conf nginx -t && nginx -s reload

推荐使用自动化工具管理:

# 使用fail2ban自动封禁 fail2ban-regex /var/log/nginx/access.log '^<HOST>.*" 403 '

4. 高级防护策略

4.1 多维度防御配置

map $http_user_agent $bad_bot { default 0; "~*(AhrefsBot|SemrushBot|MJ12bot)" 1; } map $http_referer $bad_referer { default 0; "~*(spam-site.com|fake-traffic.org)" 1; } server { if ($bad_bot) { return 403; } if ($bad_referer) { return 403; } }

4.2 速率限制配置

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; location /api/ { limit_req zone=api_limit burst=20 nodelay; # 业务逻辑... }

5. 实战问题排查指南

5.1 常见错误案例

案例1:错误配置导致403

# 错误示范:未设置可信IP段 real_ip_header X-Forwarded-For;

案例2:IP获取不准确

# 需要添加递归解析 real_ip_recursive on;

5.2 调试技巧

查看真实IP获取情况:

location /ipinfo { add_header Content-Type text/plain; return 200 "Remote: $remote_addr\nRealIP: $realip_remote_addr\nXFF: $http_x_forwarded_for"; }

日志格式建议:

log_format main '$remote_addr - $realip_remote_addr [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

6. 性能优化建议

  1. 使用geoip2模块进行高效IP匹配:
load_module modules/ngx_http_geoip2_module.so; http { geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb { $geoip2_data_country_code country iso_code; } map $geoip2_data_country_code $allowed_country { default no; CN yes; US yes; } }
  1. 黑名单IP使用内存存储:
geo $blocked_ip { ranges; default 0; 192.168.1.0-192.168.1.255 1; }
  1. 定期清理无效规则:
# 清理超过30天的封禁IP find /etc/nginx/conf.d/ -name "ip_blacklist.conf" -mtime +30 -exec sed -i '/old_ip/d' {} \;

7. 企业级扩展方案

7.1 动态黑名单API

location /api/blacklist { auth_request /auth; allow 10.0.0.0/8; deny all; content_by_lua_block { local redis = require "resty.redis" local red = redis:new() red:set_timeout(1000) -- 1 sec local ok, err = red:connect("127.0.0.1", 6379) if not ok then ngx.say("failed to connect: ", err) return end local res, err = red:smembers("ip:blacklist") if not res then ngx.say("failed to get blacklist: ", err) return end ngx.say(table.concat(res, "\n")) } }

7.2 结合WAF联动

location / { access_by_lua_file /etc/nginx/lua/waf.lua; # 正常业务配置... }

waf.lua示例片段:

local function is_ip_banned(ip) -- 调用安全API检查 local http = require "resty.http" local httpc = http.new() local res, err = httpc:request_uri( "http://security-api/check", {method = "GET", query = {ip = ip}} ) if res and res.status == 200 then return res.body == "true" end return false end

8. 安全加固建议

  1. 防止IP欺骗:
# 限制XFF头部长度 map $http_x_forwarded_for $xff_valid { default $http_x_forwarded_for; "~*^([^,]{1,15})(,[^,]{1,15}){0,4}$" $1; "" $remote_addr; }
  1. 关键操作二次验证:
location /admin { satisfy any; allow 192.168.1.100; deny all; auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.htpasswd; }
  1. 定期审计配置:
# 检查异常封禁 awk '$9 == 403 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 11:22:32

Cocos2D-X横版闯关游戏开发实战:从架构设计到多平台部署

1. 项目概述与核心价值 最近在整理硬盘&#xff0c;翻出来一个几年前用Cocos2D-X做的横版闯关游戏项目&#xff0c;当时为了毕业设计&#xff0c;从零开始折腾了差不多三个月。这个项目包含了完整的源码、一份当时写的近万字的详细设计报告&#xff0c;以及一套清晰的部署流程。…

作者头像 李华
网站建设 2026/8/11 11:21:12

Uniapp+Thinkphp-Laravel打造微信小程序店铺全栈方案

1. 项目背景与核心需求解析在移动互联网时代&#xff0c;个体商业店铺面临着数字化转型的迫切需求。一个能够同时覆盖商品展示、在线交易和后台管理的微信小程序&#xff0c;已经成为小店经营者的标配工具。这个基于uniapp框架&#xff0c;配合Thinkphp-Laravel后端开发的解决方…

作者头像 李华
网站建设 2026/8/11 11:19:44

深度解析dnSpyEx:企业级.NET逆向工程与实时调试架构实现

深度解析dnSpyEx&#xff1a;企业级.NET逆向工程与实时调试架构实现 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy dnSpyEx作为.NET逆向工程领域的专业工…

作者头像 李华
网站建设 2026/8/11 11:19:14

QQ空间备份:终极完整指南,永久保存你的数字记忆

QQ空间备份&#xff1a;终极完整指南&#xff0c;永久保存你的数字记忆 【免费下载链接】QZoneExport QQ空间导出助手&#xff0c;用于备份QQ空间的说说、日志、私密日记、相册、视频、留言板、QQ好友、收藏夹、分享、最近访客为文件&#xff0c;便于迁移与保存 项目地址: ht…

作者头像 李华
网站建设 2026/8/11 11:18:24

告别网盘限速烦恼:2025年最实用的网盘直链下载工具推荐

告别网盘限速烦恼&#xff1a;2025年最实用的网盘直链下载工具推荐 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

作者头像 李华