使用日志记录和监控功能

日志记录

Cloud NAT 日志记录功能可让您记录 NAT 连接和错误。启用 Cloud NAT 日志记录功能后,系统可针对以下各种情景生成一个日志条目:

  • 创建好使用 NAT 的网络连接时。
  • 数据包因没有可用于 NAT 的端口而被丢弃时。

您可以选择记录这两种事件,也可以只记录其中一种事件。

创建的日志会发送至 Cloud Logging

规范

以下规范适用于 Cloud NAT 日志记录功能:

  • Cloud NAT 日志记录功能仅处理 TCP 和 UDP 流量。

  • Cloud NAT 日志记录功能仅记录丢弃的数据包,前提是这些数据包是出站 TCP 和 UDP 数据包。它不会记录丢弃的传入数据包。例如,如果对出站请求的入站响应因任何原因而被丢弃,则不会记录任何错误。

每个虚拟机实例在每单位时间内只能生成一定数量的日志条目,此数量与其 vCPU 数量成比例。虚拟机可以为每个 vCPU 每秒生成 50-100 个日志条目。

  • 此速率阈值会影响可记录的事件数量。即使某些事件被滤除,它们的出现次数也会计入可能的日志条目数。将日志限制为“仅限错误”或“仅限网络地址转换连接”不一定会增加查看的日志条目数。例如,如果您选择仅记录成功的连接,那么失败连接尝试和 NAT 错误的时间过长仍会限制成功连接日志条目数。

  • Cloud NAT 日志记录功能不会记录每个数据包。即使虚拟机的速率阈值尚未达到,某些条件也可能导致事件从日志中省略。您应该依靠 Cloud NAT 日志记录功能中的条目来做出明智的决策,但是您不应该认为缺少条目意味着事件没有发生。

配置日志记录功能

按照以下步骤配置 Cloud NAT 日志记录功能。

启用日志记录功能

如果启用日志记录功能,系统会默认将所有收集的日志发送到 Cloud Logging。您可以过滤这些日志,以便系统只发送特定日志。

您还可以在创建或修改 NAT 网关时指定这些值。以下说明介绍了如何为现有 NAT 网关启用日志记录功能。

控制台

  1. 在 Google Cloud Console 中,转到 Cloud NAT 页面。

    转到“Cloud NAT”页面

  2. 点击您的 NAT 网关。

  3. 点击 修改

  4. 点击日志记录、最小端口数、超时以打开该部分。

  5. Stackdriver Logging 下,选择以下某个选项:

    • 无日志记录:停用日志记录功能
    • 翻译和错误:将所有日志发送到 Logging
    • 仅限翻译:仅在创建连接时发送日志;不记录丢弃的数据包
    • 仅限错误:在数据包因没有可用的端口而被丢弃时发送日志;不记录新连接
  6. 点击保存

gcloud

以下命令会为现有 NAT 网关启用日志记录功能。

在每条命令中,替换以下内容:

  • NAT_GATEWAY:NAT 网关的名称
  • ROUTER_NAME:托管 NAT 网关的 Cloud Router 路由器的名称
  • REGION:Cloud Router 路由器的地区

如需记录网络地址转换事件和错误,请使用以下命令:

gcloud compute routers nats update NAT_GATEWAY \
    --router=ROUTER_NAME \
    --region=REGION \
    --enable-logging

如需仅记录网络地址转换事件,请使用以下命令:

gcloud compute routers nats update NAT_GATEWAY \
    --router=ROUTER_NAME \
    --region=REGION \
    --enable-logging \
    --log-filter=TRANSLATIONS_ONLY

如需仅记录错误,请使用以下命令:

gcloud compute routers nats update NAT_GATEWAY \
    --router=ROUTER_NAME \
    --region=REGION \
    --enable-logging \
    --log-filter=ERRORS_ONLY

清除日志过滤条件

如果您设置了过滤条件,则可以将其清除。清除日志过滤条件意味着只要启用了日志记录功能,系统就会记录网络地址转换事件和错误。

控制台

  1. 在 Cloud Console 中,转到 Cloud NAT 页面。

    转到“Cloud NAT”页面

  2. 点击您的 NAT 网关。

  3. 点击 修改

  4. 点击日志记录、最小端口数、超时以打开该部分。

  5. Stackdriver Logging 下,选择翻译和错误

  6. 点击保存

