为工作负载虚拟机配置互联网访问权限

您可以针对每个区域为 Google Cloud VMware Engine 中的 VMware 工作负载配置互联网访问网络服务。您可以使用 Google Cloud 的互联网边缘或通过本地连接定向来自 VMware 工作负载虚拟机的互联网绑定流量。

可以访问互联网的工作负载虚拟机还可以使用专用 Google 访问通道访问 Google Cloud 服务。对使用专用 Google 访问通道的 Google Cloud 服务的访问权限会保留在 Google Cloud 网络中,而且不会退出互联网。

互联网访问网络服务支持:

  • 每个区域最多 100 个公共 IP 地址
  • 每个防火墙表最多 300 条防火墙规则
  • 每个区域最多 128000 个并发连接,吞吐量最高 2 Gbps
  • TCP、UDP 和 ICMP 协议

互联网访问网络服务不支持应用层网关 (ALG) 功能。

准备工作

如需更改您的私有云的互联网访问设置,您必须对 VMware Engine 拥有管理员访问权限

如需启用互联网访问权限,您需要一个边缘服务 CIDR 地址范围。当您启用互联网访问权限或公共 IP 网络服务时,会在服务租户上下文中部署网关。

使用边缘服务 CIDR 地址范围来访问 VMware Engine 互联网和公共 IP 网关。地址范围必须满足以下要求:

  • 符合 RFC 1918 作为专用地址范围的要求。
  • 不与任何其他 VMware Engine 地址范围(例如,用于管理设备或 NSX-T 片段的地址范围)重叠。
  • 不与向 VMware Engine 通告的任何地址范围(例如,用于虚拟私有云 (VPC) 网络子网或本地网络的地址范围)重叠。
  • 指定一个具有 26 个子网掩码位 (/26) 的 IP 地址范围。

Google Cloud CLI 和 API 要求

如需使用 gcloud 命令行工具或 API 管理 VMware Engine 资源,我们建议您按下文所述配置工具。

gcloud

  1. 设置默认项目 ID:

    gcloud config set project PROJECT_ID
    
  2. 设置默认区域和/或可用区:

    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE

如需详细了解 gcloud vmware 工具,请查看 Cloud SDK 参考文档

API

本文档集中的 API 示例使用 cURL 命令行工具来查询 API。cURL 请求中需要有效的访问令牌。获取有效访问令牌的方法有很多种:以下步骤使用 gcloud 工具生成访问令牌:

  1. 登录 Google Cloud

    gcloud auth login
    
  2. 生成访问令牌并导出到 TOKEN

    export TOKEN=`gcloud auth print-access-token`
    
  3. 验证 TOKEN 设置正确

    echo $TOKEN
    
    Output:
    TOKEN
    

现在,在对 API 的请求中使用授权令牌。例如:

curl -X GET -H "Authorization: Bearer \"$TOKEN\""  -H "Content-Type: application/json; charset=utf-8" https://vmwareengine.googleapis.com/v1/projects/PROJECT_ID/locations

Python

本文档中的 Python 代码示例使用 VMware Engine 库与 API 进行通信。为了能够使用此方法,需要安装该库并配置应用默认凭据

  1. 下载并安装 Python 库

     pip install google-cloud-vmwareengine
    
  2. 通过在 Shell 中执行这些命令来配置 ADC 信息

      gcloud auth application-default login
    

    或使用服务账号密钥文件

      export GOOGLE_APPLICATION_CREDENTIALS="FILE_PATH"
    

如需详细了解该库,请访问参考页面或查看 GitHub 上的代码示例

配置互联网访问服务

您可以通过创建或更新网络政策,允许工作负载虚拟机访问互联网。

默认情况下,互联网访问网络服务处于停用状态。

在区域中启用互联网访问服务

控制台

如需在区域中启用互联网访问服务,请执行以下操作:

  1. 访问 Google Cloud 控制台
  2. 在主导航栏中,前往网络政策
  3. 点击创建以创建新政策。如果您要修改现有网络政策,请点击行末尾的更多图标,然后选择修改
  4. 填写网络政策的详细信息,包括选择政策适用的网络和区域。
  5. 互联网访问切换为已启用,然后视需要启用外部 IP 地址服务

  6. 边缘服务 CIDR 字段中,输入在寻址 VMware Engine 互联网网关时要使用的地址范围(/26 地址范围)。

  7. 点击创建

