示例:Cloud SQL 实例的专用连接

本页面通过示例说明了如何使用 Private Service Connect (PSC) 在启用了专用服务访问通道 (PSA) 的 Cloud SQL 实例与 Integration Connectors 运行时之间建立连接。您的 Cloud SQL 实例可以是以下任何类型:

注意事项

创建 PSC 服务连接时,请考虑以下要点:

  • PSC 服务连接和负载均衡器是在同一 VPC 内的不同子网中创建的。具体来说,服务连接始终在 NAT 子网中创建。
  • SOCKS5 代理服务器必须绑定到 0.0.0.0:<port> IP 地址,因为对于来自负载均衡器和健康检查探测的传入流量,必须绑定此 IP 地址。如需了解详情,请参阅健康检查
  • 来自负载均衡器和健康检查探测的流量应发送到同一端口。
  • 配置防火墙规则以便流量通过。

    入站流量规则

    • 来自 PSC 服务连接子网的流量应到达 ILB 的子网。
    • 在 ILB 的子网内,ILB 应该能够将流量发送到 SOCKS5 代理服务器。
    • 健康检查探测应该能够访问 SOCKS5 代理服务器。Google Cloud 健康检查探测具有固定的 IP 范围 (35.191.0.0/16, 130.211.0.0/22)。因此,系统允许这些 IP 将流量发送到 SOCKS 代理服务器。

    出站规则

    除非配置了特定的拒绝规则,否则在 Google Cloud 项目中,出站流量默认处于启用状态。

  • 所有 Google Cloud 组件(如 PSC 服务连接和负载均衡器)都应位于同一区域。
  • 您的后端系统不应对公共网络开放,因为这可能会给您带来安全问题。但是,请确保您的 SOCKS5 代理服务器在以下情况下接受流量:
    • 直通式负载平衡器 (L4 TCP/UDP ILB) :来自 PSC 服务连接的 NAT IP 的请求应该能够到达您的 SOCKS5 代理服务器。这些 NAT IP 是自动生成的。因此,您必须允许服务连接所在的整个 NAT 子网 IP 范围。如需了解详情,请参阅 Private Service Connect 子网
    • 基于代理/HTTP(s) 的负载均衡器(L4 代理 ILB、L7 ILB): 所有新请求均来自负载均衡器。因此,您的 SOCKS5 代理服务器应接受来自您的 VPC 网络代理子网的请求。如需了解详情,请参阅基于 Envoy 的负载平衡器的代理专用子网

为 Cloud SQL 实例设置 PSC

Integration Connectors 使用 Cloud SQL Auth 代理连接到 Cloud SQL 实例。Cloud SQL Auth 代理支持通过 SOCKS5 代理进行链接,这允许您将加密流量从 Cloud SQL Auth 代理转发到目标 Cloud SQL 实例。 因此,您需要使用 SOCKS5 代理服务器才能连接到私有 Cloud SQL 实例。

示例插图

下图显示了为示例 Cloud SQL 实例设置配置 PSC 服务连接后您的 Google Cloud 项目将如何呈现。

示例插图

在此示例中,SOCKS5 代理服务器通过服务连接公开,以便 PSC 可以安全地连接到 Cloud SQL 实例。SOCKS 代理服务器可以通过 专用服务访问通道访问 Cloud SQL 实例。SOCKS5 代理服务器位于非托管式 Compute Engine 实例组中,您可以根据预期的入站流量确定代理实例的数量。

示例中的流量如何流动?

  1. Integration Connectors 向服务连接发送请求。
  2. 服务连接将请求转发给 L4 ILB。
  3. L4 ILB 向 SOCKS5 代理服务器发送请求。

    ILB 具有转发规则并执行端口转发。默认情况下,SOCKS5 代理会监听 1080 端口。 但是,如果 SOCKS5 代理服务器在监听其他端口,则必须打开该端口以监听 ILB。

  4. SOCKS5 代理服务器将请求转发到 Cloud SQL 实例。

准备工作

