

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# VPC 网络故障排除
<a name="vpc-troubleshooting-guide"></a>

**Topics**
+ [网络监控和故障排除](#vpc-network-monitoring-troubleshooting)
+ [配置疑难解答](#vpc-configuration-troubleshooting)

## 网络监控和故障排除
<a name="vpc-network-monitoring-troubleshooting"></a>

### CloudTrail 记录
<a name="vpc-cloudtrail"></a>

使用 VPC 网络运行的所有配置 API 操作和工作流程都已登录 CloudTrail。 CloudTrail 用于审计配置更改并跟踪哪些运行使用 VPC 联网。

### 使用 ENI 流日志进行故障排除
<a name="vpc-flow-logs-troubleshooting"></a>

当您的工作流程运行通过 Internet 访问外部资源时，您可以使用 VPC 流日志来验证连接和诊断问题。 HealthOmics 在您的 VPC 子网中配置弹性网络接口 (ENIs)，以路由来自工作流程任务的流量。通过检查这些流日志 ENIs，您可以跟踪往返外部目的地的网络流量。

**VPC 流日志的成本管理**  
VPC 流日志可能会产生高昂的成本，尤其在 VPC 级别。为了最大限度地降低成本：  
**故障排除后删除流日志。**解决连接问题后，请删除流日志以停止产生费用。
**使用 Amazon S3 代替 CloudWatch 日志进行长期存储。**Amazon S3 存储空间比 CloudWatch 日志便宜得多。如果您需要保留日志以进行合规性或安全分析，请配置要发布到 Amazon S3 的流日志。
**设置 CloudWatch 日志保留策略。**如果使用 CloudWatch 日志，请配置日志自动过期（例如 7 天），以防止产生无限期的存储成本。
**使用 ENI 级别的流日志进行故障排除。**要进行一次性调试，请在特定的客户 ENI 上而不是整个 VPC 上创建流日志。

#### 设置用于故障排除的流日志
<a name="vpc-flow-logs-setup"></a>

**选项 1：VPC 级别的流日志（用于持续监控）**

在您的 VPC 上启用流日志，以自动捕获所有 HealthOmics 工作流程运行的流量。当您有许多工作流程运行并且希望在不跟踪个人的情况下获得全面的可见性时，这是最好的选择 ENIs。

1. **启用 VPC 流日志。**在亚马逊 VPC 控制台中：

   1. 选择**您的 VPCs，然后选择您的** HealthOmics配置中使用的 VPC

   1. 选择**流日志**选项卡

   1. 选择**创建流日志**

   1. 配置流日志以捕获**所有**流量（接受和已拒绝）

   1. 选择 “ CloudWatch 日志” 作为目标以便于查询

1. **启动工作流程运行。**在启用 VPC 联网的情况下启动工作流程运行。记下运行 ID 和开始时间，以便稍后筛选流日志。

使用 Logs Insights 按时间窗口、目标 IP 或流量模式查询流 CloudWatch 日志。您无需识别特定的 ENI IDs。

**选项 2：ENI 级别的流日志（用于有针对性的故障排除）**

当您的账户 HealthOmics ENIs 中只有几个流日志 ENIs 时，请启用特定流日志。这是最具成本效益的方法，可以轻松隔离特定工作流程运行的流量。

1. **找到客户 ENI。**在 Amazon EC2 控制台中：

   1. 选择**网络接口**

   1. 按标签筛选`Service: HealthOmics`，仅显示 ENIs 创建者 HealthOmics

   1. （可选）按 HealthOmics 配置中的子网 ID 进一步筛选

   1. 记下弹性网卡 ID 和私有 IP 地址

1. **在 ENI 上启用流日志。**

   1. 选择 ENI 并选择**流日志**选项卡

   1. 选择**创建流日志**

   1. 配置流日志以捕获**所有**流量

   1. 选择 CloudWatch 日志作为目标

**注意**  
流日志仅从启用时起捕获流量。对于 VPC 级别的流日志，请在运行工作流程之前将其启用。对于 ENI 级别的流日志，在 ENI 上启用后，相同的流日志将捕获所有使用该 ENI 的 future 工作流运行的流量。

#### 了解 VPC 流日志格式
<a name="vpc-flow-logs-analyzing"></a>

VPC 流日志使用以空格分隔的格式，其中包含以下字段：

```
version account_id interface_id srcaddr dstaddr srcport dstport protocol packets bytes start end action log_status
```

**字段描述**：
+ **版本**-流日志格式版本（通常为 2）
+ **账号\_id** — 你的 AWS 账号
+ **interface\_id — ENI ID**（例如，eni-0e57c5476efeac402）
+ **srcaddr — 源 IP 地址**
+ **dstaddr — 目标 IP 地址**
+ **srcport — 源端口**号
+ **dstport-目标端口**号
+ **协议** — IANA 协议号（6=TCP，17=UDP，1=ICMP）
+ **数据包**-流中的数据包数量
+ **bytes** — 流中的字节数
+ **开始** — 流程开始时间（Unix 时间戳）
+ **结束** — 流程结束时间（Unix 时间戳）
+ **操作**-接受或拒绝
+ **log\_status** — OK、NODATA 或 SKIPDATA

**流日志条目示例：**

```
2 074296239033 eni-0e57c5476efeac402 10.0.130.58 13.226.238.96 40565 443 6 13 1502 1774338927 1774338929 ACCEPT OK
2 074296239033 eni-0e57c5476efeac402 13.226.238.96 10.0.130.58 443 40565 6 8 1024 1774338928 1774338930 ACCEPT OK
```

这些条目显示成功的双向 HTTPS 通信。密钥 IPs：**10.0.130.58** 是您的账户 HealthOmics 中创建的客户 ENI，**13.226.238.96** 是您的工作流程正在访问的外部公共域。第一个条目是出站流量，第二个条目是回程流量。两者都显示 ACCEPT，表示安全组允许流量。

#### 在 “日志见解” 中查询流 CloudWatch 日志
<a name="vpc-flow-logs-querying"></a>

将流日志发布到 CloudWatch 日志时，使用 Lo CloudWatch gs Insights 来查询和分析数据。

**查找被拒绝的流量（从这里开始）**

```
fields @timestamp, interfaceId, srcAddr, dstAddr, srcPort, dstPort, protocol, action
| filter action = "REJECT"
| sort @timestamp desc
```

如果返回结果，则可能存在连接问题。被拒绝的条目显示哪些流量被安全组或网络阻止 ACLs。

**查找指向特定外部 IP 的流量**

首先，使用`nslookup`或将域解析为 IP 地址`dig`：

```
$ nslookup ftp.ncbi.nlm.nih.gov
Server:  127.53.53.53
Address: 127.53.53.53#53

Non-authoritative answer:
ftp.ncbi.nlm.nih.gov    canonical name = ftp.wip.ncbi.nlm.nih.gov.
Name:    ftp.wip.ncbi.nlm.nih.gov
Address: 130.14.250.10
Name:    ftp.wip.ncbi.nlm.nih.gov
Address: 130.14.250.11
```

顶部的 “服务器” 和 “地址” 是你的 DNS 解析器。“非权威答案”（130.14.250.10和130.14.250.11）下的地址是该域名的实际地址。 IPs 

使用前缀查询流日志以匹配该范围内的任何 IP：

```
fields @timestamp, interfaceId, srcAddr, dstAddr, srcPort, dstPort, protocol, action
| filter dstAddr like "130.14.250"
| sort @timestamp desc
```

这匹配以 130.14.250 开头的任何 IP，捕获该子网 IPs 中所有人的流量。

**查找发往外部目的地的 HTTPS 流量**

```
fields @timestamp, interfaceId, srcAddr, dstAddr, srcPort, dstPort, protocol, action
| filter dstPort = 443 and protocol = 6
| filter not (dstAddr like /^10\./ or dstAddr like /^172\./ or dstAddr like /^192\.168\./)
| sort @timestamp desc
```

第二个过滤器不包括私有 IP 范围，仅显示前往外部（公共）目的地的流量。

**注意**  
协议号：6=TCP，17=UDP，1=ICMP。对于负载平衡服务（例如 CloudFront），DNS 可能返回不同的结果 IPs，因此请按目标端口而不是 IP 地址进行筛选。

#### 常见的流日志模式和问题
<a name="vpc-flow-logs-common-issues"></a>

**出站流量被拒绝**  

```
Outbound: 2 074296239033 eni-0e57c5476efeac402 10.0.130.58 13.226.238.96 40565 443 6 1 60 1774338927 1774338929 REJECT OK
```
**原因：**安全组不允许向目标端口或 IP 范围发送出站流量。  
**解决方案：**向您的安全组添加出站规则：  
+ 对于 HTTPS：允许 TCP 端口 443 到 0.0.0.0/0
+ 对于 HTTP：允许 TCP 端口 80 到 0.0.0.0/0
+ 要获得更广泛的访问权限：允许所有访问 TCP/UDP 到 0.0.0.0/0

**返回流量被拒绝**  

```
Outbound: 2 074296239033 eni-0e57c5476efeac402 10.0.130.58 8.8.8.8 54321 53 17 1 64 1774338927 1774338929 ACCEPT OK
Return:   2 074296239033 eni-0e57c5476efeac402 8.8.8.8 10.0.130.58 53 54321 17 1 64 1774338928 1774338930 REJECT OK
```
**原因：**网络 ACL 阻塞了返回流量。与安全组（有状态）不同，网络 ACLs 是无状态的，需要明确的双向规则。  
**解决方案：**在 VPC 控制台中，检查子网的网络 ACL，并验证入站规则允许来自外部源的临时端口 (1024-65535) 上的流量。如果需要，可以添加规则：允许 0.0.0.0/0 中的 TCP/UDP 端口 1024-65535

**缺少回程流量**  

```
Outbound: 2 074296239033 eni-0e57c5476efeac402 10.0.130.58 8.8.8.8 54321 53 17 1 64 1774338927 1774338929 ACCEPT OK
```
**原因：**NAT Gateway/Internet 网关配置不正确，或者 ENI 无法连接到互联网。  
**解决方案：**  
+ 验证路由表是否有通往 NAT 网关的路由（0.0.0.0/0 → nat-xxxxx）
+ 使用弹性 IP 验证 NAT 网关是否处于可用状态
+ 检查 NAT 网关是否位于具有通往 Internet Gateway 的路由的公有子网中

**没有预期流量的流日志条目**  
**原因：**流量未到达 ENI，或者流量日志配置不正确。  
**解决方案：**  
+ 验证流日志是否已启用并配置为捕获所有流量
+ 在 “日 CloudWatch 志” 中查看工作流程日志，确认工作流正在尝试访问外部资源
+ 验证路由表是否有通往 NAT 网关的路由（0.0.0.0/0 → nat-xxxxx）
+ 使用弹性 IP 验证 NAT 网关是否处于可用状态

#### 流日志疑难解答的最佳实践
<a name="vpc-flow-logs-best-practices"></a>

1. **在开始故障排除之前启用流日志。**流日志仅从启用时起捕获流量。在运行工作流程之前，请在 HealthOmics 配置中的所有子网上启用它们。

1. **使用 CloudWatch 日志见解进行分析。** CloudWatch Logs Insights 为流日志提供了强大的查询功能。保存常用查询以便快速访问。

1. **按时间窗口筛选。**将流日志查询范围缩小到工作流程运行处于活动状态的特定时间窗口，以减少噪音并提高查询性能。

1. **寻找两个方向的交通。**务必确认出站流量和回程流量均显示接受。连接需要双向通信。

1. **记录您的发现。**排除连接问题时，请记录客户的 ENI ID、IP 地址、端口和流日志条目。这些信息对于支持案例和 future 故障排除非常有用。

1. **首先使用简单的工作流程进行测试。**在运行复杂的工作流程之前，请使用尝试访问外部资源并记录结果的简单工作流程来测试连通性。这有助于将网络问题与工作流程逻辑问题隔离开来。

## 配置疑难解答
<a name="vpc-configuration-troubleshooting"></a>

### 配置停留在 “创建” 状态
<a name="vpc-ts-creating-status"></a>

**原因：**网络资源配置可能需要几分钟。

**解决方案：**最多等待 10 分钟。如果状态未更改为 “激活”，请检查以下内容：
+ 您的子网和安全组存在且位于同一 VPC 中。
+ 您拥有所需的 IAM 权限。
+ 服务相关角色已成功创建。

### VPC 联网无法开始运行
<a name="vpc-ts-run-fails"></a>

**原因：**配置可能未处于活动状态，或者可能存在网络连接问题。

**解决方案：**
+ 使用验证配置状态是否为 “活动” `GetConfiguration`。
+ 检查安全组规则是否允许所需的出站流量。
+ 确保子网位于 HealthOmics 运行所在的可用区内。

### 无法删除配置
<a name="vpc-ts-delete-config"></a>

**原因：**正在运行的工作流程正在使用该配置。

**解决方案：**等待所有使用配置的运行完成，然后重试删除。

### 无法删除服务相关角色
<a name="vpc-ts-delete-slr"></a>

**原因：**您的账户中存在活动的 VPC 配置。

**解决方案：**先删除所有 VPC 配置，然后删除服务相关角色。

### 工作流程无法连接到外部资源
<a name="vpc-ts-connectivity"></a>

**原因：**安全组或路由表配置错误。

**解决方案：**

1. 启用 VPC 流日志以识别被拒绝的数据包

1. 检查安全组出站规则允许流量到达目的地

1. 验证路由表是否有通往 NAT 网关的路由（0.0.0.0/0 → nat-xxxxxx）

1. 对于跨区域 AWS 服务访问，请确保目标区域可达

1. 测试来自同一子网中的 Amazon EC2 实例的连接

### 网络性能问题
<a name="vpc-ts-performance"></a>

**症状：**数据传输缓慢或工作流程超时。

**原因：**网络吞吐量限制或 NAT 网关饱和。

**解决方案：**
+ 网络吞吐量起始于每个 ENI 10 Gbps，在流量持续的情况下，在 60 分钟内可扩展到 100 Gbps
+ 如需立即满足高吞吐量要求的工作流程，请联系 AWS Support
+ 监控 NAT 网关指标 CloudWatch 以确定饱和度
+ 考虑在多个可用区部署额外的 NAT 网关以提高吞吐量

### 工作流程无法访问互联网
<a name="vpc-ts-no-internet"></a>

**原因：**私有子网可能没有通往 NAT 网关的路由，或者安全组规则可能阻止了出站流量。

**解决方案：**
+ 验证您的私有子网的路由表中是否包含通往 NAT 网关的路由（0.0.0.0/0 → nat-xxxxxxxxxx）。
+ 检查安全组规则是否允许所需端口上的出站流量。
+ 验证 NAT 网关是否位于具有通往互联网网关的路由的公有子网中。

### 工作流程运行因连接错误而失败
<a name="vpc-ts-connectivity-errors"></a>

**原因：**网络流量可能被屏蔽或配置错误。

**解决方案：**

1. 使用验证配置是否仍处于 “活动” 状态`GetConfiguration`。

1.  ENIs 在您的 VPC 中创建 VPC 流日志以检查流量。有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [VPC 流日志](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)。

1. 检查流日志中是否有 REJECT 条目。如果您看到被拒绝的数据包，请更新您的安全组规则以允许所需的出站流量。

1. 如果流日志未显示根本原因，请联系 Su AWS pport。