操作完成后,通常在几分钟后,服务的状态会变为 已启用

gcloud

使用 gcloud 工具运行以下命令以创建网络政策:

gcloud vmware network-policies create NETWORK_POLICY_NAME \
    --vmware-engine-network projects/PROJECT_ID/locations/LOCATIONS/vmwareEngineNetworks/NETWORK_ID \
    --edge-services-cidr=IP_RANGE \
    --location=LOCATION \
    --internet-access

替换以下内容:

  • NETWORK_POLICY_NAME:此网络政策的名称。
  • NETWORK_ID:应用此网络政策的网络
  • IP_RANGE:用于互联网访问网关和外部 IP 访问网关的 CIDR 范围(采用 CIDR 表示法)。必须提供带有“/26”前缀的 RFC 1918 CIDR 地址块。
  • LOCATIONglobal(对于旧版网络或标准网络的区域)

API

curl -X POST -H "Authorization: Bearer TOKEN"  -H "Content-Type: application/json; charset=utf-8" https://vmwareengine.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/networkPolicies?networkPolicyId=NETWORK_POLICY_NAME

'{
  "vmwareEngineNetwork":"projects/PROJECT_ID/locations/LOCATION/vmwareEngineNetworks/NETWORK_ID",
  "edgeServiceCidr":IP_RANGE,
  "internetAccess: {
    "enabled": true
   },
   "externalIp": {
     "enabled": true
   }
}"

替换以下内容:

  • NETWORK_POLICY_NAME:此网络政策的名称。必须采用 REGION-default 格式。
  • PROJECT_ID:此请求的项目 ID
  • LOCATIONglobal(对于旧版网络或标准网络的区域)
  • IP_RANGE:用于互联网访问网关和外部 IP 访问网关的 CIDR 范围(采用 CIDR 表示法)。必须提供带有“/26”前缀的 RFC 1918 CIDR 地址块。
  • NETWORK_ID:此网络政策的网络

Python

from google.api_core import operation
from google.cloud import vmwareengine_v1

def create_network_policy(
    project_id: str,
    region: str,
    ip_range: str,
    internet_access: bool,
    external_ip: bool,
) -> operation.Operation:
    """
    Creates a new network policy in a given network.

    Args:
        project_id: name of the project you want to use.
        region: name of the region you want to use. I.e. "us-central1"
        ip_range: the CIDR range to use for internet access and external IP access gateways,
            in CIDR notation. An RFC 1918 CIDR block with a "/26" suffix is required.
        internet_access: should internet access be allowed.
        external_ip: should external IP addresses be assigned.

    Returns:
        An operation object representing the started operation. You can call its .result() method to wait for
        it to finish.

    Raises:
        ValueError if the provided ip_range doesn't end with /26.
    """
    if not ip_range.endswith("/26"):
        raise ValueError(
            "The ip_range needs to be an RFC 1918 CIDR block with a '/26' suffix"
        )

    network_policy = vmwareengine_v1.NetworkPolicy()
    network_policy.vmware_engine_network = f"projects/{project_id}/locations/{region}/vmwareEngineNetworks/{region}-default"
    network_policy.edge_services_cidr = ip_range
    network_policy.internet_access.enabled = internet_access
    network_policy.external_ip.enabled = external_ip

    request = vmwareengine_v1.CreateNetworkPolicyRequest()
    request.network_policy = network_policy
    request.parent = f"projects/{project_id}/locations/{region}"
    request.network_policy_id = f"{region}-default"

    client = vmwareengine_v1.VmwareEngineClient()
    return client.create_network_policy(request)

在区域中停用互联网访问服务

如需停用某个区域的互联网访问服务,请执行以下操作:

控制台

  1. 访问 Google Cloud 控制台
  2. 在主导航栏中,前往网络政策
  3. 在与相关网络政策对应的行中,点击更多 图标。
  4. 互联网访问权限切换为已停用

    • 您必须先停用公共 IP 服务,然后才能停用互联网访问权限。
    • 您必须先删除所有已分配的公共 IP 地址和指向站点的 VPN 网关,然后才能停用公共 IP 服务。
  5. 点击保存