在为示例场景创建 PSC 服务连接之前,请执行以下任务:

  • 安装 gcloud CLI
  • 为您的 Google Cloud 项目启用 Compute Engine APIService Networking API
  • 为简化 CLI 命令,您可以使用以下命令设置 PROJECT_ID、REGION 和 ZONE 的值:
    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
  • 对于本教程中的命令,请将 BACKEND_SERVER_PORT 替换为 1080,这是运行 SOCKS5 代理服务器的默认端口。
  • 建议创建新的 VPC 网络,并在尝试此示例场景时使用。测试场景后,您可以删除 VPC 网络和其他资源。
  • 您已至少创建了一个连接。连接可以是任何类型。建立现有连接后,您就可以从 Integration Connectors 运行时中提取服务目录的项目 ID。创建 PSC 服务连接时必须提供此项目 ID。

创建 PSC 服务连接

如需为示例场景创建 PSC 服务连接,请执行以下操作:

  1. 创建 VPC 网络和所需的子网
    1. 创建 VPC 网络。
      gcloud compute networks create VPC_NETWORK \
      --project=PROJECT_ID --subnet-mode=custom --mtu=1460 \
      --bgp-routing-mode=regional
    2. 添加 subnet-1。
      gcloud compute networks subnets create SUBNET_NAME_1 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_1 \
      --purpose=PRIVATE_SERVICE_CONNECT

      此命令会创建 Subnet-1 作为 NAT 子网,该子网将专门用于托管 PSC 服务连接。您无法在此 NAT 子网中托管任何其他服务。

    3. 添加 subnet-2。
      gcloud compute networks subnets create SUBNET_NAME_2 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_2
  2. 创建专用 Cloud SQL 实例。
    1. 配置专用服务访问通道
      1. 分配 IP 地址范围。
        gcloud compute addresses create google-managed-services-VPC_NETWORK \
        --global --purpose=VPC_PEERING --prefix-length=16 \
        --network=projects/PROJECT_ID/global/networks/VPC_NETWORK
        
      2. 创建专用连接。
        gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=google-managed-services-VPC_NETWORK \
        --network=VPC_NETWORK \
        --project=PROJECT_ID
        
    2. 创建使用专用 IP 的 Cloud SQL 实例
      gcloud beta sql instances create \
      INSTANCE_NAME \
      --database-version=DATABASE_VERSION \
      --cpu=NUMBER_OF_CPUs \
      --memory=MEMORY \
      --zone=ZONE \
      --root-password=ROOT_PASSWORD \
      --network=projects/PROJECT_ID/global/networks/VPC_NETWORK \
      --no-assign-ip \
      --allocated-ip-range-name=google-managed-services-VPC_NETWORK
      

      根据要创建的实例类型指定 DATABASE_VERSION。您可以创建 MySQL、PostgreSQL 或 SQL Server 类型的实例。如需查看所有受支持的数据库版本的列表,请参阅 SQL 数据库版本

      此命令会为您的 Cloud SQL 实例创建一个默认用户。以下是系统将为各种 Cloud SQL * 实例创建的默认用户:

      • Cloud SQL for MySQL - root
      • Cloud SQL for SQL Server - sqlserver
      • Cloud SQL for PostgreSQL - postgres
    3. (可选)如果您不想使用默认用户,请为新创建的 Cloud SQL 实例创建一个新用户。
      gcloud sql users create USER --host=% --instance=INSTANCE_NAME \
      --password=PASSWORD
      

      确保该用户具有访问您将在下一步中创建的数据库所需的所有必要权限。

    4. 在新创建的 Cloud SQL 实例中创建数据库。
      gcloud sql databases create DATABASE_NAME \
      --instance=INSTANCE_NAME
      
  3. 配置 Cloud NAT
    1. 创建一个简单的路由器。
      gcloud compute routers create NAT_ROUTER_NAME \
          --network=VPC_NETWORK
      
    2. 配置网络地址转换。
      gcloud compute routers nats create NAT_GATEWAY_NAME \
          --router=NAT_ROUTER_NAME \
          --auto-allocate-nat-external-ips \
          --nat-all-subnet-ip-ranges
      
  4. 创建用于运行 SOCKS5 代理服务器的 Compute Engine 虚拟机实例
    1. 创建代理实例 1。
      gcloud compute instances create PROXY_INSTANCE_1 \
      --project=PROJECT_ID \
      --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address
      

    您可以根据需要创建任意数量的虚拟机实例。

  5. 创建防火墙规则以允许 SSH 连接到您的虚拟机实例。
    gcloud compute firewall-rules create FIREWALL_RULE_NAME_SSH \
    --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
    
  6. 安装 SOCKS5 代理。

    安装和配置 SOCKS5 代理服务器的详细步骤不在本文档的讨论范围之内,您可以自行安装任何 SOCKS5 代理。以下步骤显示了如何安装和配置 Dante SOCKS5 代理服务器。

    1. 通过 SSH 连接到您的虚拟机实例。
      gcloud compute ssh \
          --tunnel-through-iap \
          PROXY_INSTANCE_1
      
    2. 安装 Dante SOCKS5 代理服务器。
      sudo apt update
      sudo apt install dante-server
    3. 检查服务器接口。
      sudo ip a
    4. 创建 Dante 配置的备份。
      sudo mv /etc/danted.conf /etc/danted.conf.bak
    5. 创建新的 Dante 配置文件。
      sudo nano /etc/danted.conf
    6. 将以下配置复制到配置文件中:
      logoutput: /var/log/socks.log
      # Bind the server to the 0.0.0.0 IP address to allow traffic
      # traffic from the load balancer and the health check probes.
      internal: 0.0.0.0 port = 1080
      external: ens4
      clientmethod: none
      socksmethod: none
      user.privileged: root
      user.notprivileged: nobody
      client pass {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: error connect disconnect
      }
      client block {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: connect error
      }
      socks pass {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: error connect disconnect
      }
      socks block {
              from: 0.0.0.0/0 to: 0.0.0.0/0
              log: connect error
      }
    7. 重启 Dante 服务器并检查状态。
      sudo systemctl restart danted
      sudo systemctl status danted
    8. 退出虚拟机实例。
      exit
  7. 设置非代管式实例组
    1. 创建非代管式实例组。
      gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
    2. 将第 3 步中创建的虚拟机实例添加到组中。
      gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME \
      --instances=PROXY_INSTANCE_1
  8. 创建健康检查探测并允许来自该探测的流量。
    1. 创建健康检查探测。
      gcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --port BACKEND_SERVER_PORT --region=REGION

      在此命令中,将 BACKEND_SERVER_PORT 设置为 1080,这是运行 SOCKS5 代理服务器的默认端口。

    2. 创建防火墙规则以允许来自探测的流量。
      gcloud compute firewall-rules create FIREWALL_RULE_NAME_HEALTHCHECK \
      --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT \
      --source-ranges=35.191.0.0/16,130.211.0.0/22
  9. 创建 L4 内部负载均衡器,并允许来自负载均衡器的流量。
    1. 创建后端服务
      gcloud compute backend-services create BACKEND_SERVICE \
      --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME \
      --health-checks-region=REGION 
    2. 将实例组添加到后端服务。
      gcloud compute backend-services add-backend BACKEND_SERVICE \
      --instance-group=INSTANCE_GROUP_NAME \
      --instance-group-zone=ZONE
    3. 创建转发规则
      gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
      --load-balancing-scheme=internal --network=VPC_NETWORK --subnet=SUBNET_NAME_2 \
      --ip-protocol=TCP --ports=BACKEND_SERVER_PORT --backend-service=BACKEND_SERVICE \
      --backend-service-region=REGION
    4. 创建防火墙规则以允许内部流量从负载平衡器流向实例组。
      gcloud compute firewall-rules create FIREWALL_RULE_NAME_INTERNAL \
      --direction=INGRESS --priority=1000 --network=VPC_NETWORK \
      --action=ALLOW --rules=all --source-ranges=SUBNET_RANGE_2
  10. 创建 PSC 服务连接
    1. 创建防火墙规则,以允许流量从 PSC 服务连接流向上一步中创建的内部负载均衡器。
      gcloud compute firewall-rules create FIREWALL_RULE_NAME_SA \
      --direction=INGRESS --priority=1000 --network=VPC_NETWORK \
      --allow=tcp:BACKEND_SERVER_PORT --source-ranges=SUBNET_RANGE_1
    2. 创建具有明确批准的服务连接。
      gcloud compute service-attachments create SERVICE_ATTACHMENT_NAME \
      --producer-forwarding-rule=FORWARDING_RULE_NAME  \
      --connection-preference=ACCEPT_MANUAL \
      --consumer-accept-list=SERVICE_DIRECTORY_PROJECT_ID=LIMIT \
      --nat-subnets=SUBNET_NAME_1

      在此命令中,LIMIT 是项目的连接限制。连接限制是可以连接到此服务的使用方 Private Service Connect 端点的数量。如需了解如何获取 SERVICE_DIRECTORY_PROJECT_ID,请参阅获取服务目录的项目 ID

  11. 创建端点连接。

    您可以将端点连接视为 PSC 服务连接的接口。您不能直接使用 PSC 服务连接来配置专用连接。PSC 服务连接只能通过端点连接访问。您可以创建 IP 地址或主机名作为端点连接。创建端点连接后,您可以在为专用连接配置连接器时使用它。如需了解详情,请参阅创建端点连接

  12. 验证 PSC 设置。

    您可以按照本教程中所示,通过创建 Cloud SQL 连接并设置 SOCKS5 代理服务器来验证专用连接。如需了解创建连接的详细步骤,请参阅特定的连接器文档(Cloud SQL for MySQLCloud SQL for PostgreSQLCloud SQL for SQL Server)。创建连接时,在 Destinations 部分(第 5 步)中,选择 Host address 作为 Destination type,然后输入端点连接的 IP 地址或主机名以获取 SOCKS5 代理服务器详细信息。请将端口值设置为 1080,除非您为 SOCKS5 代理服务器配置了其他端口。如果连接创建成功,在 Cloud 控制台“连接”页面中,新创建的连接的状态将为 Active