gcloud

gcloud compute routers nats update NAT_GATEWAY \
    --router=ROUTER_NAME \
    --region=REGION \
    --log-filter=ALL

替换以下内容:

  • NAT_GATEWAY:NAT 网关的名称
  • ROUTER_NAME:托管 NAT 网关的 Cloud Router 路由器的名称
  • REGION:Cloud Router 路由器的地区
  • --log-filter=ALL:将日志过滤条件设置为接受所有日志

停用日志记录功能

如需停用日志记录功能,请执行以下操作:

控制台

  1. 在 Cloud Console 中,转到 Cloud NAT 页面。

    转到“Cloud NAT”页面

  2. 点击您的 NAT 网关。

  3. 点击 修改

  4. 点击日志记录、最小端口数、超时以打开该部分。

  5. Stackdriver Logging 下,选择无日志记录

  6. 点击保存

gcloud

gcloud compute routers nats update NAT_GATEWAY \
    --router=ROUTER_NAME \
    --region=REGION \
    --no-enable-logging

替换以下内容:

  • NAT_GATEWAY:NAT 网关的名称
  • ROUTER_NAME:托管 NAT 网关的 Cloud Router 路由器的名称
  • REGION:Cloud Router 路由器的地区

确定日志记录功能的状态

如需确定日志记录功能的状态,请执行以下操作:

控制台

  1. 在 Google Cloud Console 中,转到 Cloud NAT 页面。

    转到“Cloud NAT”页面

  2. 点击您的 NAT 网关。

  3. 日志记录、最小端口数、超时部分中,检查 Stackdriver Logging 下的选择。

gcloud

gcloud compute routers nats describe NAT_GATEWAY \
    --router=ROUTER_NAME \
    --region=REGION

替换以下内容:

  • NAT_GATEWAY:NAT 网关的名称
  • ROUTER_NAME:托管 NAT 网关的 Cloud Router 路由器的名称
  • REGION:Cloud Router 路由器的地区

查看日志

如需查看 NAT 日志,请执行以下操作:

控制台

  1. 在 Google Cloud Console 中,转到日志查看器页面。

    转到“日志查看器”页面

    • 如需查看所有 NAT 日志,请在第一个下拉菜单中选择 Cloud NAT 网关
    • 如需仅查看一个地区的日志,请在第一个下拉菜单中选择 Cloud NAT 网关,然后向右滑动光标以选择一个地区。
    • 如需仅查看一个网关的日志,请在第一个下拉菜单中选择 Cloud NAT 网关,接着向右滑动光标以选择一个地区,然后再次向右滑动光标以选择一个网关。

或者,您可以转到日志查看器页面,然后将以下内容粘贴到按标签过滤或搜索文字字段中:

resource.type="nat_gateway"
logName="projects/{#project_id}/logs/compute.googleapis.com%2Fnat_flows"

gcloud

gcloud logging read 'resource.type=nat_gateway' \
    --limit=10 \
    --format=json

其中:

  • resource.type=nat_gateway:将输出限制为 NAT 网关
  • --limit=10:将输出限制为 10 个条目;您可以输入其他值来查看更多或更少的条目,也可以将其完全省略以查看日志的连续滚动
  • --format=json:以 JSON 格式显示输出

如需了解更多选项,请参阅读取日志条目

您可以为资源日志配置导出基于日志的指标

记录的内容

Cloud NAT 日志条目包含对监控和调试 NAT 流量有用的信息。日志条目包含以下类型的信息:

  • 大多数 Google Cloud 日志中显示的常规信息,例如严重性、项目 ID、项目编号和时间戳。
  • 与 Cloud NAT 相关的具体信息。某些日志字段包含本身为多个字段的条目。下表显示了这些条目和字段说明。

日志字段