操作完成后,通常在几分钟后,服务的状态会变为 已停用

gcloud

使用 gcloud 工具运行以下命令以更新网络政策:

gcloud vmware network-policies update NETWORK_POLICY_NAME \
  --no-internet-access \
  --location LOCATION

替换以下内容:

  • NETWORK_POLICY_NAME:此网络政策的名称
  • LOCATIONglobal(对于旧版网络或标准网络的区域)

API

curl -X PATCH -H "Authorization: Bearer TOKEN"  -H "Content-Type: application/json; charset=utf-8" https://vmwareengine.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/networkPolicies/NETWORK_POLICY_NAME?updateMask=internetAccess.enabled,externalIp.enabled -d "{
  "internetAccess: {
    "enabled": false
 },
  "externalIp": {
    "enabled": false
   }
}"

替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • LOCATIONglobal(对于旧版网络或标准网络的区域)
  • NETWORK_POLICY_NAME:此网络政策的名称

Python

from google.api_core import operation
from google.cloud import vmwareengine_v1

def update_network_policy(
    project_id: str, region: str, internet_access: bool, external_ip: bool
) -> operation.Operation:
    """
    Updates a network policy in a given network.

    Args:
        project_id: name of the project you want to use.
        region: name of the region you want to use. I.e. "us-central1".
        internet_access: should internet access be allowed.
        external_ip: should external IP addresses be assigned.

    Returns:
        An operation object representing the started operation. You can call its .result() method to wait for
        it to finish.
    """

    client = vmwareengine_v1.VmwareEngineClient()
    request = vmwareengine_v1.UpdateNetworkPolicyRequest()
    request.update_mask = "internetAccess.enabled,externalIp.enabled"
    network_policy = vmwareengine_v1.NetworkPolicy()
    network_policy.name = (
        f"projects/{project_id}/locations/{region}/networkPolicies/{region}-default"
    )
    network_policy.vmware_engine_network = f"projects/{project_id}/locations/{region}/vmwareEngineNetworks/{region}-default"
    network_policy.internet_access.enabled = internet_access
    network_policy.external_ip.enabled = external_ip

    request.network_policy = network_policy

    return client.update_network_policy(request)

使用本地连接来进行工作负载互联网访问

您可以选择通过本地连接来定向来自 VMware Engine 中工作负载虚拟机的互联网绑定流量。系统根据以下各项的状态定向流量:

  • 来自本地的默认路由 (0.0.0.0/0) 通告
  • VMware Engine 公共 IP 服务
  • VMware Engine 互联网访问服务
  • VPC 网络和 VMware Engine 之间的 VPC 对等互连连接上的 VPC Service Controls

启用“通过本地连接路由互联网流量”功能

如需通过本地连接从工作负载虚拟机访问互联网,您必须完成两个步骤:

  1. 通过本地连接(Cloud VPN 或 Cloud Interconnect)从本地通告默认路由 (0.0.0.0/0)。检查 Cloud VPN 网关或 Cloud Router,其中与 VPN 的本地连接终止。
  2. 停用 VMware Engine 网络的互联网访问和公共 IP 服务。

控制台

  1. 访问 Google Cloud 控制台
  2. 在主导航栏中,前往网络政策
  3. 在与相关网络政策对应的行中,点击更多 图标。
  4. 公共 IP 切换为已停用

  5. 互联网访问权限切换为已停用

  6. 点击保存

  7. 如果使用旧版 VMware Engine 网络:请使用 gcloud services vpc-peerings enable-vpc-service-controls 命令对 VPC 网络和 VMware Engine 之间的 VPC 对等互连连接启用 VPC Service Controls

    gcloud services vpc-peerings enable-vpc-service-controls \
       --network=VPC_NETWORK \
       --service=servicenetworking.googleapis.com

gcloud

使用 gcloud 工具运行以下命令以更新网络政策:

gcloud vmware network-policies update NETWORK_POLICY_NAME \
  --no-internet-access \
  --no-external-ip-address \
  --location LOCATION

替换以下内容:

  • NETWORK_POLICY_NAME:此网络政策的名称
  • LOCATIONglobal(对于旧版网络或标准网络的区域)

