Interface do Private Service Connect

1. Introdução

A interface do Private Service Connect é um recurso que permite que uma rede de nuvem privada virtual (VPC) do produtor inicie conexões com vários destinos em uma rede VPC do consumidor. As redes de produtores e consumidores podem estar em diferentes projetos e organizações.

Se um anexo de rede aceitar uma conexão de uma interface do Private Service Connect, o Google Cloud alocará um endereço IP de uma sub-rede do consumidor especificado pelo anexo de rede. As redes de consumidores e produtores estão conectadas e podem se comunicar por endereços IP internos.

Uma conexão entre um anexo de rede e uma interface do Private Service Connect é semelhante à conexão entre um endpoint do Private Service Connect e um anexo de serviço, mas há duas diferenças importantes:

  • Um anexo de rede permite que uma rede produtora inicie conexões com uma rede consumidora (saída de serviço gerenciada), enquanto um endpoint permite que uma rede consumidora inicie conexões com uma rede produtora (entrada de serviço gerenciada).
  • Uma conexão de interface do Private Service Connect é transitiva. Isso significa que uma rede do produtor pode se comunicar com outras que estão conectadas à rede do consumidor.

O que você vai criar

Neste tutorial, você vai criar uma arquitetura de interface completa do Private Service Connect (PSC) que usa regras do Cloud Firewall para permitir e negar a conectividade do produtor para o computador do consumidor, conforme ilustrado na Figura 1.

Figura 1.

d39bf35e55bdf9e6.png

Você vai criar um único psc-network-attachment na VPC do consumidor, resultando nos seguintes casos de uso:

  1. Criar uma regra do Cloud Firewall para permitir o acesso de "bear" a "lion"
  2. Criar uma regra de Cloud Firewall para negar o acesso de "bear" a "tiger"
  3. Criar uma regra de Cloud Firewall para permitir o acesso de cosmo a bear

O que você vai aprender

  • Como criar um anexo de rede
  • Como um produtor pode usar um anexo de rede para criar uma interface PSC
  • Como estabelecer a comunicação do produtor com o consumidor
  • Como permitir o acesso da VM produtora (urso) à VM consumidora (leão)
  • Como bloquear o acesso da VM produtora (urso) à VM consumidora (tigre)
  • Como permitir o acesso da VM do consumidor (cosmo) à VM do produtor (bear)

O que é necessário

2. Antes de começar

Atualizar o projeto para oferecer suporte ao tutorial

Este tutorial usa $variables para ajudar na implementação da configuração do gcloud no Cloud Shell.

No Cloud Shell, faça o seguinte:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

3. Configuração do consumidor

Criar a VPC do consumidor

No Cloud Shell, faça o seguinte:

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

Criar as sub-redes do consumidor

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create lion-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create tiger-subnet-1 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create cosmo-subnet-1 --project=$projectid --range=192.168.40.0/28 --network=consumer-vpc --region=us-central1

Criar a sub-rede de anexo de rede do Private Service Connect

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1

Cloud Router e configuração NAT

O Cloud NAT é usado no tutorial para a instalação do pacote de software porque a instância de VM não tem um endereço IP público. O Cloud NAT permite que VMs com endereços IP particulares acessem a Internet.

No Cloud Shell, crie o roteador da nuvem.

gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1

No Cloud Shell, crie o gateway NAT.

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

4. Ativar o IAP

Para permitir que o IAP se conecte às suas instâncias de VM, crie uma regra de firewall que:

  • Aplica-se a todas as instâncias da VM que você quer que sejam acessíveis usando o IAP.
  • Permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Esse intervalo contém todos os endereços IP que o IAP usa para o encaminhamento de TCP.

No Cloud Shell, crie a regra de firewall do IAP.

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

5. Criar instâncias de VM do consumidor

No Cloud Shell, crie a instância de VM do consumidor, lion.

gcloud compute instances create lion \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=lion-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the lion app server !!' | tee /var/www/html/index.html
      EOF"

No Cloud Shell, crie a instância de VM do consumidor, tiger.

gcloud compute instances create tiger \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=tiger-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the tiger app server !!' | tee /var/www/html/index.html
      EOF"

No Cloud Shell, crie a instância de VM do consumidor, cosmo.

gcloud compute instances create cosmo \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=cosmo-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the cosmo app server !!' | tee /var/www/html/index.html
      EOF"

Consiga e armazene os endereços IP das instâncias:

No Cloud Shell, execute uma descrição das instâncias de VM "leão" e "tigre".