字段 含义
connection object(NatIpConnection) 一个 7 元组,描述了此连接的来源虚拟机 IP 地址和端口、NAT 来源 IP 地址和端口、目标 IP 地址和端口,以及 IP 地址协议。
allocation_status enum 指示此连接是已成功分配还是已弃用。OKDROPPED 之一。
gateway_identifiers object(NatGateway) 连接使用的 NAT 网关配置。
endpoint object(InstanceDetails) 虚拟机实例详情。在共享 VPC 配置中,project_id 与服务项目相对应。
vpc object(VpcDetails) VPC 网络详情。在共享 VPC 配置中,project_id 与宿主项目的相应参数相对应。
destination object(DestinationDetails) 连接目标的详细信息。

NatIpConnection 字段格式

字段 类型 说明
src_ip 字符串 来源 IP 地址
src_port int32 来源端口
nat_ip 字符串 NAT IP 地址
nat_port int32 NAT 分配的端口
dest_ip 字符串 目标 IP 地址
dest_port int32 目标端口
protocol int32 IANA 协议编号

NatGateway 字段格式

字段 类型 说明
gateway_name 字符串 NAT 网关的名称
router_name 字符串 与 NAT 网关相关联的 Cloud Router 路由器
region 字符串 Cloud Router 路由器的地区

InstanceDetails 字段格式

字段 类型 说明
project_id 字符串 包含此虚拟机的项目的 ID
vm_name 字符串 虚拟机的实例名称
region 字符串 Cloud Router 路由器的地区
zone 字符串 虚拟机的区域

VpcDetails 字段格式

字段 类型 说明
project_id 字符串 包含此网络的项目的 ID
vpc_name 字符串 运行虚拟机的网络
subnetwork_name 字符串 运行虚拟机的子网

DestinationDetails 字段格式

字段 类型 说明
geo_location object(GeographicDetails) 如果连接的目标在 Google Cloud 的外部,则此字段将填充可用的位置元数据。
instance object(InstanceDetails) 如果连接的目标是与来源在同一项目内的实例,则此字段将填充虚拟机实例详细信息。

GeographicDetails 字段格式

字段 类型 说明
continent 字符串 外部端点所在的大洲
country 字符串 外部端点所在的国家/地区
region 字符串 外部端点所在的地区
city 字符串 外部端点所在的城市
asn 字符串 此端点所属外部网络的自治系统编号 (ASN)。

示例

示例 1:来自共享 VPC 网络中的虚拟机实例的 NAT 型 TCP 连接记录进入法国的外部服务器。

{
insertId: "1the8juf6vab1t"
jsonPayload: {
       connection: {
            Src_ip: "10.0.0.1"
            Src_port: 45047
            Nat_ip: "203.0.113.17"
            Nat_port: 34889
            dest_ip : "198.51.100.142"
            Dest_port: 80
            Protocol: "tcp"
       }
       allocation_status: "OK"
       Gateway_identifiers: {
             Gateway_name: "my-nat-1"
             router_name: "my-router-1"
             Region: "europe-west1"
       }
       Endpoint: {
             Project_id: "service-project-1"
             Vm_name: "vm-1"
             Region: "europe-west1"
             Zone: "europe-west1-b"
       }
       Vpc: {
             Project_id: "host-project"
             Vpc_name: "network-1"
             Subnetwork_name: "subnetwork-1"
       }
       Destination: {
             Geo_location: {
                   Continent: "Europe"
                   Country: "France"
                   Region: "Nouvelle-Aquitaine"
                   City: "Bordeaux"
             }
       }
}
logName: "projects/host-project/logs/compute.googleapis.com%2Fnat_flows"
receiveTimestamp: "2018-06-28T10:46:08.123456789Z"
resource: {
      labels: {
            region: "europe-west1-d"
            project_id: "host-project"
            router_id: "987654321123456"
            gateway_name: "my-nat-1"
      }
      type: "nat_gateway"
}
labels: {
      nat.googleapis.com/instance_name: "vm-1"
      nat.googleapis.com/instance_zone: "europe-west1-b"
      nat.googleapis.com/nat_ip: "203.0.113.17"
      nat.googleapis.com/network_name: "network-1"
      nat.googleapis.com/router_name: "my-router-1"
      nat.googleapis.com/subnetwork_name: "subnetwork-1"
}
timestamp: "2018-06-28T10:46:00.602240572Z"
}

