当前位置: 首页 > news >正文

二次校验请求源 IP 是否在 WAF 官方 IP 段内” + “校验是否携带 WAF 专属 HTTP 头

在云主机通过安全组限制仅允许WAF官方IP访问的基础上,再在反向代理(如Nginx)或应用代码中添加二次校验,不仅有意义,而且是**“纵深防御”的关键一环**——二者并非互斥关系,而是“第一道闸门”与“第二道闸门”的互补,能解决安全组无法覆盖的潜在风险,进一步杜绝“绕过WAF直接访问云主机”的可能。

要理解这一点,首先需要明确:安全组是“网络层”的访问控制,而二次校验是“应用/代理层”的精准拦截,二者的防护维度和解决的问题不同。下面从“安全组的局限性”和“二次校验的不可替代性”两方面具体说明:

一、先明确:安全组限制WAF IP的核心作用(第一道防线)

安全组是腾讯云VPC网络层的访问控制列表,通过“白名单”机制只允许WAF官方IP段访问云主机的业务端口(如80/443),能直接阻断绝大多数“绕过WAF的尝试”(比如攻击者用自己的IP直接访问云主机公网IP:端口)。

但安全组并非“绝对无懈可击”,它存在以下无法覆盖的潜在风险

风险1:安全组配置失误或权限泄露
  • 场景1:运维人员误操作(比如为了临时排查问题,添加了“允许所有IP访问80端口”的规则,排查后忘记删除);
  • 场景2:账号权限管控不严,低权限人员被篡改安全组规则(比如删除WAF白名单、添加恶意IP白名单);
  • 场景3:安全组规则优先级配置错误(比如“允许所有IP”的规则优先级高于“仅允许WAF IP”,导致白名单失效)。

一旦出现上述情况,安全组的“第一道防线”就会出现漏洞,此时若没有二次校验,攻击者就能直接访问云主机。

风险2:WAF自身的“流量透传”场景(非攻击,但需校验)

部分场景下,WAF会将请求“透传”给云主机,但请求的源IP可能不是WAF的前端IP,而是WAF的后端转发IP(比如WAF开启“真实IP透传”功能时,为了让应用能获取用户真实IP,会用WAF的后端IP作为请求源IP,同时在X-Forwarded-For头中携带用户IP)。

此时安全组虽然允许了WAF的后端IP,但需要进一步校验“该请求是否真的来自WAF”(而非攻击者伪造WAF后端IP的请求)——这就需要二次校验。

风险3:“内网穿透”或“同VPC内其他主机跳转”的绕过

如果云主机所在的VPC内还有其他服务(比如测试机、数据库主机),若这些服务被入侵,攻击者可能通过“内网穿透”或“同VPC内跳转”的方式,从内网直接访问云主机的业务端口(安全组默认允许同VPC内的IP访问,除非手动限制)。

此时安全组无法拦截(因为源IP是VPC内网IP,不在WAF白名单但可能在安全组的“内网白名单”中),而二次校验可以通过“校验请求是否携带WAF专属标识”(如特定HTTP头)来拦截这类内网绕过请求。

二、二次校验的核心意义:补上安全组的“漏洞盲区”

二次校验的本质是:在“应用/代理层”再次确认“请求是否真的经过WAF转发”,而非直接来自其他来源。它解决的是“安全组无法判断请求来源合法性”的问题,具体价值体现在3点:

1. 防止“安全组失效后的兜底拦截”

即使安全组因配置失误、权限泄露等原因被绕过,二次校验能作为“最后一道防线”——只要请求不是来自WAF(比如攻击者直接访问、伪造IP访问),就会被反向代理或应用直接拦截,避免业务暴露。

例如:若安全组误添加了“允许0.0.0.0/0访问80端口”,但Nginx中配置了“仅允许请求的源IP是WAF官方IP”,攻击者的直接请求仍会被Nginx拦截。

2. 精准校验“WAF转发的真实性”(而非仅校验IP)

WAF除了有固定的官方IP段,还会在转发请求时携带专属的HTTP头(如腾讯云WAF会添加X-WAF-InfoX-Forwarded-By-WAF等自定义头,具体可在WAF控制台查看)。

二次校验时,除了校验源IP是否为WAF IP,还可以校验“是否存在WAF专属头”“头的内容是否合法”(比如WAF头是否有签名,防止攻击者伪造)——这种“IP+专属标识”的双重校验,比单纯的IP校验更安全。

3. 拦截“内网绕过”或“非标准转发”请求

对于VPC内网内的恶意请求(如从测试机跳转访问云主机),这类请求的源IP是内网IP(不在WAF白名单),且不会携带WAF的专属HTTP头,二次校验能直接拦截,而安全组可能因“允许内网IP访问”而放行。

三、具体如何实现二次校验?(以Nginx为例)

结合腾讯云WAF的特性,二次校验的核心逻辑是:“校验请求源IP是否在WAF官方IP段内” + “校验是否携带WAF专属HTTP头”,步骤如下:

1. 获取腾讯云WAF官方IP段

首先从腾讯云官网获取最新的WAF回源IP段(避免IP段更新导致校验失效):

  • 官方文档地址:腾讯云WAF 回源IP段
  • 下载IP段文件(通常是JSON或txt格式),提取出IPv4和IPv6段(如119.29.29.0/24183.60.83.0/24等)。

2. 在Nginx中配置二次校验规则

在云主机的Nginx配置文件(如/etc/nginx/nginx.conf或站点配置文件)中,添加以下规则,实现“IP+HTTP头”双重校验:

