Skip to content

Private Google Access — Truy Cập Google APIs Từ VMs Không Có External IP

Vấn Đề Căn Bản

Trong production GCP deployments, best practice là VMs không có external IP — vì external IP tạo attack surface, tăng egress cost, và vi phạm principle of least privilege.

Nhưng VMs cần access Google APIs: Cloud Storage, BigQuery, Secret Manager, Cloud SQL, Pub/Sub, v.v. Tất cả những APIs này có endpoint là *.googleapis.com với IP address public.

Vấn đề: VM không có external IP, làm sao kết nối đến public IP của Google APIs?

Giải pháp: Private Google Access — routing traffic đến Google APIs thông qua Google's private network, không qua public internet.

Cơ Chế: Virtual IP Addresses và Route Configuration

Hai Endpoints Khác Nhau

GCP cung cấp hai Virtual IP ranges cho Private Google Access:

private.googleapis.com: 199.36.153.8/30

  • IPs: 199.36.153.8, 199.36.153.9, 199.36.153.10, 199.36.153.11
  • IPv6: 2600:2d00:0002:2000::/56
  • Access: Most Google APIs và services (Google Maps, Google Ads, Cloud services)
  • Không bao gồm Google Workspace (Gmail, Drive, Docs)

restricted.googleapis.com: 199.36.153.4/30

  • IPs: 199.36.153.4, 199.36.153.5, 199.36.153.6, 199.36.153.7
  • IPv6: 2600:2d00:0002:1000::/56
  • Access: Chỉ những services supported bởi VPC Service Controls
  • Từ chối access đến unsupported APIs và Google Workspace

Tại sao có hai loại? restricted.googleapis.com dùng cho environments cần VPC Service Controls (data governance, compliance). Nếu workload dùng service không supported bởi VPC SC, phải dùng private.googleapis.com thay vì restricted.

Cấu Hình Route

Để Private Google Access hoạt động, cần tạo routes đến VIP ranges:

bash
# Route cho private.googleapis.com
gcloud compute routes create private-google-access-route \
  --network=prod-vpc \
  --destination-range=199.36.153.8/30 \
  --next-hop-gateway=default-internet-gateway \
  --priority=1000

# Route cho restricted.googleapis.com
gcloud compute routes create restricted-google-access-route \
  --network=prod-vpc \
  --destination-range=199.36.153.4/30 \
  --next-hop-gateway=default-internet-gateway \
  --priority=1000

Điều counterintuitive: next-hop là default-internet-gateway mặc dù traffic không ra internet.

Tại sao? GCP sử dụng default-internet-gateway như một logical construct — nó không phải là "đi ra internet", mà là "gửi packet đến Google edge". Khi packet đến Google edge với destination 199.36.153.x, GCP redirect packet đến internal Google API endpoints — không bao giờ rời Google network.

Tài liệu GCP xác nhận: "Packets from VMs remain within Google's network."

DNS Configuration: Bước Bắt Buộc

Route đến VIP ranges mới chỉ là một nửa của vấn đề. Phần còn lại là DNS.

Khi VM resolve storage.googleapis.com, DNS trả về public IPs (ví dụ: 142.250.x.x). VM không có external IP → không thể kết nối đến public IP → fail.

Phải configure DNS để *.googleapis.com resolve sang private VIP IPs:

Tạo Private DNS Zone

bash
# Tạo private zone cho googleapis.com trong VPC
gcloud dns managed-zones create googleapis-private-zone \
  --dns-name=googleapis.com. \
  --visibility=private \
  --networks=prod-vpc \
  --description="Private zone for Google API access"

# Record cho private.googleapis.com
gcloud dns record-sets create private.googleapis.com. \
  --zone=googleapis-private-zone \
  --type=A \
  --ttl=300 \
  --rrdatas=199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11

# Wildcard CNAME để tất cả *.googleapis.com resolve đến private endpoint
gcloud dns record-sets create "*.googleapis.com." \
  --zone=googleapis-private-zone \
  --type=CNAME \
  --ttl=300 \
  --rrdatas=private.googleapis.com.

Cơ chế hoạt động:

VM resolve storage.googleapis.com:
  1. DNS query → Cloud DNS (169.254.169.254)
  2. Cloud DNS check private zones: googleapis-private-zone matches!
  3. Wildcard CNAME: storage.googleapis.com → private.googleapis.com
  4. A record: private.googleapis.com → 199.36.153.8-11
  5. VM nhận IP 199.36.153.8

VM kết nối đến 199.36.153.8:443
  → Route table match: 199.36.153.8/30 → default-internet-gateway
  → Packet đến Google edge
  → Google edge redirect đến Storage API internal endpoint
  → Response về VM qua same path

