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:
# 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
# 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 pathTạ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-11Bấ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:
gcloud compute networks subnets update prod-nodes-us-west1 \
--region=us-west1 \
--enable-private-ip-google-accessKhi 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:
# 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.7Vớ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.
# 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-apisVớ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ạnh | Private Google Access | PSC for Google APIs |
|---|---|---|
| IP address | VIP 199.36.153.x/30 | Private IP trong VPC của bạn |
| DNS setup | Cần configure wildcard CNAME | Cần configure per-service DNS |
| Routing | Routes đến VIP ranges | Subnet-local routing |
| Peering compatibility | Phức tạp | Tốt hơn (internal IP được share qua peering) |
| Setup complexity | Đơn giản hơn | Phứ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à requiredEgress Firewall Blocking
Nếu VPC có egress DENY rule cho 0.0.0.0/0, cần explicitly allow egress đến VIP ranges:
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-vpc199.36.153.0/23 covers cả private (/30) và restricted (/30) ranges.
References
- Private Google Access Overview — Tài liệu chính thức
- Configure Private Google Access — DNS và route configuration
- Private Service Connect for Google APIs — PSC approach
- VPC Service Controls — Kết hợp với restricted.googleapis.com