解决方法
要跟踪数据包并确定它们的丢弃位置,您可以使用 Amazon Virtual Private Cloud (Amazon VPC) 流日志或数据包捕获。
以下是从本地服务器流向面向互联网的网络负载均衡器的简单流量示例:
客户端(本地)---->防火墙(本地)---通过互联网--->NLB--->目标
如果收到错误消息,请检查网络路径以及客户端和目标之间的中间设备。
对客户端连接进行故障排除
确定错误是 DNS 解析失败、连接遭拒绝还是连接超时。
请确保客户端可以将 DNS 解析为网络负载均衡器的正确 IP 地址。使用相应的工具,例如 Linux 中的 dig (dig www.example.com) 或微软 Windows 中的 nslookup (nslookup.www.example.com)。
使用 dig 或 nslookup 解析您的 AWS 管理控制台上可用的网络负载均衡器的完全限定域名 (FQDN)。网络负载均衡器的 FQDN 具有以下语法:
name-id.elb.region.amazonaws.com. For example: dig my-load-balancer-1234567890abcdef.elb.us-east-2.amazonaws.com
请确保自定义域 DNS 和负载均衡器的 FQDN 的 dig 或 nslookup 输出的 IP 地址相同。
检查客户端数据包是否将发送到您的网络负载均衡器。使用数据包捕获工具,例如 tcpdump、wireshark 或客户端的 VPC 流日志,检查离开和进入客户端网络接口的数据包。如果 SYN 数据包没有发送到您的网络负载均衡器,请检查客户端应用程序,看看是什么阻止了流量。请确保客户端的操作系统 (OS) 和防火墙允许网络负载均衡器的入站和出站流量。
对于流向网络负载均衡器 IP 地址的流量,您可能会在 VPC 流日志中看到 REJECT。检查负载均衡的安全组和网络访问控制列表(网络 ACL)的出站规则,以确定它们是否允许流量。对于来自网络负载均衡器 IP 地址的流量,您可能也会在 VPC 流日志中看到 REJECT。检查客户端的安全组和网络 ACL 的入站规则,以确定它们是否允许流量。
您可能会看到从负载均衡器到客户端的响应流量 (SYN_ACK),但没有从客户端向负载均衡器返回 ACK。检查客户端的防火墙是否阻止了来自负载均衡器的流量。
网络负载均衡器连接失败问题故障排除
查看网络负载均衡器的 VPC 流日志,以确定客户端的流量是否到达负载均衡器。如果 VPC 流日志显示负载均衡器拒绝了来自客户端的流量,则检查负载均衡器的安全组和子网的网络 ACL 入站规则。请确保规则允许来自客户端 IP 地址的入站流量进入负载均衡器的侦听器端口。
如果网络负载均衡器接受了来自客户端的流量,则检查负载均衡器是否将流量转发到目标 IP 地址。对于发送到网络负载均衡器目标的数据包,源 IP 地址必须是负载均衡器的私有 IP 地址。而目的地 IP 地址必须是目标的 IP 地址。
要解决 REJECT 错误,请检查安全组和子网的网络 ACL 出站规则。请确保规则允许通过目标端口流向目标 IP 地址的出站流量。
检查网络负载均衡器的 VPC 流日志,以确定负载均衡器是否接收来自目标 IP 地址的响应流量。如果没有流量,则检查目标的 VPC 流日志或数据包捕获,以确定目标是否收到并响应了负载均衡器的流量。
如果负载均衡器收到目标响应流量,但拒绝了发往客户端的数据包,则检查网络 ACL 的出站规则。验证规则是否允许通过临时端口 (1024-65535) 到客户端 IP 地址的流量。
如果网络负载均衡器将响应流量转发给客户端,但客户端没有接收到流量,则检查中间设备,例如防火墙。使用基于 TCP 的 traceroute 来查找网络路径中的网络设备。从客户端设备运行以下示例命令:
mtr -P -T -r
traceroute -T -p
对目标相关的错误进行故障排除
查看网络负载均衡器的 VPC 流日志,确定接收负载均衡器流量的目标,并验证流量是否到达目标。如果目标组激活了客户端 IP 地址保留,则客户端的 IP 地址将出现在源 IP 字段中。如果取消客户端 IP 地址保留选项,则看到的是负载均衡器的私有 IP 地址。
如果目标的 VPC 流日志中显示,目标拒绝了来自负载均衡器的传入流量,则检查目标的安全组和网络 ACL。确保目标组中的目标端口向负载均衡器的私有 IP 地址或客户端 IP 地址开放。如果日志显示目标拒绝了出站流量,则检查目标安全组和网络 ACL 的出站规则。确保临时端口 (1024-65535) 对负载均衡器的私有 IP 地址或客户端 IP 地址开放。
如果 SYN 数据包进入但没有返回相应的 SYN_ACK,则检查操作系统级别的防火墙或代理(例如 iptables)是否阻止了流量。
验证目标是否在注册到网络负载平衡目标组的端口上运行应用程序。运行 telnet、CURL 或 netcat 等命令。例如,如果目标注册在端口 80 上,则登录到目标的终端并运行以下命令:
telnet localhost 80
curl -v http://localhost:80
nc -vz localhost 80
**注意:**对于微软 Windows,请在目标上打开浏览器并输入 http://localhost:80。
相关信息
使用安全组来控制流向 AWS 资源的流量
使用网络 ACL 来控制流向子网的流量
客户端 IP 保留
使用 VPC 流日志对 IP 流量进行日志记录