示例 2:由于没有可用端口而丢弃数据包的记录。 发送方虚拟机尝试访问同一项目中另一个虚拟机的外部 IP 地址。

{
insertId: "1the8juf6vab1l"
jsonPayload: {
       connection: {
            Src_ip: "10.0.128.1"
            Src_port: 45047
            dest_ip : "192.0.2.87"
            Dest_port: 80
            Protocol: "tcp"
       }
       allocation_status: "DROPPED"
       Gateway_identifiers: {
             Gateway_name: "my-nat-2"
             Cloud_router: "my-router-1"
             Region: "europe-west1"
       }
       Endpoint: {
             Project_id: "service-project-1"
             Vm_name: "vm-1"
             Region: "europe-west1"
             Zone: "europe-west1-b"
       }
       Vpc: {
             Project_id: "host-project"
             Vpc_name: "network-1"
             Subnetwork_name: "subnetwork-1"
       }
       Destination: {
             Instance: {
                   Project_id: "service-project-1"
                   Vm_name: "vm-2"
                   Region: "asia-east1"
                   Zone: "asia-east1-b"
             }
       }
}
logName: "projects/host-project/logs/compute.googleapis.com%2Fnat_flows"
receiveTimestamp: "2018-06-28T10:46:09.123456789Z"
resource: {
       labels: {
              region: "europe-west1-d"
              project_id: "host-project"
              router_id: "987654321123456"
              gateway_name: "my-nat-2"
       }
       type: "nat_gateway"
}
timestamp: "2018-06-28T10:46:01.602240572Z"
}

Logging 价格

请参阅 Logging 价格

监控

Cloud NAT 向 Cloud Monitoring 提供关键指标,可让您深入了解机群的 NAT 网关使用情况。

系统会自动将指标发送至 Cloud Monitoring。在这里,您可以创建自定义信息中心、设置提醒以及查询指标。

以下是所需的 Identity and Access Management (IAM) 角色:

  • 对于在不同项目中定义了虚拟机和 NAT 网关的共享 VPC 用户,若要访问虚拟机级层指标,这些用户需要拥有每个虚拟机的项目的 roles/monitoring.viewer IAM 角色。

  • 对于 NAT 网关资源,若要访问网关指标,您需要拥有包含该网关的项目的 roles/monitoring.viewer IAM 角色。

查看预定义信息中心

Cloud NAT 提供了一组可显示网关相关活动的预定义信息中心:

  • 打开的连接数
  • 已处理的出站流量数据
  • 已处理的入站流量数据
  • 端口利用率
  • NAT 分配错误

如需从特定网关的详情页面查看预定义信息中心,请执行以下步骤:

控制台

  1. 在 Cloud Console 中,转到 Cloud NAT 页面。

    转到“Cloud NAT”页面

  2. 点击现有网关。

  3. 点击监控标签页。

  4. 向下滚动可查看所有信息中心。您可以使用页面顶部的控件将查看时间从 1 小时改为 30 天。将鼠标悬停在图表某个点上,即可查看该特定时间的详细信息。

定义自定义信息中心

如需通过 Cloud NAT 指标创建自定义 Cloud Monitoring 信息中心,请执行以下步骤:

控制台

  1. 在 Cloud Console 中,转到 Monitoring

    转到 Monitoring

  2. 点击信息中心,然后点击创建信息中心

  3. 为您的信息中心创建一个名称,然后点击确认

  4. 点击添加图表

  5. 给图表添加一个标题。

  6. 指定资源类型和指标:

    • 对于虚拟机的 Cloud NAT 指标,请使用 compute.googleapis.com/nat/ 前缀进行搜索。
    • 对于 NAT 网关的指标,请使用 router.googleapis.com/nat/ 前缀。

    如需查看指标和过滤维度的列表,请参阅使用虚拟机实例指标以及使用 NAT 网关指标

  7. 指定所有过滤维度。

  8. 点击保存

定义提醒政策

控制台

