亚马逊AWS官方博客

通过 VPC 流日志中额外的元数据加深对网络流量的了解

通过 Amazon Virtual Private Cloud流日志,您可以捕获有关传入和传出 VPC 中网络接口的 IP 流量的信息。流日志数据可发布到 Amazon CloudWatch LogsAmazon Simple Storage Service (S3)

自 2015 年我们推出 VPC 流日志以来,您一直在使用它来处理各种使用案例,例如解决 VPC 中的连接问题、入侵检测、异常检测或归档,以实现合规性。迄今为止,VPC 流日志提供的信息包括源 IP、源端口、目标 IP、目标端口、操作(接受和拒绝)以及状态。启用后,VPC 流日志的条目显示效果如下。

虽然这些信息足以帮您理解大多数流,但需要额外的计算和查找才能将 IP 地址与实例 ID 匹配,或者需要猜测流的方向性才能得出有意义的结论。

今天,我们宣布可以在流日志记录中包含额外的元数据,以便更好地了解网络流量。通过减少从日志数据中提取有意义信息所需的计算或查找次数,经过充实的流日志将允许您简化脚本,或者完全消除后期处理的需要。

当您创建新的 VPC 流日志时,除现有字段外,您现在还可以选择添加以下元数据:

  • vpc-id:包含源弹性网络接口 (ENI) 的 VPC 的 ID。
  • subnet-id:包含源 ENI 的子网的 ID。
  • instance-id :与源接口关联的实例的 Amazon Elastic Compute Cloud (EC2) 实例 ID。如果 ENI 由 AWS 服务(如 AWS PrivateLinkNAT 网关网络负载均衡器等)设置,则此字段为“-
  • tcp-flags:在聚合期间内观察到的 TCP 标志的位掩码。例如,FIN 是 0x01 (1)、SYN 是 0x02 (2)、ACK 是 0x10 (16),SYN + ACK 是 0x12 (18) 等等(这些位在 RFC793“传输控制协议规范”的“控制位”部分中指定)。
    这让您可以理解谁发起或终止了连接。TCP 使用三次握手建立连接。连接方机器将 SYN 数据包发送到目的地,目的地使用 SYN + ACK 作为答复,最后,连接方机器发送 ACK。在流日志中,握手显示为两行,tcp-flags 值为2 (SYN),18 (SYN + ACK)。  ACK 仅会在附带有 SYN 时报告(否则会造成过于严重的噪声,无法过滤掉)。
  • type:流量类型:IPV4、IPV6 或 Elastic Fabric Adapter
  • pkt-srcaddr:源的数据包级 IP 地址。您通常要将此字段与 srcaddr 结合使用,以区分流量流通过的中间层的 IP 地址,例如 NAT 网关。
  • pkt-dstaddr:目标的数据包级 IP 地址,与上一项类似,但是表示的是目标 IP 地址。

要创建 VPC 流日志,您可以使用 AWS 管理控制台AWS 命令行界面 (CLI)CreateFlowLogs API,并选择使用这些字段的哪些附加信息和使用顺序,例如:

您也可以使用 AWS 命令行界面 (CLI),如下所示:

$ aws ec2 create-flow-logs --resource-type VPC \
                            --region eu-west-1 \
                            --resource-ids vpc-12345678 \
                            --traffic-type ALL  \
                            --log-destination-type s3 \
                            --log-destination arn:aws:s3:::sst-vpc-demo \
                            --log-format '${version} ${vpc-id} ${subnet-id} ${instance-id} ${interface-id} ${account-id} ${type} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${pkt-srcaddr} ${pkt-dstaddr} ${protocol} ${bytes} ${packets} ${start} ${end} ${action} ${tcp-flags} ${log-status}'

# be sure to replace the bucket name and VPC ID !

{
    "ClientToken": "1A....HoP=",
    "FlowLogIds": [
        "fl-12345678123456789"
    ],
    "Unsuccessful": [] 
}

内容经过充实的 VPC 流日志会传送到 S3 中。我们将自动添加必要的 S3 存储桶策略,以授权 VPC 流日志写入您的 S3 存储桶。VPC 流日志不会捕获网络接口的实时日志流,可能需要延迟几分钟才能开始收集数据并将数据发布到所选目标。您的日志最终会在 S3 上可用,路径为:s3://<bucket name>/AWSLogs/<account id>/vpcflowlogs/<region>/<year>/<month>/<day>/

从我的笔记本电脑(IP 地址为 90.90.0.200)到 EC2 实例的 SSH 连接如下所示:

3 vpc-exxxxxx2 subnet-8xxxxf3 i-0bfxxxxxxaf eni-08xxxxxxa5 48xxxxxx93 IPv4 172.31.22.145 90.90.0.200 22 62897 172.31.22.145 90.90.0.200 6 5225 24 1566328660 1566328672 ACCEPT 18 OK
3 vpc-exxxxxx2 subnet-8xxxxf3 i-0bfxxxxxxaf eni-08xxxxxxa5 48xxxxxx93 IPv4 90.90.0.200 172.31.22.145 62897 22 90.90.0.200 172.31.22.145 6 4877 29 1566328660 1566328672 ACCEPT 2 OK

172.31.22.145EC2 实例的私有 IP 地址,也就是您在实例上键入 ifconfig 时会看到的 IP 地址。  在聚合期间,所有标志都会执行“OR”(逻辑或)运算。如果连接时间很短,SYNFIN (3) 以及 SYN+ACKFIN (19) 可能都会在相同的行中设置。

创建流日志后,您不能再添加额外的字段,也不能再修改日志结构,以防意外破坏使用此数据的脚本。如需执行任何修改,您都必须删除并重新创建 VPC 流日志。您无需额外付费即可在 VPC 流日志中捕获额外的信息,只需按照标准 VPC 流日志定价付费即可,切记,在选择所有字段时,内容经过充实的 VPC 流日志记录可能会占用更多存储空间。  我们建议您仅选择与您的使用案例相关的字段。

目前可以使用 VPC 流日志的所有区域均可使用内容经过充实的 VPC 流日志,您可以立即开始体验这一新版功能。

— seb

补充说明:据团队说,他们还在竭力为这个日志添加更多元数据,请继续关注最新动态。