Beispiel: Private Verbindung für eine Cloud SQL-Instanz

Auf dieser Seite wird anhand eines Beispiels erläutert, wie Sie mit Private Service Connect (PSC) eine Verbindung zwischen Ihrer Cloud SQL-Instanz mit aktiviertem Private Service Access (PSA) und der Integration Connectors-Laufzeit herstellen. Ihre Cloud SQL-Instanz kann einen der folgenden Typen haben:

Hinweise

Beachten Sie beim Erstellen eines PSC-Dienstanhangs die folgenden wichtigen Punkte:

  • Der PSC-Dienstanhang und der Load-Balancer werden in verschiedenen Subnetzen innerhalb derselben VPC erstellt. Insbesondere wird der Dienstanhang immer in einem NAT-Subnetz erstellt.
  • SOCKS5-Proxyserver müssen an die IP-Adresse 0.0.0.0:<port> gebunden sein, da dies für eingehenden Traffic vom Load-Balancer und den Systemdiagnoseprüfungen erforderlich ist. Weitere Informationen finden Sie unter Systemdiagnose.
  • Traffic vom Load-Balancer und der Systemdiagnoseprüfung sollte an denselben Port gesendet werden.
  • Konfigurieren Sie die Firewallregeln, um den Trafficfluss zu erleichtern.

    Regeln für eingehenden Traffic

    • Traffic aus dem Subnetz des PSC-Dienstanhangs sollte das Subnetz des ILB erreichen.
    • Innerhalb des Subnetzes des internen Load-Balancers sollte dieser Traffic an die SOCKS5-Proxyserver senden können.
    • Die Systemdiagnoseprüfung sollte auf die SOCKS5-Proxyserver zugreifen können. Die Google Cloud-Systemdiagnoseprüfungen haben einen festen IP-Bereich (35.191.0.0/16, 130.211.0.0/22). Daher können diese IP-Adressen Traffic an die SOCKS-Proxyserver senden.

    Regeln für ausgehenden Traffic

    Ausgehender Traffic ist in einem Google Cloud-Projekt standardmäßig aktiviert, sofern keine bestimmten Ablehnungsregeln konfiguriert sind.

  • Alle Google Cloud-Komponenten wie der PSC-Dienstanhang und der Load-Balancer sollten sich in derselben Region befinden.
  • Ihr Backend-System sollte nicht für das öffentliche Netzwerk zugänglich sein, da dies ein Sicherheitsproblem darstellen kann. In den folgenden Fällen müssen die SOCKS5-Proxyserver jedoch Traffic akzeptieren:
    • Passthrough-Load-Balancer (L4-TCP/UDP-ILB): Anfragen von den NAT-IP-Adressen des PSC-Dienstanhangs sollten Ihre SOCKS5-Proxyserver erreichen können. Diese NAT-IP-Adressen werden automatisch generiert. Daher müssen Sie den gesamten IP-Bereich des NAT-Subnetzes zulassen, in dem sich Ihr Dienstanhang befindet. Weitere Informationen finden Sie unter Private Service Connect-Subnetze.
    • Proxybasierte/HTTP(s)-Load-Balancer (L4-Proxy-ILB, L7-ILB): Alle neuen Anfragen stammen vom Load-Balancer. Daher sollten Ihre SOCKS5-Proxyserver Anfragen vom Proxy-Subnetz Ihres VPC-Netzwerk akzeptieren. Weitere Informationen finden Sie unter Nur-Proxy-Subnetze für Envoy-basierte Load-Balancer.

PSC für eine Cloud SQL-Instanz einrichten

Integration Connectors verwendet den Cloud SQL Auth-Proxy, um eine Verbindung zu einer Cloud SQL-Instanz herzustellen. Der Cloud SQL Auth-Proxy unterstützt die Verkettung über einen SOCKS5-Proxy, mit dem Sie verschlüsselten Traffic vom Cloud SQL Auth-Proxy an die Cloud SQL-Zielinstanz weiterleiten können. Daher benötigen Sie SOCKS5-Proxyserver, um eine Verbindung zu einer privaten Cloud SQL-Instanz herzustellen.

Beispielillustration

Das folgende Diagramm zeigt, wie Ihr Google Cloud-Projekt aussieht, nachdem der PSC-Dienstanhang für eine beispielhafte Cloud SQL-Instanzeinrichtung konfiguriert wurde.

Beispielillustration