您可创建提醒政策来监控指标的值,当这些指标违反条件时便会通知您。创建用于监控一个或多个 Cloud NAT 网关Compute Engine 虚拟机实例资源的提醒政策的常规步骤如下:

  1. 在 Google Cloud Console 中,转到 Monitoring

    转到 Monitoring

  2. 在 Monitoring 导航窗格中,选择 提醒,然后选择创建政策
  3. 点击添加条件
    1. 目标窗格中的设置指定了要监控的资源和指标。点击文本框以启用菜单,然后选择资源 Cloud NAT 网关Compute Engine 虚拟机实例。接下来,从指标列表中选择一个指标。
    2. 提醒政策的配置窗格中的设置决定了何时触发提醒。 此窗格中的大多数字段已填充默认值。 如需详细了解此窗格中的字段,请参阅提醒政策文档中的配置
    3. 点击添加
  4. 如需前进到通知部分,请点击下一步
  5. 可选:如需将通知添加到您的提醒政策中,请点击通知渠道。在对话框中,从菜单中选择一个或多个通知渠道,然后点击确定

    如果您要添加的通知渠道未列出,请点击管理通知渠道。系统会将您带到新浏览器标签页中的通知渠道页面。在此页面上,您可以更新已配置的通知渠道。完成更新后,返回原始标签页,点击刷新 ,然后选择要添加到提醒政策中的通知渠道。

  6. 如需前进到文档部分,请点击下一步
  7. 点击名称,然后输入提醒政策的名称。
  8. 可选:点击文档,然后添加您希望包含在通知消息中的任何信息。
  9. 点击保存
如需了解详情,请参阅提醒政策

指标报告频率和保留

系统每一 (1) 分钟会对 Cloud NAT 的指标进行一次批处理,然后将其导出到 Monitoring。监控数据会保留六 (6) 周。默认情况下,信息中心可按 1H(1 小时)、6H(6 小时)、1D(1 天)、1W(1 周)、6W(6 周)时间间隔提供数据分析。您可以在从 1 分钟到 6 周的任何时间间隔内手动请求执行分析。

使用虚拟机实例指标

以下指标类型名称的前缀必须为 compute.googleapis.com/nat/。表中的条目已省略该前缀。

metric.type 类型 说明
sent_bytes_count 计数器 通过 NAT 网关发送的字节数(虚拟机 -> 互联网)。
sent_packets_count 计数器 通过 NAT 网关发送的数据包数量(虚拟机 -> 互联网)。
received_bytes_count 计数器 通过 NAT 网关接收的字节数(互联网 -> 虚拟机)。
received_packets_count 计数器 通过 NAT 网关接收的数据包数量(互联网 -> 虚拟机)。
new_connections_count 计数器 通过 NAT 网关创建的新连接数。
open_connections 仪表盘 目前在 NAT 网关上打开的连接数。
closed_connections_count 计数器 通过 NAT 网关关闭的连接数。
dropped_sent_packets_count 计数器 NAT 网关丢弃的已发送数据包数量(由于端口耗尽,或因端点独立映射而导致的端口冲突)。
dropped_received_packets_count 计数器 由于未找到连接而被 NAT 网关丢弃的已接收数据包数量。
port_usage 仪表盘 从虚拟机到单个互联网端点 (IP:port) 的连接数上限。
allocated_ports 仪表盘 NAT 网关分配给虚拟机的端口数。

虚拟机实例过滤维度

label_key 类型 说明
project_id 字符串 虚拟机实例的项目 ID。
instance_id 字符串 虚拟机实例的 ID。
zone 字符串 虚拟机实例所在的区域。
nat_project_number 字符串 NAT 网关所属的项目编号。
router_id 字符串 NAT 网关所属的 Cloud Router 路由器 ID。
nat_gateway_name 字符串 NAT 网关的名称。
nat_ip 字符串 分配给 NAT 网关的 NAT IP 地址。适用于指标 allocated_ports
ip_protocol 字符串 连接的协议。可以是 TCPUDPICMP。 适用于除 allocated_ports 以外的所有指标。
reason 字符串

数据包丢失的原因。可能的值包括:

  • OUT_OF_RESOURCES(如果 Cloud NAT 的 NAT IP 地址或端口耗尽)。
  • ENDPOINT_INDEPENDENT_CONFLICT(如果发生端点独立冲突)。

适用于指标 dropped_sent_packets_count

使用 NAT 网关指标