Tại Sao Cần CNAME Wildcard?

Có hàng trăm APIs dưới *.googleapis.com (storage, bigquery, secretmanager, pubsub, v.v.). Thay vì tạo A record cho mỗi subdomain, CNAME wildcard đơn giản hóa:

*.googleapis.com → private.googleapis.com → 199.36.153.8-11

Bất kỳ subdomain mới nào của googleapis.com tự động redirect đến private VIP mà không cần update DNS zone.

Enable Private Google Access Trên Subnet

Ngoài DNS và routes, còn cần enable Private Google Access tại cấp subnet:

bash
gcloud compute networks subnets update prod-nodes-us-west1 \
  --region=us-west1 \
  --enable-private-ip-google-access

Khi flag này được bật, Andromeda biết rằng VMs trong subnet này có thể access Google APIs thông qua private VIP mà không cần external IP.

Nếu không bật flag: VM không có external IP cố kết nối Google APIs → traffic bị drop ngay tại subnet level, dù có routes và DNS đúng.

Restricted Access Và VPC Service Controls

Khi dùng restricted.googleapis.com:

bash
# DNS record trỏ đến restricted VIP
gcloud dns record-sets create restricted.googleapis.com. \
  --zone=googleapis-private-zone \
  --type=A \
  --rrdatas=199.36.153.4,199.36.153.5,199.36.153.6,199.36.153.7

Với restricted endpoint:

  • Chỉ services within VPC Service Controls perimeter được allow
  • Nếu VM trong perimeter cố access service ngoài perimeter → request bị từ chối bởi VPC Service Controls
  • External access bị block ở VPC SC level, không phải ở network level

Đây là lý do restricted.googleapis.com tồn tại: để kết hợp với VPC Service Controls tạo data perimeter nghiêm ngặt — traffic chỉ đến services trong perimeter, và services đó chỉ accessible qua private network.

Private Service Connect: Alternative Approach

Private Service Connect (PSC) là approach hiện đại hơn:

PSC for Google APIs: Tạo internal endpoint với private IP trong VPC. Traffic đến Google API đi qua endpoint này, không cần VIP ranges.

bash
# Tạo PSC endpoint cho Google APIs
gcloud compute addresses create psc-endpoint-ip \
  --region=us-west1 \
  --subnet=prod-nodes-us-west1 \
  --address-type=internal

gcloud compute forwarding-rules create psc-google-apis \
  --region=us-west1 \
  --network=prod-vpc \
  --address=psc-endpoint-ip \
  --target-google-apis-bundle=all-apis

Với PSC, traffic đến Google APIs dùng internal IP trong VPC (ví dụ: 10.0.0.100), không cần routes đặc biệt đến 199.36.153.x/30.

Private Google Access vs PSC cho Google APIs:

Khía cạnhPrivate Google AccessPSC for Google APIs
IP addressVIP 199.36.153.x/30Private IP trong VPC của bạn
DNS setupCần configure wildcard CNAMECần configure per-service DNS
RoutingRoutes đến VIP rangesSubnet-local routing
Peering compatibilityPhức tạpTốt hơn (internal IP được share qua peering)
Setup complexityĐơn giản hơnPhức tạp hơn một chút

PSC cho phép access Google APIs qua peered VPCs — endpoint trong Hub VPC có thể accessible từ Spoke VPCs. Điều này không dễ thực hiện với Private Google Access truyền thống.

Failure Modes

DNS Misconfiguration

Triệu chứng: VM không có external IP, kết nối đến storage.googleapis.com fail

Kiểm tra:
1. nslookup storage.googleapis.com từ VM
   → Nếu trả về 142.250.x.x (public IP) → DNS config sai
   → Nếu trả về 199.36.153.x → DNS đúng, check tiếp

2. Kiểm tra connectivity đến 199.36.153.8
   → Nếu fail → Route configuration sai hoặc firewall blocking egress

3. Kiểm tra subnet Private Google Access flag:
   gcloud compute networks subnets describe prod-nodes-us-west1 --region=us-west1
   → privateIpGoogleAccess: true là required

Egress Firewall Blocking

Nếu VPC có egress DENY rule cho 0.0.0.0/0, cần explicitly allow egress đến VIP ranges:

bash
gcloud compute firewall-rules create allow-google-api-egress \
  --direction=EGRESS \
  --priority=900 \
  --action=ALLOW \
  --destination-ranges=199.36.153.0/23 \
  --rules=tcp:443 \
  --network=prod-vpc

199.36.153.0/23 covers cả private (/30) và restricted (/30) ranges.

References