In diesem Beispiel werden SOCKS5-Proxyserver über einen Dienstanhang verfügbar gemacht, damit PSC eine sichere Verbindung zu einer Cloud SQL-Instanz herstellen kann. Die SOCKS-Proxyserver haben über den privaten Dienstzugriff Zugriff auf eine Cloud SQL-Instanz. Die SOCKS5-Proxyserver befinden sich in einer nicht verwalteten Compute Engine-Instanzgruppe und Sie können die Anzahl der Proxy-Instanzen anhand des erwarteten eingehenden Traffics festlegen.

Wie fließt der Traffic in dem Beispiel?

  1. Integration Connectors sendet eine Anfrage an einen Dienstanhang.
  2. Der Dienstanhang leitet die Anfrage an einen L4-ILB weiter.
  3. Der L4-ILB sendet eine Anfrage an die SOCKS5-Proxyserver.

    Der ILB verfügt über die Weiterleitungsregeln und führt eine Portweiterleitung durch. Standardmäßig überwacht ein SOCKS5-Proxy den Port 1080. Wenn die SOCKS5-Proxyserver jedoch einen anderen Port überwachen, muss dieser Port auch für die Überwachung des internen Load-Balancers geöffnet werden.

  4. Die SOCKS5-Proxyserver leiten die Anfrage an die Cloud SQL-Instanz weiter.

Hinweise

Führen Sie die folgenden Aufgaben aus, bevor Sie einen PSC-Dienstanhang für das Beispielszenario erstellen:

  • Installieren Sie die gcloud CLI.
  • Aktivieren Sie die Compute Engine API und die Service Networking API für Ihr Google Cloud-Projekt.
  • Um die Befehle über die Befehlszeile zu vereinfachen, können Sie die Werte für PROJECT_ID, REGION und ZONE mithilfe der folgenden Befehle festlegen:
    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
  • Ersetzen Sie für die Befehle in dieser Anleitung BACKEND_SERVER_PORT durch 1080. Dies ist der Standardport, auf dem ein SOCKS5-Proxyserver ausgeführt wird.
  • Es empfiehlt sich, ein neues VPC-Netzwerk zu erstellen und dieses für dieses Beispielszenario zu verwenden. Nachdem Sie das Szenario getestet haben, können Sie das VPC-Netzwerk und andere Ressourcen löschen.
  • Es sollte mindestens eine Verbindung vorhanden sein, die Sie erstellt haben. Die Verbindung kann einen beliebigen Typ haben. Wenn Sie eine Verbindung haben, können Sie die Projekt-ID des Dienstverzeichnisses aus der Integration Connectors-Laufzeit abrufen. Diese Projekt-ID wird zum Erstellen des PSC-Dienstanhangs benötigt.

PSC-Dienstanhang erstellen

