Amazon Virtual Private Cloud
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

VPC 流日志

利用 VPC 流日志这项功能,您可以捕获有关传入和传出您的 VPC 中网络接口的 IP 流量的信息。流日志数据使用 Amazon CloudWatch Logs 存储。创建流日志后,您可以在 Amazon CloudWatch Logs 中查看和检索其数据。

流日志可以帮助您完成大量任务;例如,排查流量为什么没有到达实例的原因,这又可帮助您诊断限制过于严格的安全组规则。您还可以使用流日志作为安全工具来监视到达您的实例的流量。

使用流日志没有额外的费用;不过,会收取标准 CloudWatch Logs 费用。有关更多信息,请参阅 Amazon CloudWatch 定价

流日志基础知识

您可以为 VPC、子网或网络接口创建流日志。如果您为子网或 VPC 创建流日志,则会监视 VPC 或子网中的每个网络接口。流日志数据发布到 CloudWatch Logs 中的日志组,并且每个网络接口有唯一的日志流。日志流包含流日志记录,这些是日志事件,由描述该网络接口的流量的字段组成。有关更多信息,请参阅 流日志记录

要创建流日志,您必须指定要为其创建流日志的资源,要捕获的流量的类型 (已接受流量、已拒绝流量或所有流量)、CloudWatch Logs 中流日志将发布到的日志组的名称,以及具有足够权限可将流日志发布到 CloudWatch Logs 日志组的 IAM 角色的 ARN。如果您指定了不存在的日志组的名称,我们将尝试为您创建日志组。如果已创建流日志,则需要几分钟来开始收集数据并发布到 CloudWatch Logs。流日志不会为您的网络接口捕获实时日志流。

您可以创建将数据发布到 CloudWatch Logs 中相同日志组的多个流日志。如果相同日志组中的一个或多个流日志存在相同网络接口,其中就会有一个组合日志流。如果您指定了一个流日志应该捕获已拒绝流量,而另一个流日志应该捕获已接受流量,则组合日志流会捕获所有流量。

如果在为子网或 VPC 创建了流日志之后,您在子网中启动了多个实例,则在该网络接口上记录到任何网络流量时,将立即为每个新网络接口创建一个新日志流。

您可以为其他 AWS 创建的网络接口创建流日志,例如 Elastic Load Balancing、Amazon RDS、Amazon ElastiCache、Amazon Redshift 和 Amazon WorkSpaces。但是,您不能使用这些服务控制台或 API 来创建流日志;您必须使用 Amazon EC2 控制台或 Amazon EC2 API。与此类似,您不能使用 CloudWatch Logs 控制台或 API 为网络接口创建日志流。

如果您不再需要某个流日志,可将其删除。删除流日志将会禁用资源的流日志服务,不再创建新的流日志记录或日志流。它不删除网络接口的任何现有流日志记录或日志流。要删除现有日志流,您可以使用 CloudWatch Logs 控制台。在删除流日志之后,可能需要数分钟时间来停止收集数据。

流日志限制

要使用流日志,您需要了解以下限制:

  • 您无法为 EC2-Classic 平台中的网络接口启用流日志。这包含通过 ClassicLink 与 VPC 链接的 EC2-Classic 实例。

  • 您不能为与您的 VPC 对等的 VPC 启用流日志,除非该对等 VPC 在您的账户中。

  • 您不能标记流日志。

  • 在创建流日志之后,您不能更改其配置;例如,您不能将不同的 IAM 角色与流日志关联。不过,您可以删除流日志并使用必需的配置创建新的流日志。

  • 请注意,流日志 API 操作 (ec2:*FlowLogs) 支持资源级别的权限。如果您要创建 IAM 策略来控制流日志 API 操作的使用,则必须在语句中为资源元素使用 * 通配符,以便授予用户使用该操作的所有资源的权限。有关更多信息,请参阅 控制访问 Amazon VPC 资源

  • 如果网络接口有多个 IPv4 地址,并且流量发送到辅助私有 IPv4 地址,则流日志会在目的地 IP 地址字段中显示主要私有 IPv4 地址。