以下指标类型名称的前缀必须为 router.googleapis.com/nat/。表中的条目已省略该前缀。

metric.type 类型 说明
nat_allocation_failed 布尔值 如果未能将 NAT IP 地址分配给 NAT 网关中的任何虚拟机,则返回“true”,否则返回“false”。常见原因是网关中的 NAT IP 地址数量不足。
sent_bytes_count 计数器 通过 NAT 网关发送的字节数(虚拟机 -> 互联网)。
sent_packets_count 计数器 通过 NAT 网关发送的数据包数量(虚拟机 -> 互联网)。
received_bytes_count 计数器 通过 NAT 网关接收的字节数(互联网 -> 虚拟机)。
received_packets_count 计数器 通过 NAT 网关接收的数据包数量(互联网 -> 虚拟机)。
new_connections_count 计数器 通过 NAT 网关创建的新连接数。
open_connections 仪表盘 目前在 NAT 网关上打开的连接数。
closed_connections_count 计数器 通过 NAT 网关关闭的连接数。
dropped_sent_packets_count 计数器 NAT 网关丢弃的已发送数据包数量(由于端口耗尽,或因端点独立映射而导致的端口冲突)。
dropped_received_packets_count 计数器 由于未找到连接而被 NAT 网关丢弃的已接收数据包数量。
port_usage 仪表盘 单个虚拟机的端口使用量是从虚拟机到单个互联网端点 (IP:port) 的连接数上限。此字段显示某个 NAT 网关的所有虚拟机的最高端口使用量。
allocated_ports 仪表盘 NAT 网关分配给所有虚拟机的端口数。

网关过滤维度

label_key 类型 说明
project_id 字符串 网关的项目 ID。
region 字符串 网关的地区。
router_id 字符串 NAT 网关所属的 Cloud Router 路由器 ID。
gateway_name 字符串 NAT 网关的名称。
ip_protocol 字符串 连接的协议。可以是 TCPUDPICMP。适用于除 allocated_ports 以外的所有指标。
nat_ip 字符串 分配给 NAT 网关的 NAT IP 地址。适用于指标 allocated_ports
reason 字符串

数据包丢失的原因。可能的值包括:

  • OUT_OF_RESOURCES(如果 Cloud NAT 的 NAT IP 地址或端口耗尽)。
  • ENDPOINT_INDEPENDENT_CONFLICT(如果发生端点独立冲突)。

适用于指标 dropped_sent_packets_count

使用 API

您可以使用 Monitoring API 的 v3 projects.timeSeries.list 请求根据 Cloud NAT 指标构建任意查询。

API 示例

使用 1 分钟聚合 timeSeries.list 参数获取为虚拟机分配的端口:

  • 名称:projects/PROJECT_ID
  • 过滤条件:resource.type = "gce_instance" AND metric.name="compute.googleapis.com/nat/allocated_ports" AND metric.labels.nat_gateway_name="nat-1-237227-1569344091-5"
  • interval.start_time:2019-09-24T16:58:53Z
  • interval.end_time:2019-09-24T16:58:53Z
  • aggregation.alignmentPeriod:60s
  • aggregation.crossSeriesReducer:REDUCE_SUM
  • aggregation.perSeriesAligner:ALIGN_SUM
"timeSeries": [
    {
      "resource": {
        "labels": {
          "instance_id": "1406292833167995938",
          "project_id": "PROJECT_ID",
          "zone": "us-west1-c"
        },
        "type": "gce_instance"
      },
      "metric": {
        "labels": {
          "nat_ip": "70.32.157.11",
          "nat_gateway_name": "nat-1-237227-1569344091-5",
          "nat_project_number": "PROJECT_NUMBER",
          "router_id": "1380055590921303155"
        },
        "type": "compute.googleapis.com/nat/allocated_ports"
      },
      "metricKind": "GAUGE",
      "points": [
        {
          "interval": {
            "endTime": "2019-09-24T16:58:53.699Z",
            "startTime": "2019-09-24T16:58:53.699Z"
          },
          "value": {
            "int64Value": "64"
          }
        }
      ],
      "valueType": "INT64"
    },

监控价格

使用 Cloud NAT 监控功能无需支付任何费用。

后续步骤