如果使用旧版 VMware Engine 网络:请使用 gcloud services vpc-peerings enable-vpc-service-controls 命令对 VPC 网络和 VMware Engine 之间的 VPC 对等互连连接启用 VPC Service Controls

gcloud services vpc-peerings enable-vpc-service-controls \
   --network=VPC_NETWORK \
   --service=servicenetworking.googleapis.com

API

curl -X PATCH -H "Authorization: Bearer TOKEN"  -H "Content-Type: application/json; charset=utf-8" https://vmwareengine.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/networkPolicies/NETWORK_POLICY_NAME?updateMask=internetAccess.enabled,externalIp.enabled

"{
  "internetAccess: {
    "enabled": false
   },
  "externalIp: {
    "enabled": false
   }
}"

如果使用旧版 VMware Engine 网络:请使用 gcloud services vpc-peerings enable-vpc-service-controls 命令对 VPC 网络和 VMware Engine 之间的 VPC 对等互连连接启用 VPC Service Controls

gcloud services vpc-peerings enable-vpc-service-controls \
   --network=VPC_NETWORK_NAME \
   --service=servicenetworking.googleapis.com

Python

将 internet_accessinternet_access 和 external_ipinternet_access 设置为 False

from google.api_core import operation
from google.cloud import vmwareengine_v1

def update_network_policy(
    project_id: str, region: str, internet_access: bool, external_ip: bool
) -> operation.Operation:
    """
    Updates a network policy in a given network.

    Args:
        project_id: name of the project you want to use.
        region: name of the region you want to use. I.e. "us-central1".
        internet_access: should internet access be allowed.
        external_ip: should external IP addresses be assigned.

    Returns:
        An operation object representing the started operation. You can call its .result() method to wait for
        it to finish.
    """

    client = vmwareengine_v1.VmwareEngineClient()
    request = vmwareengine_v1.UpdateNetworkPolicyRequest()
    request.update_mask = "internetAccess.enabled,externalIp.enabled"
    network_policy = vmwareengine_v1.NetworkPolicy()
    network_policy.name = (
        f"projects/{project_id}/locations/{region}/networkPolicies/{region}-default"
    )
    network_policy.vmware_engine_network = f"projects/{project_id}/locations/{region}/vmwareEngineNetworks/{region}-default"
    network_policy.internet_access.enabled = internet_access
    network_policy.external_ip.enabled = external_ip

    request.network_policy = network_policy

    return client.update_network_policy(request)

如果使用旧版 VMware Engine 网络:请使用 gcloud services vpc-peerings enable-vpc-service-controls 命令对 VPC 网络和 VMware Engine 之间的 VPC 对等互连连接启用 VPC Service Controls

gcloud services vpc-peerings enable-vpc-service-controls \
   --network=VPC_NETWORK \
   --service=servicenetworking.googleapis.com

启用 VPC Service Controls 对于通过项目中的本地连接或 VPC 路由互联网流量至关重要。

启用 VPC Service Controls 后,Google Cloud 会在服务提供方 VPC 网络(在本例中,服务租户项目与 VMware Engine 建立对等互连)中进行以下路由更改:

  • 移除 IPv4 默认路由(目标 0.0.0.0/0,下一个跃点默认互联网网关)。
  • 开始使用 VPC 对等互连默认路由转发互联网流量。

示例:

如需为当前项目中名为“my-network”的网络对等互连对等互连启用 VPC Service Controls,请使用 gcloud services vpc-peerings enable-vpc-service-controls 命令:

gcloud services vpc-peerings enable-vpc-service-controls \
    --network=my-network \
    --service=servicenetworking.googleapis.com

停用“通过本地连接路由互联网流量”功能

如需禁止通过本地连接路由来自工作负载虚拟机的互联网流量,请停止通告默认路由 (0.0.0.0/0),并在 VPC 对等互连连接上停用 VPC Service Controls。

如果使用旧版 VMware Engine 网络:对 VPC 网络和 VMware Engine 之间的 VPC 对等互连连接停用 VPC Service Controls,请使用 gcloud services vpc-peerings disable-vpc-service-controls 命令:

gcloud services vpc-peerings disable-vpc-service-controls \
    --network=VPC_NETWORK_NAME \
    --service=servicenetworking.googleapis.com

后续步骤