流日志不会捕获所有类型的 IP 流量。以下类型的流量不予以记录:

  • 实例与 Amazon DNS 服务器联系时生成的流量。如果您使用自己的 DNS 服务器,则将记录到该 DNS 服务器的所有流量。

  • Windows 实例为 Amazon Windows 许可证激活而生成的流量。

  • 实例元数据传入和传出 169.254.169.254 的流量。

  • DHCP 流量。

  • 到默认 VPC 路由器的预留 IP 地址的流量。有关更多信息,请参阅 VPC 和子网大小调整

流日志记录

流日志记录代表您的流日志中的网络流。每个记录捕获特定捕获窗口中的特定 5 元组的网络流。5 元组是一组 5 个不同的值,指定 Internet 协议 (IP) 流的源、目标和协议。捕获窗口是一段持续时间,在这段时间内流日志服务会聚合数据,然后再发布流日志记录。捕获窗口大约为 10 分钟,但最长可以为 15 分钟。流日志记录是以空格分隔的字符串,采用以下格式:

version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status

字段 说明
版本 VPC 流日志版本。
account-id 流日志的 AWS 账户 ID。
interface-id 日志流应用到的网络接口的 ID。
srcaddr 源 IPv4 或 IPv6 地址。网络接口的 IPv4 地址始终是其私有 IPv4 地址。
dstaddr 目标 IPv4 或 IPv6 地址。网络接口的 IPv4 地址始终是其私有 IPv4 地址。
srcport 流量的源端口。
dstport 流量的目标端口。
protocol 流量的 IANA 协议编号。有关更多信息,请转到分配的 Internet 协议编号
packets 捕获窗口中传输的数据包的数量。
字节 捕获窗口中传输的字节数。
start 捕获窗口启动的时间,采用 Unix 秒的格式。
end 捕获窗口结束的时间,采用 Unix 秒的格式。
操作 与流量关联的操作:
  • ACCEPT:安全组或网络 ACL 允许记录的流量。

  • REJECT:安全组或网络 ACL 未允许记录的流量。

log-status 流日志的日志记录状态:
  • OK:数据通常记录到 CloudWatch Logs。

  • NODATA:捕获窗口中没有传入或传出网络接口的网络流量。

  • SKIPDATA:捕获窗口中跳过了一些流日志记录。这可能是由于内部容量限制或内部错误。

如果某个字段不适用于特定记录,则记录为该条目显示一个“-”符号。

有关流日志记录的示例,请参阅 示例:流日志记录

您可以像使用 CloudWatch Logs 收集的任意其他日志事件一样使用流日志记录。有关监视日志数据和指标筛选条件的更多信息,请参阅 Amazon CloudWatch 用户指南 中的搜索和筛选日志数据。有关为流日志设置指标筛选条件和警报的示例,请参阅 示例:为流日志创建 CloudWatch 指标筛选条件和警报

流日志的 IAM 角色

与您的流日志关联的 IAM 角色必须具有足够的权限,以便将流日志发布到 CloudWatch Logs 中的指定日志组。附加到您的 IAM 角色的 IAM 策略必须至少包括以下权限:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Effect": "Allow", "Resource": "*" } ] }

您还必须确保角色具有信任关系,允许流日志服务承担该角色 (在 IAM 控制台中,选择您的角色,然后选择 Edit Trust Relationship 以查看信任关系):

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "vpc-flow-logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

此外,您可以按照以下过程来创建用于流日志的新角色。

为您的账户中的 CloudWatch Logs 日志组创建流日志角色