server {listen 80;server_name your-domain.com; # 你的业务域名# 第一步:校验请求源IP是否在WAF官方IP段内# 将WAF_IP_LIST替换为实际的WAF IP段(多个IP段用空格分隔)set $is_waf_ip 0;if ($remote_addr ~* ^(119.29.29.0/24|183.60.83.0/24|其他WAF IP段)$) { # 注意:Nginx原生不支持CIDR,需用工具转换为IP范围正则,或使用nginx-http-geo模块set $is_waf_ip 1;}# 第二步:校验是否携带腾讯云WAF专属HTTP头(如X-WAF-Info,具体以官网为准)set $has_waf_header 0;if ($http_x_waf_info ~* "tencent") { # 假设X-WAF-Info头包含"tencent"标识set $has_waf_header 1;}# 第三步:若两个条件不同时满足,直接返回403拦截if ($is_waf_ip != 1 || $has_waf_header != 1) {return 403 "Forbidden: Access only via WAF";}# 后续是正常的业务配置(如反向代理到SpringBoot应用)location / {proxy_pass http://127.0.0.1:8080; # SpringBoot应用端口proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

说明:Nginx原生不支持直接解析CIDR格式(如119.29.29.0/24),需通过以下方式优化:

  • 方案1:使用nginx-http-geo模块(推荐),在http块中配置WAF IP段的geo映射;
  • 方案2:将CIDR转换为IP范围正则(如119.29.29.0-119.29.29.255转换为正则119\.29\.29\.\d{1,3})。
3. 应用层二次校验(可选,进一步加固)

若想更彻底,可在SpringBoot应用代码中添加拦截器,再次校验X-Forwarded-For(用户真实IP)、X-WAF-Info(WAF头)和请求源IP:

@Component
public class WafCheckInterceptor implements HandlerInterceptor {// 腾讯云WAF官方IP段(可从配置文件读取,定期更新)private List<String> wafIpRanges = Arrays.asList("119.29.29.0/24", "183.60.83.0/24");@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1. 校验请求源IP是否在WAF IP段内String remoteIp = request.getRemoteAddr();boolean isWafIp = wafIpRanges.stream().anyMatch(range -> isIpInRange(remoteIp, range));if (!isWafIp) {response.sendError(403, "Forbidden: Invalid source IP");return false;}// 2. 校验是否携带WAF专属头String wafHeader = request.getHeader("X-WAF-Info");if (wafHeader == null || !wafHeader.contains("tencent")) {response.sendError(403, "Forbidden: Missing WAF header");return false;}// 3. 校验X-Forwarded-For(可选,确保来自WAF的透传IP格式合法)String xff = request.getHeader("X-Forwarded-For");if (xff == null || xff.split(",").length == 0) {response.sendError(403, "Forbidden: Invalid X-Forwarded-For");return false;}return true;}// 工具方法:判断IP是否在CIDR段内(需引入commons-net等工具包)private boolean isIpInRange(String ip, String cidr) {// 实现逻辑:解析CIDR的网段和子网掩码,判断IP是否在范围内// 示例代码可参考:Apache Commons Net的SubnetUtils类SubnetUtils utils = new SubnetUtils(cidr);return utils.getInfo().isInRange(ip);}
}

依赖说明:需在pom.xml中添加commons-net依赖,用于解析CIDR:

<dependency><groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.10.0</version>

四、总结:安全组+二次校验,缺一不可

防护层级

核心作用

局限性

二次校验的补充价值

安全组(网络层)

第一道防线,拦截非WAF IP的直接访问

易因配置失误、权限泄露、内网访问失效

即使安全组失效,仍能兜底拦截

二次校验(应用层)

第二道防线,校验请求真实性

需手动配置,依赖WAF标识更新

精准识别WAF转发请求,拦截伪造/内网请求

最终结论:安全组是“基础防御”,二次校验是“兜底防御”,二者结合才能实现“纵深安全”,彻底杜绝“绕过WAF直接访问云主机”的风险。

http://www.dtcms.com/a/353040.html

相关文章:

  • 基于Spark的白酒行业数据分析与可视化系统的设计与实现
  • [后端快速搭建]基于 Django+DeepSeek API 快速搭建智能问答后端
  • 域名、ip、DSN、URL
  • springbootr如何调用dolphinshceduler
  • 【记录】R|Windows 下的 R studio 安装调研准备工作、安装过程以及 ggplot2 包的引入测试
  • GIP电路
  • leetcode 974 和可被K整除的子数组
  • 【LeetCode 热题 100】287. 寻找重复数——双指针
  • 初始Linux——指令与权限
  • 【大前端】封装一个React Native与Android/IOS 端通用的埋点接口
  • 数据结构(C语言篇):(三)顺序表算法题解析
  • FPGA学习笔记——Verilog中可综合和常见的不可综合的系统函数
  • 数据结构:从堆中删除元素 (Deleting from a Heap)
  • 使用Spring Boot和EasyExcel导出Excel文件,并在前端使用Axios进行请求
  • linux-优化命令
  • Linux笔记11——shell编程基础-5
  • 使用appium对安卓(使用夜神模拟器)运行自动化测试
  • 解释器模式及优化
  • HIVE的Window functions窗口函数【二】
  • flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践
  • 性能测试-jmeter实战6
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法+单词第7回3
  • 学习嵌入式的第二十八天——线程
  • 趣味学Rust基础篇(变量与可变性)
  • RCLAMP0504M.TBT电子元器件Semtech 低电容、四通道TVS二极管阵
  • Web漏洞
  • More Effective C++条款12:理解抛出一个异常与传递一个参数或调用一个虚函数间的差异
  • 火焰传感器讲解
  • 函数指针的简化
  • 毕业项目推荐:27-基于yolov8/yolov5/yolo11的电塔缺陷检测识别系统(Python+卷积神经网络)