Exemplo: conectividade particular para uma instância do Cloud SQL

Nesta página, explicamos, usando um exemplo, como usar o Private Service Connect (PSC) para estabelecer uma conexão entre a instância do Cloud SQL com o Acesso a serviços privados (PSA, na sigla em inglês) ativado e o ambiente de execução dos Integration Connectors. Sua instância do Cloud SQL pode ser qualquer um dos seguintes tipos:

Considerações

Ao criar um anexo de serviço do PSC, considere os seguintes pontos principais:

  • O anexo de serviço do PSC e o balanceador de carga são criados em sub-redes diferentes na mesma VPC. Especificamente, o anexo de serviço é sempre criado em uma sub-rede NAT.
  • Os servidores proxy SOCKS5 devem ser vinculados ao endereço IP 0.0.0.0:<port> porque esse é necessário para o tráfego de entrada do balanceador de carga e as sondagens de verificação de integridade. Para mais informações, consulte Verificação de integridade.
  • O tráfego da sondagem do balanceador de carga e de verificação de integridade precisa ser enviado para a mesma porta.
  • Configurar as regras de firewall para facilitar o fluxo de tráfego.

    Regras de entrada

    • O tráfego da sub-rede do anexo de serviço do PSC deve alcançar a sub-rede do ILB.
    • Dentro da sub-rede do ILB, o ILB deve ser capaz de enviar tráfego para os servidores proxy SOCKS5.
    • A sondagem de verificação de integridade precisa acessar os servidores proxy SOCKS5. As sondagens de verificação de integridade do Google Cloud têm um intervalo de IP fixo (35.191.0.0/16, 130.211.0.0/22). Portanto, esses IPs podem ser permitidos para enviar tráfego aos servidores proxy SOCKS.

    Regras de saída

    O tráfego de saída é ativado por padrão em um projeto do Google Cloud, a menos que regras de negação específicas sejam configuradas.

  • Todos os componentes do Google Cloud, como o anexo de serviço do PSC e o balanceador de carga, precisam estar na mesma região.
  • Seu sistema de back-end não deve estar aberto à rede pública, já que isso pode ser um problema de segurança. No entanto, verifique se os servidores proxy SOCKS5 aceitam tráfego nos seguintes cenários:
    • Balanceadores de carga de passagem (ILB TCP/UDP L4): as solicitações dos IPs NAT do anexo do serviço PSC precisam alcançar os servidores proxy SOCKS5. Esses IPs NAT são gerados automaticamente. Portanto, é preciso permitir todo o intervalo de IP da sub-rede NAT está o anexo de serviço. Para mais informações, consulte Sub-redes do Private Service Connect.
    • Balanceadores de carga HTTP(S)/baseados em proxy (ILB L4 proxy, L7 ILB): todas as novas solicitações são originados do balanceador de carga. Portanto, seus servidores proxy SOCKS5 devem aceitar solicitações do sub-rede de proxy da sua rede VPC. Para mais informações, consulte Sub-redes somente proxy para balanceadores de carga baseados no Envoy.

Configurar o PSC para uma instância do Cloud SQL

O Integration Connectors usa o proxy do Cloud SQL Auth para se conectar a uma instância do Cloud SQL. O proxy de autenticação do Cloud SQL oferece suporte à vinculação por um proxy SOCKS5, que permite encaminhar o tráfego criptografado do proxy de autenticação do Cloud SQL para a instância de destino do Cloud SQL. Portanto, você precisa de servidores proxy SOCKS5 para se conectar a uma instância particular do Cloud SQL.

ilustração de amostra

O diagrama a seguir mostra como vai ficar seu projeto do Google Cloud após a O anexo de serviço do PSC está definido para um exemplo de configuração de uma instância do Cloud SQL.

ilustração de exemplo

Neste exemplo, os servidores proxy SOCKS5 são expostos por um anexo de serviço para que O PSC pode se conectar com segurança a uma instância do Cloud SQL. Os servidores proxy SOCKS têm acesso a uma instância do Cloud SQL pelo acesso a serviços particulares. Os servidores proxy SOCKS5 estão em um grupo de instâncias não gerenciado do Compute Engine, e você pode decidir o número de instâncias de proxy com base no tráfego de entrada esperado.

Como o tráfego flui no exemplo?

  1. O Integration Connectors envia uma solicitação para um anexo de serviço.
  2. O anexo de serviço encaminha a solicitação para um ILB de L4.
  3. O ILB L4 envia uma solicitação aos servidores proxy SOCKS5.

    O ILB tem as regras de encaminhamento e realiza o encaminhamento de portas. Por padrão, um proxy SOCKS5 detecta a porta 1080. No entanto, se os servidores proxy SOCKS5 detectarem em uma porta diferente, essa porta também precisará ser aberta para detecção no ILB.

  4. Os servidores proxy SOCKS5 encaminham a solicitação para a instância do Cloud SQL.