为流日志创建 IAM 角色

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 RolesCreate new role

  3. Select role type 页面上的 Amazon EC2 旁边,选择 Select

  4. Attach Policy 页面上,选择 Next Step

  5. 输入您的角色的名称;例如 Flow-Logs-Role,并且可以选择提供说明。选择创建角色

  6. 选择角色的名称。在 Permissions 下,展开 Inline Policies 部分,然后选择 click here

  7. 选择 Custom Policy,然后选择 Select

  8. 在上面的流日志的 IAM 角色部分中,复制第一条策略并将其粘贴到 Policy Document 窗口中。在 Policy Name 字段中输入您的策略的名称,然后选择 Apply Policy

  9. 在上面的流日志的 IAM 角色部分中,复制第二个策略 (信任关系),然后依次选择 Trust relationshipsEdit trust relationship。删除现有策略文档并粘贴到新的文档中。完成后,选择 Update Trust Policy

  10. Summary 页面上,记录您的角色的 ARN。创建流日志时需要此 ARN。

使用流日志

您可以通过 Amazon EC2、Amazon VPC 和 CloudWatch 控制台来使用流日志。

创建流日志

您可以在 Amazon VPC 控制台中从“VPC”页面和“Subnet”页面创建流日志,或者从 Amazon EC2 控制台中的“Network Interfaces”页面创建。

创建网络接口的流日志

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Network Interfaces

  3. 依次选择网络接口、Flow Logs 选项卡和 Create Flow Log

  4. 在对话框中完成以下信息。完成后,选择 Create Flow Log

    • Filter:选择流日志应捕获已拒绝流量、已接受流量还是所有流量。

    • Role:指定有权将日志发布到 CloudWatch Logs 的 IAM 角色的名称。

    • Destination Log Group:输入 CloudWatch Logs 中日志组的名称,流日志将发布到该日志组。您可以使用现有日志组,也可以输入新日志组名称,我们将为您创建该日志组。

为 VPC 或子网创建流日志

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,选择您的 VPC 或者选择子网

  3. 依次选择您的 VPC 或子网、Flow Logs 选项卡和 Create Flow Log

    注意

    要为多个 VPC 创建流日志,请选择 VPC,然后从 Actions 菜单中选择 Create Flow Log。要为多个子网创建流日志,请选择子网,然后从 Subnet Actions 菜单中选择 Create Flow Log

  4. 在对话框中完成以下信息。完成后,选择 Create Flow Log

    • Filter:选择流日志应捕获已拒绝流量、已接受流量还是所有流量。

    • Role:指定有权将日志发布到 CloudWatch Logs 的 IAM 角色的名称。

    • Destination Log Group:输入 CloudWatch Logs 中日志组的名称,流日志将发布到该日志组。您可以使用现有日志组,也可以输入新日志组名称,我们将为您创建该日志组。

查看流日志

您可以在 Amazon EC2 和 Amazon VPC 控制台中,通过查看特定资源的 Flow Logs 选项卡来查看有关流日志的信息。当您选择资源时,将列出该资源的所有流日志。显示的信息包括流日志的 ID、流日志配置以及有关流日志的状态的信息。

查看您的网络接口的流日志的相关信息

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Network Interfaces

  3. 选择网络接口,然后选择 Flow Logs 选项卡。此时有关流日志的信息将显示在选项卡上。

查看您的 VPC 或子网的流日志的相关信息

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,选择您的 VPC 或者选择子网

  3. 选择您的 VPC 或子网,然后选择 Flow Logs 选项卡。此时有关流日志的信息将显示在选项卡上。

使用 CloudWatch Logs 控制台可以查看您的流日志记录。在您创建流日志之后,可能需要几分钟才能显示在控制台中。

查看您的流日志的流日志记录

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在导航窗格中,选择 Logs

  3. 选择包含您的流日志的日志组的名称。

  4. 此时将显示每个网络接口的日志流的列表。选择日志流的名称,该日志流中包含您希望查看其流日志记录的网络接口 ID。有关流日志记录的更多信息,请参阅流日志记录

删除流日志

您可以使用 Amazon EC2 和 Amazon VPC 控制台删除流日志。

注意

使用这些过程可以禁用资源的流日志服务。要删除您的网络接口的日志流,请使用 CloudWatch Logs 控制台。

