公共 IP 地址服务

公共(外部)IP 地址网络服务允许您从互联网连接到在您的私有云中运行的工作负载虚拟机 (VM)、管理设备或负载均衡器。例如,如果您在工作负载虚拟机上运行网络服务器,则可以通过互联网使用公共 IP 地址处理网络流量。默认情况下,公共 IP 网络服务处于停用状态。

为资源分配公共 IP 地址还具有以下优势:

  • 分布式拒绝服务(DDoS)攻击防护。系统会自动为公共 IP 地址启用此保护。
  • 始终开启流量监控,并实时缓解常见的网络等级攻击。
  • 在整个网络范围内保护和缓解攻击。该网络可用于跨区域分配和缓解攻击流量。

行为

一个公共 IP 地址只能分配给一个专用 IP 地址,并且该公共 IP 地址将专用于专用 IP 地址,除非您取消分配该地址。与公共 IP 地址关联的资源始终使用公共 IP 地址进行互联网访问。您最多可以为连接到 VMware Engine 的主要 VPC 网络预留 100 个公共 IP 地址。

默认情况下,来自公共 IP 地址的传入流量会被拒绝,并且仅允许出站互联网访问。要允许入站流量,请为特定端口的公共 IP 地址创建防火墙规则

gcloud 和 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 上的代码示例

在一个区域中启用公共 IP 网络服务

您必须先在区域中启用公共 IP 网络服务,然后才能为工作负载虚拟机分配公共 IP 地址:

控制台

  1. 访问 VMware Engine 门户
  2. 转到网络 > 区域设置
  3. 在与关注区域对应的行中,选择修改。 如果摘要表格中未列出该区域,请点击添加区域以添加该区域。
  4. 公共 IP 服务切换为已启用
    • 如需启用公共 IP 服务,您还必须启用互联网访问网络服务
    • 您可以启用互联网访问服务,并停用公共 IP 服务。如果这样做,则无法使用点到站点 VPN 和公共 IP 分配。
  5. 边缘服务 CIDR 字段中,输入在访问 VMware Engine 公共 IP 网关时要使用的地址范围(/26 地址范围)。
  6. 点击提交

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

gcloud

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

gcloud vmware network-policies create NETWORK_POLICY_NAME \
    --vmware-engine-network NETWORK_NAME --edge-services-cidr IP_RANGE \
    --location REGION --external-ip-access --internet-access

请替换以下内容:

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

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/REGION/networkPolicies?networkPolicyId=NETWORK_POLICY_NAME -d '{
  "vmwareEngineNetwork":"projects/PROJECT_ID/locations/REGION/vmwareEngineNetworks/NETWORK_NAME",
  "edgeServiceCidr":IP_RANGE,
  "internetAccess: {
    "enabled": true
   },
   "externalIp": {
     "enabled": true
   }
 }

请替换以下内容:

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

Python

使用以下函数在将 external_ip 和 internet_access 设置为 True 的情况下创建新的网络政策:

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)

分配公共 IP 地址

如需为工作负载虚拟机分配公共 IP 地址,请执行以下操作:

  1. 访问 Google Cloud VMware Engine 门户
  2. 转到网络 > 公共 IP (Public IPs)。
  3. 点击分配
  4. 名称字段中,输入一个名称,以便标识公共 IP 地址条目。
  5. 选择包含工作负载虚拟机的私有云
  6. 选择您要在其中提供已分配的公共 IP 的位置
  7. 关联的本地地址 (Attached local address) 字段中,输入要为其分配此公共 IP 地址的虚拟机的本地 IP 地址。
  8. 点击提交,开始分配公共 IP 地址的任务。

您可以在 活动 > 任务页面上查看任务的状态。分配完成后,新条目会显示在公共 IP (Public IPs) 页面上,且处于操作状态。