Führen Sie die folgenden Aufgaben aus, um einen PSC-Dienstanhang für das Beispielszenario zu erstellen:

  1. Erstellen Sie ein VPC-Netzwerk und die erforderlichen Subnetze.
    1. VPC-Netzwerk erstellen.
      gcloud compute networks create VPC_NETWORK \
      --project=PROJECT_ID --subnet-mode=custom --mtu=1460 \
      --bgp-routing-mode=regional
    2. Fügen Sie Subnet-1 hinzu.
      gcloud compute networks subnets create SUBNET_NAME_1 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_1 \
      --purpose=PRIVATE_SERVICE_CONNECT

      Mit diesem Befehl wird Subnet-1 als NAT-Subnetz erstellt, das ausschließlich zum Hosten des PSC-Dienstanhangs verwendet wird. Sie können keinen anderen Dienst in diesem NAT-Subnetz hosten.

    3. Fügen Sie Subnet-2 hinzu.
      gcloud compute networks subnets create SUBNET_NAME_2 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_2
  2. Private Cloud SQL-Instanz erstellen
    1. Konfigurieren Sie den Zugriff auf private Dienste.
      1. Weisen Sie einen IP-Adressbereich zu.
        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. Erstellen Sie eine private Verbindung.
        gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=google-managed-services-VPC_NETWORK \
        --network=VPC_NETWORK \
        --project=PROJECT_ID
        
    2. Erstellen Sie eine Cloud SQL-Instanz mit einer privaten IP-Adresse.
      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
      

      Geben Sie den DATABASE_VERSION entsprechend dem Instanztyp an, den Sie erstellen möchten. Sie können eine Instanz des Typs MySQL, PostgreSQL oder SQL Server erstellen. Eine Liste aller unterstützten Datenbankversionen finden Sie unter SQL-Datenbankversion.

      Mit diesem Befehl wird ein Standardnutzer für die Cloud SQL-Instanz erstellt. Nachfolgend sind die Standardnutzer aufgeführt, die für die verschiedenen Cloud SQL *-Instanzen erstellt werden:

      • Cloud SQL for MySQL – root
      • Cloud SQL for SQL Server – sqlserver
      • Cloud SQL for PostgreSQL – postgres
    3. (Optional) Wenn Sie den Standardnutzer nicht verwenden möchten, erstellen Sie einen neuen Nutzer für die neu erstellte Cloud SQL-Instanz.
      gcloud sql users create USER --host=% --instance=INSTANCE_NAME \
      --password=PASSWORD
      

      Sorgen Sie dafür, dass der Nutzer alle erforderlichen Berechtigungen für den Zugriff auf die Datenbank hat, die Sie im nächsten Schritt erstellen.

    4. Erstellen Sie eine Datenbank in der neu erstellten Cloud SQL-Instanz.
      gcloud sql databases create DATABASE_NAME \
      --instance=INSTANCE_NAME
      
  3. Konfigurieren Sie Cloud NAT.
    1. Erstellen Sie einen einfachen Router.
      gcloud compute routers create NAT_ROUTER_NAME \
          --network=VPC_NETWORK
      
    2. Konfigurieren Sie die Netzwerkadressübersetzung.
      gcloud compute routers nats create NAT_GATEWAY_NAME \
          --router=NAT_ROUTER_NAME \
          --auto-allocate-nat-external-ips \
          --nat-all-subnet-ip-ranges
      
  4. Erstellen Sie Compute Engine-VM-Instanzen zum Ausführen von SOCKS5-Proxyservern.
    1. Erstellen Sie Proxy-Instanz 1.
      gcloud compute instances create PROXY_INSTANCE_1 \
      --project=PROJECT_ID \
      --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address
      

    Sie können je nach Anforderung beliebig viele VM-Instanzen erstellen.

  5. Erstellen Sie eine Firewallregel, die SSH-Verbindungen zu Ihren VM-Instanzen zulässt.
    gcloud compute firewall-rules create FIREWALL_RULE_NAME_SSH \
    --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
    
  6. Installieren Sie den SOCKS5-Proxy.

    Detaillierte Schritte zur Installation und Konfiguration eines SOCKS5-Proxyservers werden in diesem Dokument nicht behandelt. Sie können einen beliebigen SOCKS5-Proxy Ihrer Wahl installieren. Die folgenden Schritte zeigen, wie der Dante SOCKS5-Proxy-Server installiert und konfiguriert wird.

    1. Stellen Sie eine SSH-Verbindung zu Ihrer VM-Instanz her.
      gcloud compute ssh \
          --tunnel-through-iap \
          PROXY_INSTANCE_1
      
    2. Installieren Sie den Dante SOCKS5-Proxy-Server.
      sudo apt update
      sudo apt install dante-server
    3. Prüfen Sie die Serverschnittstelle.
      sudo ip a
    4. Erstellen Sie eine Sicherung der Dante-Konfiguration.
      sudo mv /etc/danted.conf /etc/danted.conf.bak
    5. Erstellen Sie eine neue Dante-Konfigurationsdatei.
      sudo nano /etc/danted.conf
    6. Kopieren Sie die folgende Konfiguration in die Konfigurationsdatei:
      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. Starten Sie den Dante-Server neu und prüfen Sie den Status.
      sudo systemctl restart danted
      sudo systemctl status danted
    8. Beenden Sie die VM-Instanz.
      exit
  7. Richten Sie eine nicht verwaltete Instanzgruppe ein.
    1. Nicht verwaltete Instanzgruppe erstellen
      gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
    2. Fügen Sie der Gruppe die in Schritt 3 erstellten VM-Instanzen hinzu.
      gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME \
      --instances=PROXY_INSTANCE_1
  8. Erstellen Sie eine Systemdiagnoseprüfung und lassen Sie den Traffic von der Prüfung zu.
    1. Erstellen Sie die Systemdiagnoseprüfung.
      gcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --port BACKEND_SERVER_PORT --region=REGION

      Legen Sie in diesem Befehl BACKEND_SERVER_PORT auf 1080 fest. Dies ist der Standardport für die SOCKS5-Proxyserver.

    2. Erstellen Sie eine Firewallregel, um Traffic von der Prüfung zuzulassen.
      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. Erstellen Sie einen internen L4-Load-Balancer und lassen Sie Traffic vom Load-Balancer zu.
    1. Erstellen Sie einen Back-End-Dienst.
      gcloud compute backend-services create BACKEND_SERVICE \
      --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME \
      --health-checks-region=REGION 
    2. Fügen Sie dem Back-End-Dienst eine Instanzgruppe hinzu.
      gcloud compute backend-services add-backend BACKEND_SERVICE \
      --instance-group=INSTANCE_GROUP_NAME \
      --instance-group-zone=ZONE
    3. Erstellen Sie eine Weiterleitungsregel.
      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. Erstellen Sie eine Firewallregel, um internen Traffic vom Load-Balancer zur Instanzgruppe zuzulassen.
      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. Erstellen Sie den PSC-Dienstanhang.
    1. Erstellen Sie eine Firewallregel, um Traffic vom PSC-Dienstanhang zum internen Load-Balancer zuzulassen, der im vorherigen Schritt erstellt wurde.
      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. Erstellen Sie einen Dienstanhang mit expliziter Genehmigung.
      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

      In diesem Befehl ist LIMIT das Verbindungslimit für das Projekt. Das Verbindungslimit ist die Anzahl der Private Service Connect-Nutzerendpunkte, die eine Verbindung zu diesem Dienst herstellen können. Informationen zum Abrufen der SERVICE_DIRECTORY_PROJECT_ID finden Sie unter Projekt-ID des Dienstverzeichnisses abrufen.

  11. Erstellen Sie einen Endpunktanhang.

    Stellen Sie sich den Endpunktanhang als eine Schnittstelle zum PSC-Dienstanhang vor. Sie können den PSC-Dienstanhang nicht direkt zum Konfigurieren privater Verbindungen verwenden. Der Zugriff auf den PSC-Dienstanhang ist nur über einen Endpunktanhang möglich. Außerdem können Sie den Endpunktanhang entweder als IP-Adresse oder als Hostnamen erstellen. Nachdem Sie den Endpunktanhang erstellt haben, können Sie ihn verwenden, wenn Sie einen Connector für private Verbindungen konfigurieren. Weitere Informationen finden Sie unter Endpunktanhang erstellen.

  12. Prüfen Sie die PSC-Einrichtung.

    Sie können die private Verbindung prüfen, indem Sie eine Cloud SQL-Verbindung erstellen und den SOCKS5-Proxyserver wie in dieser Anleitung beschrieben einrichten. Detaillierte Schritte zum Erstellen einer Verbindung finden Sie in der jeweiligen Connector-Dokumentation (Cloud SQL for MySQL, Cloud SQL for PostgreSQL oder Cloud SQL for SQL Server). Wählen Sie beim Erstellen der Verbindung im Abschnitt Destinations (in Schritt 5) den Destination type als Host address aus und geben Sie dann die IP-Adresse oder den Hostnamen des Endpunktanhangs für die SOCKS5-Proxyserverdetails ein. Legen Sie den Portwert auf 1080 fest, sofern Sie keinen anderen Port für den SOCKS5-Proxyserver konfiguriert haben. Wenn die Verbindung erfolgreich erstellt wurde, lautet der Status der neu erstellten Verbindung in der Cloud Console auf der Seite „Verbindungen“ Active.

Projekt-ID des Dienstverzeichnisses abrufen

Es hat sich bewährt, den PSC-Dienstanhang so zu erstellen, dass er nur Anfragen von den angegebenen Google Cloud-Projekten akzeptiert. Dazu benötigen Sie jedoch die Projekt-ID des Dienstverzeichnisses, das Ihrem Google Cloud-Projekt zugeordnet ist. Die Projekt-ID des Dienstverzeichnisses können Sie mit der List Connections API abrufen, wie im folgenden Beispiel gezeigt.

Syntax

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"

Ersetzen Sie Folgendes:

  • CONNECTORS_PROJECT_ID: Die ID Ihres Google Cloud-Projekts, in dem Sie die Verbindung erstellt haben.

Beispiel

In diesem Beispiel wird die Projekt-ID des Dienstverzeichnisses für das Google Cloud-Projekt connectors-test abgerufen.

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"

Wenn Sie diesen Befehl im Terminal ausführen, wird in etwa folgende Ausgabe angezeigt:

.....
{
  "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
      }
    },
....

In der Beispielausgabe lautet die Projekt-ID des Dienstverzeichnisses für das Google Cloud-Projekt connectors-test abcdefghijk-tp.