背景与问题

在 AWS Gateway Load Balancer (GWLB) 架构中,流量通常透明转发给防火墙、IDS 等安全设备。当后端目标(如防火墙)健康检查失败变为不健康时,GWLB 默认采用 fail-open 策略,继续向不健康目标转发已有连接。由于客户端和服务端无法感知设备失效,只能依赖 TCP 重传与指数退避,中断时间可达 30 秒至数分钟,对金融交易、实时通信等场景不可接受。

TCP Reset 新特性

AWS 宣布 GWLB 支持 TCP Reset 功能。启用后,当目标不健康、注销或空闲超时时,GWLB 会针对已有流量中的入向数据包回复 TCP RST 报文,主动终止连接。应用收到 RST 通常会立即重试,从而在新连接中被调度到健康目标,将中断从分钟级缩短到秒级。该特性在支持 GWLB 的 Region 免费提供。

触发条件与配置项

  • 目标变不健康:连续健康检查失败后被标记,属性 send_tcp_reset.on_unhealthy.enabled(目标组属性)。
  • 目标注销:连接排空时间过后,属性 send_tcp_reset.on_deregistration.enabled(目标组属性)。
  • TCP 流空闲超时:收到非 SYN 包且空闲超时到期,属性 send_tcp_reset.on_idle_timeout.enabled(监听器属性)。

默认均为 false(保持 fail-open)。设置为 true 后,GWLB 发送 RST 并删除流表项,后续包按新流负载均衡至健康目标。需注意 GWLB 仅响应入向流量发送 RST,不会主动生成。

配置方式

通过 AWS CLI 修改目标组属性:

aws elbv2 modify-target-group-attributes \
--target-group-arn <Target_group_arn> \
--attributes \
Key=send_tcp_reset.on_unhealthy.enabled,Value=true \
Key=send_tcp_reset.on_deregistration.enabled,Value=true

控制台路径:EC2 控制台 → Load Balancing → Target Groups → 选择 GWLB 目标组(GENEVE 6081)→ Attributes → Edit → 选择 “No rebalance and send TCP reset” 并开启对应选项。

工作模型简述

GWLB 以 bump-in-the-wire 方式部署,客户端流量经 GWLBE 端点进入 Inspection VPC,由 GWLB 转发至安全目标(T1)。若 T1 故障,原行为下包被丢弃,发送端持续重传;启用 TCP Reset 后,GWLB 在反向流中向发送方回送 RST,触发客户端或服务器立即重建连接至健康目标 T2,恢复出网。

对读者的意义 / 技术解读

对于运维与 SRE 而言,该特性将云上透明安全引流架构的故障收敛时间从依赖传输层超时缩短为可控的 active reset,显著改善 SLA。在混合云或 IDC 使用类似旁路防护架构时,也可借鉴此思路:在负载均衡或引流设备层面引入主动 RST 机制,避免后端安全设备亚健康导致的长尾丢包与连接悬挂。同时,监控时应关注目标组健康状态与 RST 计数,将其纳入告警体系,以便快速发现链路异常。

更多细节参考 AWS 官方博客