Antes de começar

Antes de criar um anexo de serviço do PSC para o cenário de exemplo, faça o seguinte:

  • Instale a CLI gcloud.
  • Ative a API Compute Engine e a API Service Networking no seu projeto do Google Cloud.
  • Para tornar os comandos da CLI menos detalhados, defina os valores de PROJECT_ID, REGION e ZONE usando os seguintes comandos:
    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
  • Para os comandos neste tutorial, substitua BACKEND_SERVER_PORT por 1080, que é a porta padrão em que um servidor proxy SOCKS5 é executado.
  • É recomendável criar uma nova rede VPC e usá-la ao tentar este cenário de exemplo. Depois de testar o cenário, é possível excluir a rede VPC e outros recursos.
  • É preciso que exista pelo menos uma conexão que você criou. A conexão pode ser de qualquer tipo. Ter uma conexão atual permite buscar o ID do projeto do diretório de serviços no ambiente de execução do Integration Connectors. Este ID do projeto é necessário para criar o anexo de serviço do PSC.

Criar um anexo de serviço do PSC

Para criar um anexo de serviço do PSC para o cenário de exemplo, siga estas etapas:

  1. Crie uma rede VPC e as sub-redes necessárias.
    1. Criar uma rede VPC.
      gcloud compute networks create VPC_NETWORK \
      --project=PROJECT_ID --subnet-mode=custom --mtu=1460 \
      --bgp-routing-mode=regional
    2. Adicione a sub-rede 1.
      gcloud compute networks subnets create SUBNET_NAME_1 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_1 \
      --purpose=PRIVATE_SERVICE_CONNECT

      Esse comando cria Subnet-1 como uma sub-rede NAT que será usada exclusivamente para hospedar o anexo de serviço do PSC. Não é possível hospedar nenhum outro serviço nessa sub-rede NAT.

    3. Adicione a Sub-rede-2.
      gcloud compute networks subnets create SUBNET_NAME_2 \
      --network=VPC_NETWORK --range=SUBNET_RANGE_2
  2. Criar uma instância particular do Cloud SQL.
    1. Configure o acesso a serviços particulares.
      1. Alocar um intervalo de endereços 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. Crie uma conexão particular.
        gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=google-managed-services-VPC_NETWORK \
        --network=VPC_NETWORK \
        --project=PROJECT_ID
    2. Crie uma instância do Cloud SQL com um IP privado.
      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

      Especifique o DATABASE_VERSION com base no tipo de instância que você quer criar. É possível criar um do tipo MySQL, PostgreSQL ou SQL Server. Para conferir a lista de todas as versões de banco de dados com suporte, consulte Versão do banco de dados SQL.

      Esse comando cria um usuário padrão para sua instância do Cloud SQL. A seguir estão os usuários padrão que será criado para as várias instâncias do Cloud SQL *:

      • Cloud SQL para MySQL: root
      • Cloud SQL para SQL Server: sqlserver
      • Cloud SQL para PostgreSQL: postgres
    3. Opcional: se você não quiser usar o usuário padrão, crie um novo usuário para a instância do Cloud SQL recém-criada.
      gcloud sql users create USER --host=% --instance=INSTANCE_NAME \
      --password=PASSWORD

      Verifique se o usuário tem todas as permissões necessárias para acessar o banco de dados que você vai criar na próxima etapa.

    4. Crie um banco de dados na instância do Cloud SQL recém-criada.
      gcloud sql databases create DATABASE_NAME \
      --instance=INSTANCE_NAME
  3. Configure o Cloud NAT.
    1. Criar um roteador simples.
      gcloud compute routers create NAT_ROUTER_NAME \
          --network=VPC_NETWORK
    2. Configurar a conversão de endereços de rede.
      gcloud compute routers nats create NAT_GATEWAY_NAME \
          --router=NAT_ROUTER_NAME \
          --auto-allocate-nat-external-ips \
          --nat-all-subnet-ip-ranges
  4. Criar instâncias de VM do Compute Engine para executar servidores proxy SOCKS5.
    1. Crie a instância de proxy 1.
      gcloud compute instances create PROXY_INSTANCE_1 \
      --project=PROJECT_ID \
      --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address

    Com base no requisito, é possível criar quantas instâncias de VM forem necessárias.

  5. Criar uma regra de firewall para permitir SSH nas instâncias de VM.
    gcloud compute firewall-rules create FIREWALL_RULE_NAME_SSH \
    --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
  6. Instalar o proxy SOCKS5.

    As etapas detalhadas para instalar e configurar um servidor proxy SOCKS5 estão fora do escopo deste documento. Você pode instalar qualquer proxy SOCKS5 de sua escolha. As etapas a seguir mostram como instalar e configurar o servidor proxy Dante SOCKS5.

    1. Acesse a instância de VM usando SSH.
      gcloud compute ssh \
          --tunnel-through-iap \
          PROXY_INSTANCE_1
    2. Instale o servidor proxy SOCKS5 Dante.
      sudo apt update
      sudo apt install dante-server
    3. Verifique a interface do servidor.
      sudo ip a
    4. Crie o backup da configuração do Dante.
      sudo mv /etc/danted.conf /etc/danted.conf.bak
    5. Crie um novo arquivo de configuração do Dante.
      sudo nano /etc/danted.conf
    6. Copie a seguinte configuração para o arquivo de configuração:
      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. Reinicie o servidor Dante e verifique o status.
      sudo systemctl restart danted
      sudo systemctl status danted
    8. Saia da instância da VM.
      exit
  7. Configure um grupo de instâncias não gerenciadas.
    1. Criar um grupo de instâncias não gerenciadas.
      gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
    2. Adicione as instâncias de VM criadas na etapa 3 ao grupo.
      gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME \
      --instances=PROXY_INSTANCE_1
  8. Crie uma verificação de integridade e permita o tráfego dela.
    1. Crie a sondagem de verificação de integridade.
      gcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --port BACKEND_SERVER_PORT --region=REGION

      Nesse comando, defina BACKEND_SERVER_PORT como 1080, que é a porta padrão em que os servidores proxy SOCKS5 são executados.

    2. Crie uma regra de firewall para permitir o tráfego da sonda.
      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. Crie um balanceador de carga interno L4 e permita o tráfego do balanceador de carga.
    1. Crie um serviço de back-end.
      gcloud compute backend-services create BACKEND_SERVICE \
      --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME \
      --health-checks-region=REGION 
    2. Adicione o grupo de instâncias ao serviço de back-end.
      gcloud compute backend-services add-backend BACKEND_SERVICE \
      --instance-group=INSTANCE_GROUP_NAME \
      --instance-group-zone=ZONE
    3. Crie uma regra de encaminhamento.
      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. Crie uma regra de firewall para permitir o tráfego interno do balanceador de carga para o grupo de instâncias.
      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. Crie o anexo de serviço do PSC.
    1. Crie uma regra de firewall para permitir o tráfego do anexo do serviço PSC para o balanceador de carga interno criado na etapa anterior.
      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. Criar anexo de serviço com aprovação explícita.
      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

      Nesse comando, LIMIT é o limite de conexões do projeto. O limite de conexão é o número de instâncias Endpoints do Private Service Connect que podem se conectar a este serviço. Para entender como conseguir o SERVICE_DIRECTORY_PROJECT_ID, consulte Conseguir o ID do projeto do diretório de serviços.

  11. Crie um anexo de endpoint.

    Pense no anexo de endpoint como uma interface para o anexo de serviço do PSC. Você não pode use o anexo de serviço do PSC diretamente para configurar a conectividade particular. O anexo do serviço PSC só podem ser acessados por um anexo de endpoint. E você pode criar o anexo do endpoint como um endereço IP ou um nome de host. Depois de criar o anexo de endpoint, você pode usá-lo ao configurar um conector para conectividade particular. Para mais informações, consulte Crie um anexo de endpoint.

  12. Verifique a configuração do PSC.

    É possível verificar a conectividade particular criando uma conexão do Cloud SQL e configurar o servidor proxy SOCKS5 como mostrado neste tutorial. Para conferir etapas detalhadas sobre como criar uma conexão, consulte a documentação específica do conector (Cloud SQL para MySQL, Cloud SQL para PostgreSQL ou Cloud SQL para SQL Server). Ao criar a conexão, na seção Destinations (na etapa 5), selecione Destination type como Host address e insira o endereço IP ou o nome do host do anexo de endpoint para os detalhes do servidor proxy SOCKS5. Defina o valor da porta como 1080, a menos que você configurou uma porta diferente para o servidor proxy SOCKS5. Se a criação da conexão for bem-sucedida, o status da conexão recém-criada será Active na página "Conexões" no console do Cloud.

Consiga o ID do projeto do diretório de serviços

Como prática recomendada, crie o anexo de serviço do PSC para que ele aceite solicitações apenas dos projetos do Google Cloud especificados. No entanto, para fazer isso, você precisa do ID do projeto do diretório de serviços associado ao seu projeto do Google Cloud. Para conferir o ID do projeto do diretório de serviços, use a API List Connections, conforme mostrado no exemplo abaixo.

Sintaxe

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"

Substitua:

  • CONNECTORS_PROJECT_ID: o ID do projeto do Google Cloud em que você criou a conexão.

Exemplo

Este exemplo recebe o ID do projeto do diretório de serviços do projeto connectors-test do Google Cloud.

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"

A execução desse comando no terminal vai mostrar uma resposta semelhante a esta:

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

Na amostra de saída, para o projeto connectors-test do Google Cloud, o ID do projeto do diretório de serviços é abcdefghijk-tp.