ELB报IPv4私网地址检查异常,通常不是ELB本身出问题,而是后端实例的源/目标检查没关、目标组注册的IP不对,或者安全组与网络ACL拦截了健康检查探针。解决方向就一条:沿健康检查的完整链路,从实例属性、目标注册信息、网络放行策略三处逐一排查,正常几分钟内就能定位。
为什么ELB会提示IPv4私网地址检查异常
源/目标检查机制:回程路上的第一道门
AWS EC2实例默认开启源/目标检查(Source/Destination Check),意思是这个网卡只接收目标IP指向自己的流量,ELB转发流量时会把报文的目的地址改写成后端实例的私网IP,实例能正常收到探针请求,但应答报文回传时,如果实例上配置了转发规则或NAT策略,流量源地址就不再是实例本身,源/目标检查就会直接丢弃这批报文。
我在处理负载均衡器后端ECS实例不通的情况时,十次里有七八次都卡在这个属性上,尤其是实例上跑着Docker、自建K8s节点,或者用iptables做了端口转发,源/目标检查必须手工关闭,关闭路径是:EC2控制台选中实例,右键“网络”>“更改源/目标检查”,选择“停用”即可,CLI命令为:
aws ec2 modify-instance-attribute --instance-id i-xxxxxxxx --source-dest-check "{"Value": false}"
健康检查探针与私网地址不可达的常见情况
健康检查请求从ELB所在子网发出,到达目标实例的私网IP,这条路径上任意一环丢弃流量,目标组就会标记实例异常,常见情况有:
- 目标实例的安全组入站规则没放行健康检查端口,默认ALB的健康检查会走实例注册的端口,Nginx占用80端口时,安全组只放行了443,探针请求全被丢弃
- 子网网络ACL出站或入站规则缺少临时端口段1024-65535的放行,TCP握手包能进但回包出不去
- 跨VPC场景下VPC对等连接路由缺失,ELB所在子网的路由表没有指向对端VPC网段的对等连接条目
- 实例本身网络栈异常,系统防火墙如firewalld或ufw拦截了来自ELB网段的流量
AWS ELB健康检查失败怎么处理?从私网地址链路逐段排查
第一步:确认目标实例属性与注册信息
进入EC2控制台,查看实例的网络属性,确认“源/目标检查”处于停用状态,接着打开目标组页面,切到“Targets”标签,看看注册的实例ID和端口与实际业务监听端口是否一致,手动注册目标时,填写的IP必须与该实例在主网卡上的私网IP完全匹配,多网卡实例需要特别注意只填主网卡的IPv4地址。
第二步:验证安全组与网络ACL策略
EB实例安全组需要放行来自ELB所在子网网段的入站流量,端口对应健康检查端口,网络ACL则要同时关注入站和出站规则,健康检查探针是TCP连接,应答流量属于已建立连接的回包,需要放行临时端口段,我习惯用的排查命令是在后端实例上执行:
tcpdump -n port 80
如果能看到ELB网段的SYN包反复到达但没有后续数据包,基本就是安全组或ACL的问题。
第三步:检查OS内部防火墙与路由
安全组和ACL都放行后实例仍异常,多半是系统内部防火墙拦截,查看iptables规则或firewalld的当前配置,确认没有针对健康检查源网段的DROP规则,同时检查实例的route表,默认路由是否指向正确的网卡,策略路由如果优先级设置错误,回包可能走了别的网卡导致ELB收不到。
ALB目标组注册IP与ECS实际私网地址不一致怎么办
ECS服务注册到目标组时的IP机制
使用awsvpc网络模式的ECS任务,每个任务有独立的ENI和私网IP,服务自动注册到目标组时用的是任务ENI的IP,而不是宿主机IP,但有些场景下容器实例注册方式会退化成bridge模式,目标组里显示的IP是ECS宿主机地址,一旦宿主机上有多个任务实例,回包路径就乱了。
处理方式是在服务发现或目标组注册时,确认使用了任务本身的ENI IP,改用Fargate启动类型能规避这个问题,因为Fargate天然为每个任务分配独立ENI。
手动注册目标时指向了其他ENI或无效地址
不少团队在混合部署架构里会手动把自建ECS的IP填进目标组,多人共用一个账号管理时,经常填了实例辅助网卡的IP,或者填了已经释放的闲置IP,无论哪种情况,健康检查探针都会投递到无人监听的地址上,目标直接进入unhealthy状态,标准做法是登录EC2控制台,查询实例的主私网IP,以它作为注册地址,并在控制台目标组页面确认端口号跟业务进程实际监听一致。
经典负载均衡CLB与ALB在源目标检查处理上的差异
| 维度 | 经典负载均衡CLB | 应用负载均衡ALB |
|---|---|---|
| 健康检查探针源地址 | CLB所在子网网段 | ALB所在子网网段 |
| 目标注册方式 | 自动关联EC2实例 | 目标组内注册实例或IP |
| 对源/目标检查的依赖 | 高度依赖,必须关闭 | 多数场景下也依赖,尤其目标为EC2时 |
| 支持直接注册IP | 不支持,只能选EC2实例 | 支持按IP注册,跨VPC场景更灵活 |
| 四层透传时源地址 | 保留客户端IP | 非透传模式下为ALB内部地址 |
两种负载均衡器都要求后端实例放行探针流量,ALB因为支持注册IP,操作粒度更细,但排查链路也变长了。
跨VPC场景下ELB私网地址异常怎么定位
VPC对等连接后回程路由不通
两个VPC建立对等连接后,ELB所在VPC的路由表要添加指向对端VPC网段的对等连接条目,对端VPC的路由表也要有对应的回程条目,只加一边路由是常见失误,健康检查探针过去了,实例的回包却找不到路,表现为目标组一直处于初始状态或异常状态。
PrivateLink终端节点与目标IP转换
通过PrivateLink访问ELB时,消费者VPC里看到的私网IP是终端节点ENI的IP,而不是ELB本身的私网地址,如果业务方依据ELB的私网IP配置白名单或访问控制,就会导致流量到不了终端节点,正确的做法是让消费者访问终端节点的DNS,或直接用终端节点服务提供的域名,而不是透传ELB的IP。
Q&A:ELB私网地址检查异常处理常见问题
Q:ELB健康检查失败怎么解决?
A:先看目标组里实例状态是否显示unhealthy,再依次检查实例的源/目标检查、目标组注册IP、安全组入站规则和网络ACL临时端口段,执行tcpdump抓包确认探针的SYN包到达情况,可以快速定位丢包位置。
Q:源/目标检查关闭后,实例的对外访问会被影响吗?
A:关闭后,实例可以接收目标IP不是自身的流量,也能发送源IP不是自身的流量,对普通Web服务器实例没有副作用,但开启该属性的实例有类似NAT网关或转发节点的功能时,关闭反而是必要的。
Q:ALB健康检查显示超时,但后端应用从本机能正常访问是什么原因?
A:本机访问走的是loopback接口,不经过安全组和网络ACL,从ELB发送的探针流量需要经过子网边界,先确认目标组的端口与业务进程监听的端口一致,再看安全组是否放行了来自ELB所在子网网段的入站流量。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/579293.html