获取服务目录的项目 ID

最佳实践是,您可以创建 PSC 服务连接,使其仅接受来自指定 Google Cloud 项目的请求。但是,要执行此操作,您需要与 Google Cloud 项目关联的服务目录的项目 ID。如需获取服务目录的项目 ID,您可以使用 List Connections API,如以下示例所示。

语法

curl -X GET \
    -H "authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://connectors.googleapis.com/v1/projects/CONNECTORS_PROJECT_ID/locations/-/connections"

请替换以下内容:

  • CONNECTORS_PROJECT_ID:您在其中创建了连接的 Google Cloud 项目的 ID。

示例

此示例会获取 connectors-test Google Cloud 项目的服务目录的项目 ID。

curl -X GET \
    -H "authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://connectors.googleapis.com/v1/projects/connectors-test/locations/-/connections"

在终端上运行此命令会显示类似于以下内容的输出:

.....
{
  "connections": [
    {
      "name": "projects/connectors-test/locations/asia-northeast1/connections/big-query-iam-invalid-sa",
      "createTime": "2022-10-07T09:02:31.905048520Z",
      "updateTime": "2022-10-07T09:22:39.993778690Z",
      "connectorVersion": "projects/connectors-test/locations/global/providers/gcp/connectors/bigquery/versions/1",
      "status": {
        "state": "ACTIVE"
      },
      "configVariables": [
        {
          "key": "project_id",
          "stringValue": "connectors-test"
        },
        {
          "key": "dataset_id",
          "stringValue": "testDataset"
        }
      ],
      "authConfig": {},
      "serviceAccount": "564332356444-compute@developer.gserviceaccount.com",
      "serviceDirectory": "projects/abcdefghijk-tp/locations/asia-northeast1/namespaces/connectors/services/runtime",
      "nodeConfig": {
        "minNodeCount": 2,
        "maxNodeCount": 50
      }
    },
....

在示例输出中,对于 connectors-test Google Cloud 项目,服务目录的项目 ID 为 abcdefghijk-tp