使用 VPC 流日志记录 IP 流量
利用 VPC 流日志这项功能,您可以捕获有关传入和传出您的 VPC 中网络接口的 IP 流量的信息。流日志数据可发布到以下位置:Amazon CloudWatch Logs、Amazon S3 或 Amazon Data Firehose。创建流日志后,您可以在配置的日志组、存储桶或传输流中检索和查看流日志记录。
流日志可帮助您处理多种任务,例如:
-
诊断过于严格的安全组规则
-
监控达到您实例的流量
-
确定在网络接口上往返的流量的方向
流日志数据的收集在您网络流量路径之外,因此不会影响网络吞吐量或延迟。您可以创建或删除流日志,而不会对网络性能造成任何影响。
注意
本节仅讨论 VPC 的流日志。有关版本 6 中引入的中转网关流日志的信息,请参阅《Amazon VPC 中转网关用户指南》中的使用中转网关流日志记录网络流量。
内容
流日志基础知识
您可以为 VPC、子网或网络接口创建流日志。如果您为子网或 VPC 创建流日志,则会监视该子网或 VPC 中的每个网络接口。
受监控网络接口的流日志数据记录为流日志记录,这些是日志事件,由描述该流量的字段组成。有关更多信息,请参阅 流日志记录。
要创建流日志,请指定:
-
要为其创建流日志的资源
-
要捕获的流量的类型(接受的流量、拒绝的流量或所有流量)
-
指定您要将流日志数据发布到的目标
在以下示例中,您创建一个流日志,用于捕获私有子网中某个 EC2 实例的网络接口的已接受流量,并将流日志记录发布到 Amazon S3 存储桶。
![实例的流日志](images/flow-logs-diagram-s3.png)
在以下示例中,流日志会捕获子网的所有流量,并将流日志记录发布到 Amazon CloudWatch Logs。流日志将捕获子网中所有网络接口的流量。
![子网的流日志](images/flow-logs-diagram-cw.png)
创建流日志后,需要几分钟来开始收集数据并将数据发布到选定目标。流日志不会为您的网络接口捕获实时日志流。有关更多信息,请参阅 创建流日志。
如果在为子网或 VPC 创建流日志后,您在子网中启动了实例,则只要网络接口中有网络流量,我们就会为新网络接口创建一个日志流(对于 CloudWatch Logs)或日志文件对象(对于 Amazon S3)。
您可以为其他 Amazon 创建的网络接口创建流日志,例如:
-
Elastic Load Balancing
-
Amazon RDS
-
Amazon ElastiCache
-
Amazon Redshift
-
Amazon WorkSpaces
-
NAT 网关
-
中转网关
不论网络接口是什么类型,您必须使用 Amazon EC2 控制台或 Amazon EC2 API 为网络接口创建流日志。
您可以将标签应用于流日志。每个标签都包含您定义的一个键和一个可选值。标签可以帮助您整理流日志,例如按目的或拥有者。
如果您不再需要某个流日志,可将其删除。删除流日志会禁用资源的流日志服务,因此将不再创建或发布新的流日志记录。删除流日志不会删除任何现有的流日志数据。删除流日志后,您可以将其从目的地中直接删除。有关更多信息,请参阅 删除流日志。
流日志记录
流日志记录代表您的 VPC 中的网络流。默认情况下,每条记录捕获在聚合时间间隔(又称为捕获窗口)内发生的网络 Internet 协议 (IP) 流量流(按每个网络接口 5 元组来定性)。
每条记录都是一个字符串,字段用空格分隔。记录包括 IP 流的不同组件的值,包括源、目标和协议。
当您创建流日志时,您可以为流日志记录使用默认格式,也可以指定自定义格式。
聚合时间间隔
聚合时间间隔表示捕获特定流并聚合到流日志记录中的时间段。默认情况下,最大聚合时间间隔为 10 分钟。创建流日志时,您可以选择指定最大 1 分钟的聚合时间间隔。最大聚合时间间隔为 1 分钟的流日志的大小,比最大聚合时间间隔为 10 分钟的流日志大。
当网络接口附加到基于 Nitro 的实例时,无论指定的最大聚合时间间隔为多少,聚合时间间隔始终不超过 1 分钟。
在聚合时间间隔内捕获数据后,需要额外的时间来处理数据并将其发布到 CloudWatch Logs 或 Amazon S3。流日志服务通常在大约 5 分钟内将日志传送到 CloudWatch Logs,在大约 10 分钟内将日志传送到 Amazon S3。但是,日志交付已尽了最大努力,您的日志可能会延迟到典型交付时间之后。
默认格式
使用默认格式,流日志记录按可用字段表中显示的顺序包括版本 2 字段。您无法自定义或更改默认格式。要捕获其他字段或不同字段子集,请指定自定义格式。
自定义格式
使用自定义格式,您可以指定流日志记录中包含哪些字段以及采用哪种顺序。这使您可以根据具体需求创建流日志,并忽略无关的字段。使用自定义格式,还可减少从发布的流日志提取特定信息所需的单独流程。您可以指定任意数量的可用流日志字段,但必须至少指定一个。
可用字段
下表描述了对流日志记录可用的所有字段。版本列表示在其中引入了字段的 VPC 流日志版本。默认格式包括所有版本 2 字段,与它们在表格中出现的顺序相同。
将流日志数据发布到 Amazon S3 时,字段的数据类型将取决于流日志格式。如果格式为纯文本,则所有字段的类型均为 STRING。如果格式为 Parquet,请参阅字段数据类型表。
如果某个字段不适用于或无法计算特定记录,则记录为该条目显示一个“-”符号。不直接来自数据包标头的元数据字段是最大努力的近似值,它们的值可能缺失或不准确。
字段 | 描述 | 版本 |
---|---|---|
version |
VPC 流日志版本。如果您使用默认格式,则版本为 2。如果您使用自定义格式,则版本是指定字段中的最高版本。例如,如果您只在版本 2 中指定字段,则版本为 2。如果您在版本 2、3 和 4 中指定字段组合,则版本为 4。 Parquet 数据类型:INT_32 |
2 |
account-id |
为其记录流量的源网络接口的拥有者的Amazon账户 ID。如果该网络接口由 Amazon 服务创建,例如在创建 VPC 终端节点或 Network Load Balancer 时创建,则记录中可能会显示此字段的值为 unknown。 Parquet 数据类型:STRING |
2 |
interface-id |
为其记录流量的网络接口的 ID。 Parquet 数据类型:STRING |
2 |
srcaddr |
传入流量的源地址,或者网络接口上传出流量的网络接口 IPv4 或 IPv6 地址。网络接口的 IPv4 地址始终是其私有 IPv4 地址。另请参阅 pkt-srcaddr。 Parquet 数据类型:STRING |
2 |
dstaddr |
传出流量的目标地址,或者网络接口上传入流量的网络接口 IPv4 或 IPv6 地址。网络接口的 IPv4 地址始终是其私有 IPv4 地址。另请参阅 pkt-dstaddr。 Parquet 数据类型:STRING |
2 |
srcport |
流量的源端口。 Parquet 数据类型:INT_32 |
2 |
dstport |
流量的目标端口。 Parquet 数据类型:INT_32 |
2 |
protocol |
流量的 IANA 协议编号。有关更多信息,请参阅分配的 Internet 协议编号 Parquet 数据类型:INT_32 |
2 |
packets |
在流中传输的数据包的数量。 Parquet 数据类型:INT_64 |
2 |
bytes |
在流中传输的字节数。 Parquet 数据类型:INT_64 |
2 |
start |
在聚合时间间隔内,接收流的第一个数据包的时间(以 Unix 秒为单位)。这可能是在网络接口上传输或收到数据包之后最多 60 秒。 Parquet 数据类型:INT_64 |
2 |
end |
在聚合时间间隔内,接收流的最后一个数据包的时间(以 Unix 秒为单位)。这可能是在网络接口上传输或收到数据包之后最多 60 秒。 Parquet 数据类型:INT_64 |
2 |
action |
与流量关联的操作:
Parquet 数据类型:STRING |
2 |
log-status |
流日志的日志记录状态:
Parquet 数据类型:STRING |
2 |
vpc-id |
包含记录其流量的网络接口的 VPC 的 ID。 Parquet 数据类型:STRING |
3 |
subnet-id |
包含记录其流量的网络接口的子网的 ID。 Parquet 数据类型:STRING |
3 |
instance-id |
与要记录其流量的网络接口关联的实例的 ID(如果实例由您所有)。对于请求方管理的网络接口,返回“-”符号,例如,NAT 网关的网络接口。 Parquet 数据类型:STRING |
3 |
tcp-flags |
以下 TCP 标志的位掩码值:
在聚合时间间隔内,TCP 标志可以是 OR-ed。对于短连接,标志必须在与流日志记录相同的行上设置,例如,对于 SYN-ACK 和 FIN 的 19,以及对于 SYN 和 FIN 的 3。有关示例,请参阅 TCP 标志序列。 有关 TCP 标志的一般信息(例如 FIN、SYN 和 ACK 等标志的含义),请参阅 Wikipedia 上的 TCP 分段结构 Parquet 数据类型:INT_32 |
3 |
type |
流量的类型。可能的值包括:IPv4 | IPv6 | EFA。有关更多信息,请参阅 Elastic Fabric Adapter。 Parquet 数据类型:STRING |
3 |
pkt-srcaddr |
流量的数据包级别(原始)源 IP 地址。将此字段与 srcaddr 字段一起使用,用于区分流量流经的中间层 IP 地址与流量的原始源 IP 地址。例如,当流量流经 NAT 网关的网络接口时,或者当 Amazon EKS 中 Pod 的 IP 地址不同于运行 Pod 的实例节点的网络接口 IP 地址时(用于 VPC 中的通信)。 Parquet 数据类型:STRING |
3 |
pkt-dstaddr |
流量的数据包级别(原始)目标 IP 地址。将此字段与 dstaddr 字段一起使用,用于区分流量流经的中间层的 IP 地址与流量的最终目标 IP 地址。例如,当流量流经 NAT 网关的网络接口时,或者当 Amazon EKS 中 Pod 的 IP 地址不同于运行 Pod 的实例节点的网络接口 IP 地址时(用于 VPC 中的通信)。 Parquet 数据类型:STRING |
3 |
region |
包含记录其流量的网络接口的区域。 Parquet 数据类型:STRING |
4 |
az-id |
包含记录其流量的网络接口的可用区的 ID。如果流量来自子位置,则记录会对此字段显示“-”符号。 Parquet 数据类型:STRING |
4 |
sublocation-type |
sublocation-id 字段中返回的子位置类型:可能的值包括:波长 Parquet 数据类型:STRING |
4 |
sublocation-id |
包含记录其流量的网络接口的子位置的 ID。如果流量不是来自子位置,则记录会对此字段显示“-”符号。 Parquet 数据类型:STRING |
4 |
pkt-src-aws-service |
pkt-srcaddr 字段的 IP 地址范围子集的名称(如果源 IP 地址用于Amazon服务)。如果 pkt-srcaddr 属于重叠范围,则 pkt-src-aws-service 将只显示其中一个 Amazon 服务代码。可能的值包括:AMAZON | AMAZON_APPFLOW | AMAZON_CONNECT | API_GATEWAY | CHIME_MEETINGS | CHIME_VOICECONNECTOR | CLOUD9 | CLOUDFRONT | CODEBUILD | DYNAMODB | EBS | EC2 | EC2_INSTANCE_CONNECT | GLOBALACCELERATOR | KINESIS_VIDEO_STREAMS | ROUTE53 | ROUTE53_HEALTHCHECKS | ROUTE53_HEALTHCHECKS_PUBLISHING | ROUTE53_RESOLVER | S3 | WORKSPACES_GATEWAYS。 Parquet 数据类型:STRING |
5 |
pkt-dst-aws-service |
pkt-dstaddr 字段的 IP 地址范围子集的名称(如果目标 IP 地址用于Amazon服务)。有关可能的值的列表,请参阅 pkt-src-aws-service 字段。 Parquet 数据类型:STRING |
5 |
flow-direction |
相对于捕获流量的接口而言流的方向。可能的值包括:ingress | egress。 Parquet 数据类型:STRING |
5 |
traffic-path |
传出流量到达目的地的路径。要确定流量是否为传出流量,请检查 flow-direction 字段。可能的值如下所示。如果没有任何值适用,则该字段将设置为 -。
Parquet 数据类型:INT_32 |
5 |
ecs-cluster-arn |
如果流量来自正在运行的 ECS 任务,则为 ECS 集群的 Amazon 资源名称(ARN)。要在订阅中包含此字段,您需要调用 ecs:ListClusters 的权限。 Parquet 数据类型:STRING |
7 |
ecs-cluster-name |
如果流量来自正在运行的 ECS 任务,则为 ECS 集群的名称。要在订阅中包含此字段,您需要调用 ecs:ListClusters 的权限。 Parquet 数据类型:STRING |
7 |
ecs-container-instance-arn |
如果流量来自 EC2 实例上正在运行的 ECS 任务,则为 ECS 容器实例的 ARN。如果容量提供程序是 Amazon Fargate,则此字段将为“-”。要在订阅中包含此字段,您需要调用 ecs:ListClusters 和 ecs:ListContainerInstances 的权限。 Parquet 数据类型:STRING |
7 |
ecs-container-instance-id |
如果流量来自 EC2 实例上正在运行的 ECS 任务,则为 ECS 容器实例的 ID。如果容量提供程序是 Amazon Fargate,则此字段将为“-”。要在订阅中包含此字段,您需要调用 ecs:ListClusters 和 ecs:ListContainerInstances 的权限。 Parquet 数据类型:STRING |
7 |
ecs-container-id |
如果流量来自正在运行的 ECS 任务,则为容器的 Docker 运行时 ID。如果 ECS 任务中有一个或多个容器,这将是第一个容器的 docker 运行时 ID。要在订阅中包含此字段,您需要调用 ecs:ListClusters 的权限。 Parquet 数据类型:STRING |
7 |
ecs-second-container-id |
如果流量来自正在运行的 ECS 任务,则为容器的 Docker 运行时 ID。如果 ECS 任务中有多个容器,这将是第二个容器的 Docker 运行时 ID。要在订阅中包含此字段,您需要调用 ecs:ListClusters 的权限。 Parquet 数据类型:STRING |
7 |
ecs-service-name |
如果流量来自正在运行的 ECS 任务,并且 ECS 任务由 ECS 服务启动,则为 ECS 服务的名称。如果 ECS 任务不是由 ECS 服务启动的,则此字段将为“-”。要在订阅中包含此字段,您需要调用 ecs:ListClusters 和 ecs:ListServices 的权限。 Parquet 数据类型:STRING |
7 |
ecs-task-definition-arn |
如果流量来自正在运行的 ECS 任务,则为 ECS 任务定义的 ARN。要在订阅中包含此字段,您需要调用 ecs:ListClusters 和 ecs:ListTaskDefinitions 的权限 Parquet 数据类型:STRING |
7 |
ecs-task-arn |
如果流量来自正在运行的 ECS 任务,则为 ECS 任务的 ARN。要在订阅中包含此字段,您需要调用 ecs:ListClusters 和 ecs:ListTasks 的权限。 Parquet 数据类型:STRING |
7 |
ecs-task-id |
如果流量来自正在运行的 ECS 任务,则为 ECS 任务的 ID。要在订阅中包含此字段,您需要调用 ecs:ListClusters 和 ecs:ListTasks 的权限。 Parquet 数据类型:STRING |
7 |
流日志限制
要使用流日志,您需要了解以下限制:
-
您不能为与您的 VPC 对等的 VPC 启用流日志,除非该对等 VPC 在您的账户中。
-
创建流日志后,您无法更改其配置或者流日志记录格式。例如,您无法将不同的 IAM 角色与流日志关联,或者在流日志记录中添加或删除字段。不过,您可以删除流日志并使用必需的配置创建新的流日志。
-
如果网络接口有多个 IPv4 地址,并且流量发送到辅助私有 IPv4 地址,则流日志会在
dstaddr
字段中显示主要私有 IPv4 地址。要捕获原始目标 IP 地址,请使用pkt-dstaddr
字段创建流日志。 -
如果流量发送到某个网络接口而目标不是网络接口 IP 地址中的任何一个,则流日志会在
dstaddr
字段中显示主要私有 IPv4 地址。要捕获原始目标 IP 地址,请使用pkt-dstaddr
字段创建流日志。 -
如果来自某个网络接口的流量而源不是网络接口 IP 地址中的任何一个,则流日志会在
srcaddr
字段中显示主要私有 IPv4 地址。要捕获原始源 IP 地址,请使用pkt-srcaddr
字段创建流日志。 -
如果流量发送到网络接口或从网络接口发送,则流日志中的
srcaddr
和dstaddr
字段始终显示主要私有 IPv4 地址,而不管数据包源或目标如何。要捕获数据包源或目标,请使用pkt-srcaddr
和pkt-dstaddr
字段创建流日志。 -
当您的网络接口附加到基于 Nitro 的实例时,无论指定的最大聚合时间间隔为多少,聚合时间间隔始终不超过 1 分钟。
流日志不会捕获所有 IP 流量。以下类型的流量不予以记录:
-
实例与 Amazon DNS 服务器联系时生成的流量。如果您使用自己的 DNS 服务器,则将记录到该 DNS 服务器的所有流量。
-
Windows 实例为 Amazon Windows 许可证激活而生成的流量。
-
实例元数据传入和传出
169.254.169.254
的流量。 -
Amazon Time Sync Service 的传入和传出
169.254.169.123
的流量。 -
DHCP 流量。
-
镜像流量。
-
到默认 VPC 路由器的预留 IP 地址的流量。
-
端点网络接口和网络负载均衡器网络接口之间的流量。
特定于版本 7 中可用的 ECS 字段的限制:
要创建带有 ECS 字段的流日志订阅,账户必须至少包含一个 ECS 集群。
如果底层 ECS 任务不属于流日志订阅的所有者,则不计算 ECS 字段。例如,如果您与其他账户(
AccountB
)共享子网(SubnetA
),然后为SubnetA
创建流日志订阅,则如果AccountB
在共享子网中启动 ECS 任务,则您的订阅将收到来自AccountB
启动的 ECS 任务的流量日志,但出于安全考虑,将不会计算这些日志的 ECS 字段。如果在 VPC/子网资源级别创建带有 ECS 字段的流日志订阅,则也会为您的订阅传输为非 ECS 网络接口生成的所有流量。对于非 ECS IP 流量,ECS 字段的值将为“-”。例如,您有一个子网(
subnet-000000
),并且为该子网创建了带有 ECS 字段(fl-00000000
)的流日志订阅。在subnet-000000
中,您可以启动一个连接到互联网并正在积极生成 IP 流量的 EC2 实例(i-0000000
)。您还可以在同一子网中启动正在运行的 ECS 任务(ECS-Task-1
)。由于i-0000000
和ECS-Task-1
都在生成 IP 流量,因此您的流日志订阅fl-00000000
将为两个实体提供流量日志。但是,仅ECS-Task-1
会有您在 logFormat 中包含的 ECS 字段的实际 ECS 元数据。对于i-0000000
相关流量,这些字段的值将为“-”。ecs-container-id
和ecs-second-container-id
在 VPC 流日志服务从 ECS 事件流接收它们时进行排序。不能保证它们的顺序与您在 ECS 控制台或 DescribeTask API 调用中看到的顺序相同。如果容器在任务仍在运行时进入“已停止”状态,则它可能会继续出现在您的日志中。ECS 元数据和 IP 流量日志来自两个不同来源。当我们从上游依赖项中获得所有所需信息后,我们立即开始计算您的 ECS 流量。在您启动新任务后,我们将开始计算您的 ECS 字段:1) 当我们收到底层网络接口的 IP 流量时;2) 当我们收到包含您的 ECS 任务元数据的 ECS 事件以表明该任务正在运行时。在您停止任务后,我们会停止计算您的 ECS 字段:1) 当我们不再收到底层网络接口的 IP 流量或收到延迟超过一天的 IP 流量时;2) 当我们收到包含您的 ECS 任务元数据的 ECS 事件以表明您的任务不再运行时。
仅支持在
awsvpc
网络模式下启动的 ECS 任务。
定价
发布流日志时,将收取已出售日志的数据摄取和存档费用。有关发布已出售日志时定价的更多信息,请打开 Amazon CloudWatch 定价
若要跟踪发布流日志所产生的费用,您可以将成本分配标签应用到目的地资源。此后,您的 Amazon 成本分配报告中就会包含按这些标签汇总的用量和成本。您可以应用代表业务类别(例如成本中心、应用程序名称或拥有者)的标签,以便整理您的成本。有关更多信息,请参阅下列内容:
-
《Amazon Billing 用户指南》中的使用成本分配标签
-
《Amazon CloudWatch Logs 用户指南》中的在 Amazon CloudWatch Logs 中标记日志组
-
《Amazon Simple Storage Service 用户指南》中的使用成本分配 S3 存储桶标签
-
《Amazon Data Firehose Developer Guide》中的 Tagging Your Delivery Streams