gcloud compute instances describe lion --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe tiger --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe cosmo --zone=us-central1-a | grep  networkIP:

6. Anexo de rede do Private Service Connect

Os anexos de rede são recursos regionais que representam o lado do consumidor de uma interface do Private Service Connect. Você associa uma única sub-rede a um anexo de rede, e o produtor atribui IPs à interface do Private Service Connect a partir dessa sub-rede. A sub-rede precisa estar na mesma região do anexo de rede. Um anexo de rede precisa estar na mesma região do serviço do produtor.

Criar o anexo de rede

No Cloud Shell, crie o anexo de rede.

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_MANUAL \
    --producer-accept-list=$projectid \
    --subnets=intf-subnet

Listar os anexos de rede

No Cloud Shell, liste o anexo de rede.

gcloud compute network-attachments list

Descrever os anexos de rede

No Cloud Shell, descreva o anexo de rede.

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

Anote o URI psc-network-attachment que será usado pelo produtor ao criar a interface do Private Service Connect. Veja um exemplo a seguir:

user@cloudshell$ gcloud compute network-attachments describe psc-network-attachment --region=us-central1 
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2023-06-06T20:57:12.623-07:00'
fingerprint: 4Yq6xAfaRO0=
id: '3235195049527328503'
kind: compute#networkAttachment
name: psc-network-attachment
network: https://www.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc
producerAcceptLists:
- $projectid
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/networkAttachments/psc-network-attachment
subnetworks:
- https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/subnetworks/intf-subnet

7. Configuração do produtor

Criar a rede VPC do produtor

No Cloud Shell, faça o seguinte:

gcloud compute networks create producer-vpc --project=$projectid --subnet-mode=custom

Criar as sub-redes do produtor

No Cloud Shell, crie a sub-rede usada para a vNIC0 da interface psc.

gcloud compute networks subnets create prod-subnet --project=$projectid --range=10.20.1.0/28 --network=producer-vpc --region=us-central1

8. Ativar o IAP

Para permitir que o IAP se conecte às suas instâncias de VM, crie uma regra de firewall que:

  • Aplica-se a todas as instâncias da VM que você quer que sejam acessíveis usando o IAP.
  • Permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Esse intervalo contém todos os endereços IP que o IAP usa para o encaminhamento de TCP.

No Cloud Shell, crie a regra de firewall do IAP.

gcloud compute firewall-rules create ssh-iap-producer \
    --network producer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

9. Criar a interface do Private Service Connect

A interface do Private Service Connect é um recurso que permite que uma rede de nuvem privada virtual (VPC) do produtor inicie conexões com vários destinos em uma rede VPC do consumidor. As redes de produtores e consumidores podem estar em diferentes projetos e organizações.

Se um anexo de rede aceitar uma conexão de uma interface do Private Service Connect, o Google Cloud alocará um endereço IP de uma sub-rede do consumidor especificado pelo anexo de rede. As redes de consumidores e produtores estão conectadas e podem se comunicar por endereços IP internos.

Na Cloud Shell, crie a interface do Private Service Connect (bear) e insira o URI psc-network-attachmentI identificado anteriormente na saída de descrição do anexo de rede.

gcloud compute instances create bear --zone us-central1-a --machine-type=f1-micro --can-ip-forward --network-interface subnet=prod-subnet,network=producer-vpc,no-address --network-interface network-attachment=https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/networkAttachments/psc-network-attachment

Validação de vários endereços IP

Valide se a interface PSC está configurada com o endereço IP adequado. A vNIC0 vai usar a sub-rede de produção do produtor (10.20.1.0/28), e a vNIC1 vai usar a sub-rede intf do consumidor (192.168.10.0/28).

gcloud compute instances describe bear --zone=us-central1-a | grep networkIP:

Exemplo:

user$ gcloud compute instances describe bear --zone=us-central1-a | grep networkIP:
  networkIP: 10.20.1.2
  networkIP: 192.168.10.2

10. Atualizar regras de firewall do consumidor

Criar uma regra de Cloud Firewall para permitir o acesso de "bear" a "lion"

No Cloud Shell, crie uma regra de prioridade mais alta que permita a saída do intervalo de endereços IP de attachment-subnet (intf-subnet) para destinos no intervalo de endereços de lion-subnet-1.

gcloud compute firewall-rules create allow-limited-egress-to-lion \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=EGRESS \
    --priority=1000 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="192.168.20.0/28" \
    --enable-logging