删除网络接口的流日志

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Network Interfaces,然后选择网络接口。

  3. 选择 Flow Logs 选项卡,然后选择流日志的删除按钮 (叉号) 来删除该流日志。

  4. 在确认对话框中,选择 Yes, Delete

删除 VPC 或子网的流日志

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,选择您的 VPC 或者选择您的子网,然后选择资源。

  3. 选择 Flow Logs 选项卡,然后选择流日志的删除按钮 (叉号) 来删除该流日志。

  4. 在确认对话框中,选择 Yes, Delete

故障排除

未完成的流日志记录

如果流日志记录未完成,或者不再进行发布,则将流日志传输到 CloudWatch Logs 日志组时可能会出现问题。在 Amazon EC2 控制台或 Amazon VPC 控制台中,转到 Flow Logs 选项卡以获取相关资源。有关更多信息,请参阅 查看流日志。流日志表显示 Status 列中的所有错误。或者,使用 describe-flow-logs 命令,然后检查 DeliverLogsErrorMessage 字段中返回的值。可能会显示以下错误之一:

  • Rate limited:如果应用了 CloudWatch 日志限制,则当某个网络接口的流日志记录数超过了可以在特定时间范围内发布的最大记录数时,会出现此错误。如果已达到您可创建的 CloudWatch Logs 日志组数量的上限,也可能出现此错误。有关更多信息,请参阅 Amazon CloudWatch 用户指南 中的 CloudWatch 限制

  • Access error:您的流日志的 IAM 角色没有足够的权限将流日志记录发布到 CloudWatch 日志组。有关更多信息,请参阅 流日志的 IAM 角色

  • Unknown error:流日志服务中出现内部错误。

流日志处于活动状态,但没有流日志记录或日志组

您已创建了流日志,并且 Amazon VPC 或 Amazon EC2 控制台显示流日志为 Active。但是,您在 CloudWatch Logs 中看不到任何日志流,或者尚未创建您的 CloudWatch Logs 日志组。原因可能是以下之一:

  • 流日志仍处于创建过程中。在一些情况下,当您为要创建的日志组创建了流日志之后,有时会需要数十分钟才会显示数据。

  • 还没有为您的网络接口记录任何流量。CloudWatch Logs 中的日志组仅在记录流量时创建。

API 和 CLI 概述

您可以使用命令行或 API 执行此页面上介绍的任务。有关命令行接口的更多信息以及可用 API 操作的列表,请参阅访问 Amazon VPC

创建流日志

描述您的流日志

查看您的流日志记录 (日志事件)

删除流日志

示例:流日志记录

已接受流量和已拒绝流量的流日志记录

下面是流日志记录的示例,其中允许指向账户 123456789010 中的网络接口 eni-abc123de 的 SSH 流量 (目标端口 22,TCP 协议)。

Copy
2 123456789010 eni-abc123de 172.31.16.139 172.31.16.21 20641 22 6 20 4249 1418530010 1418530070 ACCEPT OK

下面是流日志记录的示例,其中拒绝了指向账户 123456789010 中的网络接口 eni-abc123de 的 RDP 流量 (目标端口 3389,TCP 协议)。

Copy
2 123456789010 eni-abc123de 172.31.9.69 172.31.9.12 49761 3389 6 20 4249 1418530010 1418530070 REJECT OK

无数据和跳过记录的流日志记录

以下示例的流日志记录在捕获窗口中未记录数据。

Copy
2 123456789010 eni-1a2b3c4d - - - - - - - 1431280876 1431280934 - NODATA

以下示例的流日志记录在捕获窗口中跳过了记录。

Copy
2 123456789010 eni-4b118871 - - - - - - - 1431280876 1431280934 - SKIPDATA

安全组和网络 ACL 规则

如果您正使用流日志来诊断过于严格或过于宽松的安全组规则或网络 ACL 规则,请注意这些资源的状态性。安全组是有状态的,这意味着对所允许流量的响应也会被允许,即使安全组中的规则不允许也是如此。相反,网络 ACL 是无状态的,因此对所允许流量的响应需要遵守网络 ACL 规则。

