示例:Cloud SQL 实例的专用连接
本页面通过示例说明了如何使用私有 Service Connect (PSC) 来在您的 启用了专用服务访问通道 (PSA) 的 Cloud SQL 实例 和 Integration Connectors 运行时。您的 Cloud SQL 实例 以下任意一种类型:
注意事项
创建 PSC 服务连接时,请考虑以下要点:
- PSC 服务连接和负载均衡器是在不同的子网中创建的 同一 VPC 内的网络。具体而言,服务连接始终是在 NAT 子网中创建的。
- SOCKS5 代理服务器必须绑定到
0.0.0.0:<port>
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
集成连接器使用 Cloud SQL Auth 代理连接到 Cloud SQL 实例。Cloud SQL Auth 代理支持通过 SOCKS5 代理进行链接,这样您就可以将加密流量从 Cloud SQL Auth 代理转发到目标 Cloud SQL 实例。因此,您需要 SOCKS5 代理服务器才能连接到专用 Cloud SQL 实例。
下图显示了您的 Google Cloud 项目 已针对示例 Cloud SQL 实例设置配置了 PSC 服务连接。
在本例中,SOCKS5 代理服务器通过服务连接公开,因此, PSC 可以安全地连接到 Cloud SQL 实例。SOCKS 代理服务器可以访问 通过 专用服务访问通道。SOCKS5 代理服务器是不受管理 Compute Engine 实例组,您可以根据 预期入站流量
示例中的流量如何流动?
- 集成连接器向服务附件发送请求。
- 服务连接将请求转发到 L4 ILB。
- L4 ILB 向 SOCKS5 代理服务器发送请求。
ILB 具有转发规则,并执行端口转发。默认情况下,SOCKS5 代理会监听 1080 端口。 但是,如果 SOCKS5 代理服务器通过其他端口进行监听,则必须打开该端口 以及监听 ILB。
- SOCKS5 代理服务器会将请求转发到 Cloud SQL 实例。
准备工作
在为示例场景创建 PSC 服务连接之前,请完成以下任务:
- 安装 gcloud CLI。
- 为您的 Google Cloud 项目启用 Compute Engine API 和 Service Networking API。
- 为了使 CLI 命令更简洁,您可以设置
为 PROJECT_ID、REGION 和 ZONE 创建项目 ID:
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 网络 和其他资源。
- 您应该至少有一个已创建的现有关联。连接可以是 任何类型。有了现有连接,您就可以从集成连接器运行时提取服务目录的项目 ID。此项目 ID 创建 PSC 服务连接时需要用到。
创建 PSC 服务连接
如需为示例场景创建 PSC 服务连接,请执行以下任务:
- 创建 VPC 网络和所需的子网。
- 创建 VPC 网络。
gcloud compute networks create VPC_NETWORK \ --project=PROJECT_ID --subnet-mode=custom --mtu=1460 \ --bgp-routing-mode=regional
- 添加 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 子网中托管任何其他服务。 - 添加子网 2。
gcloud compute networks subnets create SUBNET_NAME_2 \ --network=VPC_NETWORK --range=SUBNET_RANGE_2
- 创建 VPC 网络。
- 创建一个专用 Cloud SQL 实例。
- 配置专用服务访问通道。
- 分配 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
- 创建专用连接。
gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=google-managed-services-VPC_NETWORK \ --network=VPC_NETWORK \ --project=PROJECT_ID
- 分配 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
- Cloud SQL for MySQL -
- (可选)如果您不想使用默认用户,请为新创建的 Cloud SQL 实例创建一个新用户。
gcloud sql users create USER --host=% --instance=INSTANCE_NAME \ --password=PASSWORD
确保该用户拥有访问您将在下一步中创建的数据库的所有必要权限。
- 在新创建的 Cloud SQL 实例中创建一个数据库。
gcloud sql databases create DATABASE_NAME \ --instance=INSTANCE_NAME
- 配置专用服务访问通道。
- 配置 Cloud NAT。
- 创建一个简单的路由器。
gcloud compute routers create NAT_ROUTER_NAME \ --network=VPC_NETWORK
- 配置网络地址转换。
gcloud compute routers nats create NAT_GATEWAY_NAME \ --router=NAT_ROUTER_NAME \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges
- 创建一个简单的路由器。
- 创建 Compute Engine 虚拟机实例,以运行 SOCKS5 代理服务器。
- 创建代理实例 1。
gcloud compute instances create PROXY_INSTANCE_1 \ --project=PROJECT_ID \ --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address
您可以根据需要创建任意数量的虚拟机实例。
- 创建代理实例 1。
- 创建一条防火墙规则,以允许通过 SSH 连接到您的虚拟机实例。
gcloud compute firewall-rules create FIREWALL_RULE_NAME_SSH \ --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
- 安装 SOCKS5 代理。
安装和配置 SOCKS5 代理服务器的详细步骤不在本文的讨论范围之内。 文档,您可以安装您选择的任何 SOCKS5 代理。以下步骤显示了 了解如何安装和配置 Dante SOCKS5 代理服务器。
- 通过 SSH 连接到虚拟机实例。
gcloud compute ssh \ --tunnel-through-iap \ PROXY_INSTANCE_1
- 安装 Dante SOCKS5 代理服务器。
sudo apt update sudo apt install dante-server
- 检查服务器接口。
sudo ip a
- 创建 Dante 配置的备份。
sudo mv /etc/danted.conf /etc/danted.conf.bak
- 创建新的 Dante 配置文件。
sudo nano /etc/danted.conf
- 将以下配置复制到配置文件中:
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 }
- 重启 Dante 服务器并检查状态。
sudo systemctl restart danted sudo systemctl status danted
- 退出虚拟机实例。
exit
- 通过 SSH 连接到虚拟机实例。
- 设置非代管实例组。
- 创建非托管实例组。
gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
- 将第 3 步中创建的虚拟机实例添加到该组中。
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME \ --instances=PROXY_INSTANCE_1
- 创建非托管实例组。
- 创建健康检查探测,并允许来自探测的流量。
- 创建健康检查探测。
gcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --port BACKEND_SERVER_PORT --region=REGION
在此命令中,将 BACKEND_SERVER_PORT 设置为 1080,这是 SOCKS5 代理服务器的默认端口。
- 创建防火墙规则以允许来自探测的流量。
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
- 创建健康检查探测。
- 创建 L4 内部负载均衡器,并允许来自该负载均衡器的流量。
- 创建后端服务。
gcloud compute backend-services create BACKEND_SERVICE \ --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME \ --health-checks-region=REGION
- 将实例组添加到后端服务。
gcloud compute backend-services add-backend BACKEND_SERVICE \ --instance-group=INSTANCE_GROUP_NAME \ --instance-group-zone=ZONE
- 创建转发规则。
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
-
创建防火墙规则以允许内部流量从负载平衡器流向实例组。
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
- 创建后端服务。
- 创建 PSC 服务连接。
- 创建防火墙规则,以允许流量从 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
- 创建需要明确批准的服务连接。
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。
- 创建防火墙规则,以允许流量从 PSC 服务连接传输到在上一步中创建的内部负载均衡器。
- 创建端点连接。
您可以将端点连接视为 PSC 服务连接的接口。您无法直接使用 PSC 服务附件来配置专用连接。PSC 服务连接只能通过端点连接访问。您可以将端点附件创建为 IP 地址或主机名。创建端点连接后,您可以在配置专用连接的连接器时使用该连接。如需了解详情,请参阅 创建端点连接。
- 验证 PSC 设置。
您可以通过创建 Cloud SQL 连接并设置 SOCKS5 代理服务器(如本教程中所示)来验证专用连接。如需了解创建连接的详细步骤,请参阅特定(Cloud SQL for MySQL、Cloud SQL for PostgreSQL 或 Cloud SQL for SQL Server)连接器文档。 创建连接时,在
Destinations
部分(在第 5 步中)选择Destination type
作为Host address
,然后输入端点连接的 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
。