No Cloud Shell, crie uma regra de permissão de entrada que substitua a regra de permissão de entrada implícita para o tráfego da sub-rede psc-network-attachment.

gcloud compute firewall-rules create allow-ingress \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--enable-logging

Criar uma regra de Cloud Firewall para negar o acesso de "bear" a todos os intervalos (incluindo "tiger")

No Cloud Shell, crie uma regra de baixa prioridade que negue todo o tráfego de saída do intervalo de endereços IP da sub-rede do anexo de rede, intf-subnet.

gcloud compute firewall-rules create deny-all-egress \
    --network=consumer-vpc \
    --action=DENY \
    --rules=ALL \
    --direction=EGRESS \
    --priority=65534 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="0.0.0.0/0" \
    --enable-logging

Crie uma regra de firewall do Cloud para permitir o acesso de cosmo a bear

No Cloud Shell, crie uma regra de permissão de entrada que substitua a regra de permissão de entrada implícita para o tráfego da sub-rede psc-network-attachment.

gcloud compute firewall-rules create vm-subnet-allow-ingress \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=INGRESS \
    --priority=1000 \
    --source-ranges="192.168.40.0/28" \
    --destination-ranges="192.168.10.0/28" \
    --enable-logging

11. Criar rotas do Linux para a interface PSC

Na instância da interface do PSC, configure as rotas do Linux para permitir a comunicação do produtor com as sub-redes do consumidor.

Encontrar o nome do SO convidado da interface do Private Service Connect

Para configurar o roteamento, você precisa saber o nome do SO convidado da interface do Private Service Connect, que é diferente do nome da interface no Google Cloud.

No Cloud Shell, abra uma nova guia e faça o seguinte:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

Faça login na VM psc-interface, bear, usando o IAP no Cloud Shell.

gcloud compute ssh bear --project=$projectid --zone=us-central1-a --tunnel-through-iap

No Cloud Shell, obtenha o endereço IP da instância psc-interface.

ip a

Exemplo:

user@bear:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:0a:14:01:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.20.1.2/32 brd 10.20.1.2 scope global dynamic ens4
       valid_lft 85991sec preferred_lft 85991sec
    inet6 fe80::4001:aff:fe14:102/64 scope link 
       valid_lft forever preferred_lft forever
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:c0:a8:0a:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    inet 192.168.10.2/32 brd 192.168.10.2 scope global dynamic ens5
       valid_lft 85991sec preferred_lft 85991sec
    inet6 fe80::4001:c0ff:fea8:a02/64 scope link 
       valid_lft forever preferred_lft forever

Encontrar o IP do gateway da interface do PSC

Na lista de interfaces de rede, encontre e armazene o nome da interface associada ao endereço IP da interface do Private Service Connect, por exemplo, ens5 (vNIC1).

Para configurar o roteamento, você precisa saber o endereço IP do gateway padrão da interface do Private Service Connect.

No Cloud Shell, vamos usar 1, já que a interface PSC está associada à vNIC1.

curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google" && echo

O exemplo produz o gateway padrão 192.168.10.1

user@bear:~$ curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google" && echo
192.168.10.1

Adicionar rotas para sub-redes de consumidores

É necessário adicionar uma rota ao gateway padrão da interface do Private Service Connect para cada sub-rede do consumidor que se conecta à interface do Private Service Connect. Isso garante que o tráfego vinculado à rede do consumidor saia da interface do Private Service Connect.

Na instância do urso, adicione as rotas às sub-redes do consumidor.

sudo ip route add 192.168.20.0/28 via 192.168.10.1 dev ens5
sudo ip route add 192.168.30.0/28 via 192.168.10.1 dev ens5
sudo ip route add 192.168.40.0/28 via 192.168.10.1 dev ens5

Validar a tabela de rotas

No Cloud Shell, valide as rotas recém-adicionadas.

ip route show

Exemplo:

user@bear:~$ ip route show
default via 10.20.1.1 dev ens4 
10.20.1.0/28 via 10.20.1.1 dev ens4 
10.20.1.1 dev ens4 scope link 
192.168.10.0/28 via 192.168.10.1 dev ens5 
192.168.10.1 dev ens5 scope link 
192.168.20.0/28 via 192.168.10.1 dev ens5 
192.168.30.0/28 via 192.168.10.1 dev ens5 
192.168.40.0/28 via 192.168.10.1 dev ens5 

12. Validar a conectividade entre o urso e o leão