例如,您从家中的计算机 (IP 地址为 203.0.113.12) 对您的实例 (网络接口的私有 IP 地址为 172.31.16.139) 使用 ping 命令。您的安全组入站规则允许 ICMP 流量,出站规则不允许 ICMP 流量,但是,由于安全组是有状态的,因此允许从您的实例响应 ping。您的网络 ACL 允许入站 ICMP 流量,但不允许出站 ICMP 流量。由于网络 ACL 是无状态的,响应 Ping 将被丢弃,不会传输到您家中的计算机。在流日志中,它显示为 2 个流日志记录:

  • 网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的 ACCEPT 记录。

  • 网络 ACL 拒绝的响应 ping 的 REJECT 记录。

Copy
2 123456789010 eni-1235b8ca 203.0.113.12 172.31.16.139 0 0 1 4 336 1432917027 1432917142 ACCEPT OK
Copy
2 123456789010 eni-1235b8ca 172.31.16.139 203.0.113.12 0 0 1 4 336 1432917094 1432917142 REJECT OK

如果您的网络 ACL 允许出站 ICMP 流量,流日志会显示两个 ACCEPT 记录 (一个针对发起 ping,一个针对响应 ping)。如果您的安全组拒绝入站 ICMP 流量,流日志会显示一个 REJECT 记录,因为流量无权到达您的实例。

IPv6 流量的流日志记录

下面是流日志记录的示例,其中允许账户 123456789010 中从 IPv6 地址 2001:db8:1234:a100:8d6e:3477:df66:f105 到网络接口 eni-f41c42bf 的 SSH 流量 (端口 22)。

Copy
2 123456789010 eni-f41c42bf 2001:db8:1234:a100:8d6e:3477:df66:f105 2001:db8:1234:a102:3304:8879:34cf:4071 34892 22 6 54 8855 1477913708 1477913820 ACCEPT OK

示例:为流日志创建 CloudWatch 指标筛选条件和警报

在此示例中,您有一个适用于 eni-1a2b3c4d 的流日志。您要创建一个警报,如果 1 小时内有 10 次或超过 10 次通过 TCP 端口 22 (SSH) 连接到您的实例的尝试遭到拒绝,该警报将向您发出提醒。首先,您必须创建一个指标筛选条件,该指标筛选条件与您要为其创建警报的流量的模式相匹配。然后,您可以为该指标筛选条件创建警报。

为已拒绝的 SSH 流量创建指标筛选条件并为该筛选条件创建警报

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 在导航窗格中,选择 Logs,选择您的流日志对应的流日志组,然后选择 Create Metric Filter

  3. Filter Pattern 字段中,输入以下内容:

    Copy
    [version, account, eni, source, destination, srcport, destport="22", protocol="6", packets, bytes, windowstart, windowend, action="REJECT", flowlogstatus]
  4. Select Log Data to Test 列表中,选择您的网络接口对应的日志流。您可以选择 Test Pattern 以查看与筛选条件模式匹配的日志数据行。准备好之后,选择 Assign Metric

  5. 提供指标命名空间和指标名称,并确保将指标值设置为 1。完成后,选择 Create Filter

  6. 在导航窗格中,选择 Alarms,然后选择 Create Alarm

  7. Custom Metrics 部分中,为您创建的指标筛选条件选择命名空间。

    注意

    新指标可能需要几分钟才会在控制台中显示。

  8. 选择您创建的指标名称,然后选择 Next

  9. 输入警报的名称和说明。在 is 字段中,选择 >= 并输入 10。在 for 字段中,保留默认值 1 以指示连续期间。

  10. Period 列表中选择 1 Hour,并从 Statistic 列表中选择 SumSum 统计数据确保您捕获指定时间段内的数据点的总数。

  11. Actions 部分中,您可以选择将通知发送到现有列表,或者您可以创建新列表并输入触发警报时应接收通知的电子邮件地址。完成后,选择 Create Alarm