Vamos confirmar que a instância de VM do produtor, bear, pode se comunicar com a instância do consumidor, lion, executando um curl.

Na instância do urso, execute um curl no endereço IP do leão identificado anteriormente no tutorial.

curl -v <lions IP Address>

Exemplo:

user@bear:~$ curl -v 192.168.20.2
*   Trying 192.168.20.2:80...
* Connected to 192.168.20.2 (192.168.20.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.168.20.2
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 06 Jun 2023 03:53:08 GMT
< Server: Apache/2.4.56 (Debian)
< Last-Modified: Mon, 05 Jun 2023 19:41:26 GMT
< ETag: "1e-5fd6716a1e11b"
< Accept-Ranges: bytes
< Content-Length: 30
< Content-Type: text/html
< 
Welcome to lion app server !!
* Connection #0 to host 192.168.20.2 left intact

13. Validar se a conectividade entre o urso e o tigre está bloqueada

Vamos confirmar se a regra de firewall de saída está bloqueando o acesso do urso ao tigre, conferindo os registros de firewall.

Em uma nova sessão do console do Cloud, navegue até "Logging" > "Logs Explorer" > "Selecionar consulta".

2ae597e6d970cddf.png

Cole a string de consulta abaixo no campo de pesquisa e selecione stream.

jsonPayload.rule_details.reference="network:consumer-vpc/firewall:deny-all-egress"

30d7bfae315f2ee3.png

Na instância do urso, execute um curl no endereço IP do tigre identificado anteriormente no tutorial. O curl vai expirar em algum momento.

curl -v <tiger's IP Address>

Exemplo:

user@bear:~$ curl -v 192.168.30.2 
*   Trying 192.168.30.2:80...
* connect to 192.168.30.2 port 80 failed: Connection timed out
* Failed to connect to 192.168.30.2 port 80: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to 192.168.30.2 port 80: Connection timed out

Valide se a Análise de registros capturou os registros de firewall negados. Selecione uma entrada de registro e abra os campos aninhados para conferir os metadados.

5c42a6587300be55.png

14. Validar a conectividade do Cosmo para suportar

Abra uma nova guia do Cloud Shell e atualize as configurações do projeto.

No Cloud Shell, faça o seguinte:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

Faça login na instância do Cosmo usando o IAP no Cloud Shell.

gcloud compute ssh cosmo --project=$projectid --zone=us-central1-a --tunnel-through-iap

No Cloud Shell, faça um ping no endereço IP vNIV1 do bear identificado anteriormente no tutorial.

ping <bears vNIC1 IP Address>

Exemplo:

user@cosmo:~$ ping 192.168.10.2 -c 5
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.277 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.288 ms
64 bytes from 192.168.10.2: icmp_seq=3 ttl=64 time=0.265 ms
64 bytes from 192.168.10.2: icmp_seq=4 ttl=64 time=0.264 ms
64 bytes from 192.168.10.2: icmp_seq=5 ttl=64 time=0.366 ms

15. Limpar

No Cloud Shell, exclua os componentes do tutorial.

gcloud compute instances delete bear --zone=us-central1-a --quiet

gcloud compute instances delete lion --zone=us-central1-a --quiet

gcloud compute instances delete tiger --zone=us-central1-a --quiet

gcloud compute instances delete cosmo --zone=us-central1-a --quiet

gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet

gcloud compute firewall-rules delete allow-ingress allow-limited-egress-to-lion deny-all-egress ssh-iap-consumer ssh-iap-producer vm-subnet-allow-ingress --quiet

gcloud compute networks subnets delete cosmo-subnet-1 intf-subnet lion-subnet-1 prod-subnet tiger-subnet-1 --region=us-central1 --quiet

gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet 

gcloud compute networks delete consumer-vpc --quiet

gcloud compute networks delete producer-vpc --quiet

16. Parabéns

Parabéns! Você configurou e validou uma interface do Private Service Connect e a conectividade do consumidor e do produtor implementando regras de firewall.

Você criou a infraestrutura do consumidor e adicionou um anexo de rede que permitiu ao produtor criar uma VM de várias NICs para conectar a comunicação entre consumidor e produtor. Você aprendeu a criar regras de firewall na rede VPC do consumidor que permitiam a conectividade às instâncias na VPC do consumidor e do produtor.

Cosmopup acha que os tutoriais são incríveis!

e6d3675ca7c6911f.jpeg

Qual é a próxima etapa?

Confira alguns desses tutoriais:

Leituras e vídeos complementares

Documentos de referência