By default, when a Compute Engine VM lacks an external IP address assigned to its network interface, it can only send packets to other internal IP address destinations. You can allow these VMs to connect to the set of external IP addresses used by Google APIs and services by enabling Private Google Access on the subnet used by the VM's network interface.
Private Google Access also allows access to the external IP addresses used by App Engine, including third-party App Engine-based services.
To view the eligible APIs and services that you can use with Private Google Access, see supported services in the Private Google Access overview.
See Private Access Options for Services for background information about Private Google Access and other private connectivity options offered by Google Cloud.
Specifications
A VM interface can send packets to the external IP addresses of Google APIs and services using Private Google Access if all these conditions are met:
The VM interface is connected to a subnet where Private Google Access is enabled.
The VPC network that contains the subnet meets the network requirements for Google APIs and services.
The VM interface does not have an external IP address assigned.
The source IP address of packets sent from the VM matches the VM interface's primary internal IP address or an internal IP address from an alias IP range.
A VM with an external IP address assigned to its network interface doesn't need Private Google Access to connect to Google APIs and services. However, the VPC network must meet the requirements for accessing Google APIs and services.
Network requirements
Private Google Access has the following requirements:
Because Private Google Access is enabled on a per-subnet basis, you must use a VPC network. Legacy networks are not supported because they don't support subnets.
Private Google Access does not automatically enable any API. You must separately enable the Google APIs you need to use via the APIs & services page in the Google Cloud Console.
If you use the private.googleapis.com or the restricted.googleapis.com domain names, you'll need to create DNS records to direct traffic to the IP addresses associated with those domains. See Network configuration for guidance.
Your network must have appropriate routes for the destination IP ranges used by Google APIs and services. These routes must use the default internet gateway next hop. If you use the private.googleapis.com or the restricted.googleapis.com domain names, you only need one route (per domain). Otherwise, you'll need to create multiple routes. See Routing options for details.
Egress firewalls must permit traffic to the IP address ranges used by Google APIs and services. The implied allow egress firewall rule satisfies this requirement. For other ways to meet the firewall requirement, see Firewall configuration.
Permissions
Project owners, editors, and IAM members with the Network Admin role can create or update subnets and assign IP addresses.
For more information on roles, read the IAM roles documentation.
Logging
Cloud Logging captures all API requests made from VM instances in subnets that have Private Google Access enabled. Log entries identify the source of the API request as an internal IP address of the calling instance.
You can configure daily usage and monthly rollup reports to be delivered to a Cloud Storage bucket. See the Viewing Usage Reports page for details.
Network configuration
This section describes the basic network requirements you must meet in order for a VM in your VPC network to access Google APIs and services.
You should first choose the domain on which you access Google APIs and services.
Domain and IP address ranges | Supported services | Example usage |
---|---|---|
Default domains All domain names for Google APIs and services except for private.googleapis.com and restricted.googleapis.com .Various IP address ranges—you can determine a set of IP ranges that contains the possible addresses used by the default domains by referencing IP addresses for default domains |
Enables API access to most Google APIs and services regardless of whether they are supported by VPC Service Controls. Includes API access to Google Maps, Google Ads, Google Cloud. Includes Google Workspace and other web applications. | The default domains are used when you don't configure DNS records for
private.googleapis.com and
restricted.googleapis.com |
private.googleapis.com 199.36.153.8/30 |
Enables API access to most Google APIs and services regardless of
whether they are supported by VPC Service Controls. Includes API access to
Maps, Google Ads, Google Cloud, and most other
Google APIs, including the lists below. Does not support Google Workspace web
applications. Does not support any interactive websites. Domain names that end with:
|
Use Choose
|
restricted.googleapis.com 199.36.153.4/30 |
Enables API access to
Google APIs and
services that are supported by VPC Service Controls. Blocks access to Google APIs and services that do not support VPC Service Controls. Does not support Google Workspace web applications or Google Workspace APIs. |
Use Choose |
DNS configuration
If you choose either private.googleapis.com
or restricted.googleapis.com
,
you need to configure DNS such that VMs in your VPC network
resolve requests to *.googleapis.com
:
- Create a private DNS zone for
googleapis.com
. Consider creating a Cloud DNS private zone for this purpose. In the
googleapis.com
zone, create one of the followingA
records, depending on the chosen domain:- An
A
record forprivate.googleapis.com
pointing to the following IP addresses:199.36.153.8
,199.36.153.9
,199.36.153.10
,199.36.153.11
- An
A
record forrestricted.googleapis.com
pointing to the following IP addresses:199.36.153.4
,199.36.153.5
,199.36.153.6
,199.36.153.7
If you're using Cloud DNS, add the records to the
googleapis.com
private zone.- An
In the
googleapis.com
zone, create aCNAME
record for*.googleapis.com
that points to whicheverA
record you created in the previous step.
Some Google APIs and services are provided using additional domain names,
including *.gcr.io
, *.gstatic.com
, and pki.goog
. Refer to the domain and
IP address ranges table in network requirements to determine if the
additional domain's services can be accessed using private.googleapis.com
or
restricted.googleapis.com
. Then, for each of the additional domains:
- Create a DNS zone for the additional domain (for example,
gcr.io
). If you're using Cloud DNS, make sure this zone is located in the same project as yourgoogleapis.com
private zone. - In this DNS zone:
- Create an
A
record for the domain (zone) name itself; for example,gcr.io
. Point thisA
record to the same four IP addresses for the custom domain name you chose (eitherprivate.googleapis.com
orrestricted.googleapis.com
). - Create a
CNAME
record for all of the additional domain's possible host names by using an asterisk and a dot followed by the domain (zone) name; for example,*.gcr.io
. Point thisCNAME
record to theA
record in the same zone. For example, point*.gcr.io
togcr.io
.
- Create an
Routing options
Your VPC network must have appropriate routes whose next hops are the default internet gateway. Google Cloud does not support routing traffic to Google APIs and services through other VM instances or custom next hops. Despite being called default internet gateway, packets sent from VMs in your VPC network to Google APIs and services remain within Google's network.
If you select the default domains, your VM instances connect to Google APIs and services using a subset of Google's external IP addresses. These IP addresses are publicly routable, but the path from a VM in a VPC network to those addresses remains within Google's network.
Google doesn't publish routes on the internet to any of the IP addresses used by either the
private.googleapis.com
orrestricted.googleapis.com
domains. Consequently, these domains can only be accessed by VMs in a VPC network or on-premises systems connected to a VPC network.
If your VPC network contains a default route whose next hop is the default internet gateway, you can use that route to access Google APIs and services on any domain, without needing to create custom routes. See routing with a default route for details.
If you have replaced the default route with a custom static route having a
destination of 0.0.0.0/0
and a next hop that's not the default internet
gateway, you can meet the routing requirements for Google APIs and services
using custom routing instead. Consider custom routing
in these situations:
- You have a custom static route with destination
0.0.0.0/0
and next hop being a Cloud VPN tunnel, an internal TCP/UDP load balancer, or another VM instance. - You use a Cloud Router to accept a custom dynamic route having a
destination of
0.0.0.0/0
.
Routing with a default route
Each VPC network contains a default route when it is created.
This route's next hop is the default internet gateway, and it provides a path to
the default domains, private.googleapis.com
, and restricted.googleapis.com
.
To check the configuration of a default route in a given network, follow these directions.
Console
- Go to the Routes page in the Google Cloud Console.
Go to the Routes page - Filter the list of routes to show just the routes for the network you need to inspect.
- Look for a route whose destination is
0.0.0.0/0
and whose next hop is default internet gateway.
gcloud
Use the following gcloud
command, replacing NETWORK_NAME
with
the name of the network to inspect:
gcloud compute routes list \ --filter="default-internet-gateway NETWORK_NAME"
If you need to create a replacement default route, see Adding a static route.
Custom routing
As an alternative to a default route, you can use custom static routes, each having a more specific destination, and each using the default internet gateway next hop. The number of routes you need and their destination IP addresses depend on the domain you choose.
To check the configuration of custom routes for Google APIs and services in a given network, follow these directions.
Console
- Go to the Routes page in the Google Cloud Console.
Go to the Routes page - Use the Filter table text field to filter the list of routes using
the following criteria, replacing
NETWORK_NAME
with the name of your VPC network.- Network:
NETWORK_NAME
- Next hop type:
default internet gateway
- Network:
- Look at the Destination IP range column for each route. If you chose
the default domains, check for several custom static routes, one for
each IP address range used by the default domain. If
you chose
private.googleapis.com
orrestricted.googleapis.com
, look for that domain's IP range.
gcloud
Use the following gcloud
command, replacing NETWORK_NAME
with
the name of the network to inspect:
gcloud compute routes list \ --filter="default-internet-gateway NETWORK_NAME"
Routes are listed in table format unless you customize the command with the
--format
flag. Look in the DEST_RANGE
column for the destination of each
route. If you chose the default domains, check for several custom static
routes, one for each IP address range used by the default
domain. If you chose private.googleapis.com
or
restricted.googleapis.com
, look for that domain's IP range.
If you need to create routes, see Adding a static route.
Firewall configuration
The firewall configuration of your VPC network must allow access
from VMs to the IP addresses used by Google APIs and services. The implied
allow egress
rule satisfies this requirement.
In some firewall configurations, you need to create specific egress allow rules.
For example, suppose you've created an egress deny rule that blocks traffic to
all destinations (0.0.0.0
). In that case, you must create one egress allow
firewall rule whose priority is higher than the egress deny rule for each IP
address range used by your chosen domain for Google APIs and services.
To create firewall rules, see Creating firewall rules. You can limit the VMs to which the firewall rules apply when you define the target of each egress allow rule.
IP addresses for default domains
Follow these steps to determine the IP address ranges used by the default
domains, such as *.googleapis.com
and *.gcr.io
.
- Google publishes the complete list of IP ranges that it announces to the internet in goog.json.
- Google also publishes a list of Google Cloud customer-usable global and regional external IP addresses ranges in cloud.json.
The IP addresses used by the default domains for Google APIs and services fit
within the list of ranges computed by taking away all ranges in cloud.json
from those in goog.json
. The following example shows you how to get this range
using Python.
Python
You can use the following Python script to create a list of IP address ranges that include those used by the default domains for Google APIs and services.
For macOS, this script requires a Python 3 runtime configured as follows:
- Install the current version Python 3 runtime for macOS.
- Run the included
Install Certificates.command
from the Python folder in your Applications folder to install a list of trusted root certificates (cert.pem
) for the Python runtime to use. ReplaceVERSION
with the Python version you installed (like3.8
):sudo "/Applications/Python
VERSION
/Install Certificates.command" - Install the
netaddr
module by running:sudo pip3 install netaddr
#!/usr/bin/env python3 import json import netaddr import urllib.request goog_url="https://www.gstatic.com/ipranges/goog.json" cloud_url="https://www.gstatic.com/ipranges/cloud.json" def read_url(url): try: s = urllib.request.urlopen(url).read() return json.loads(s) except urllib.error.HTTPError: print("Invalid HTTP response from %s" % url) return {} except json.decoder.JSONDecodeError: print("Could not parse HTTP response from %s" % url) return {} def main(): goog_json=read_url(goog_url) cloud_json=read_url(cloud_url) if goog_json and cloud_json: print("{} published: {}".format(goog_url,goog_json.get('creationTime'))) print("{} published: {}".format(cloud_url,cloud_json.get('creationTime'))) goog_cidrs = netaddr.IPSet() for e in goog_json['prefixes']: if e.get('ipv4Prefix'): goog_cidrs.add(e.get('ipv4Prefix')) cloud_cidrs = netaddr.IPSet() for e in cloud_json['prefixes']: if e.get('ipv4Prefix'): cloud_cidrs.add(e.get('ipv4Prefix')) print("IP ranges for Google APIs and services default domains:") for i in goog_cidrs.difference(cloud_cidrs).iter_cidrs(): print(i) if __name__=='__main__': main()
Private Google Access configuration
You can enable Private Google Access after you've met the network requirements in your VPC network.
Enabling Private Google Access
Follow these steps to enable Private Google Access:
Console
- Go to the VPC networks page in the
Google Cloud Console.
Go to the VPC networks page - Click the name of the network that contains the subnet for which you need to enable Private Google Access.
- For an existing subnet:
- Click the name of the subnet. The Subnet details page is displayed.
- Click Edit.
- In the Private Google Access section, select On.
- Click Save.
- For a new subnet:
- Click Add subnet.
- Specify the Name and Region of the new subnet.
- Specify the IP address range of the subnet. This range can't overlap with any subnets in the current VPC network or any networks connected through VPC Network Peering or VPN.
- Make other selections for the new subnet to meet your needs. For example, you might need to create secondary subnet IP ranges or enable VPC Flow Logs.
- Select On in the Private Google Access section.
- Click Add.
gcloud
For an existing subnet:
Determine the name and region of the subnet. To list the subnets for a particular network, use the following command:
gcloud compute networks subnets list --filter=NETWORK_NAME
Run the following command to enable Private Google Access:
gcloud compute networks subnets update SUBNET_NAME \ --region=REGION \ --enable-private-ip-google-access
Verify that Private Google Access is enabled by running this command:
gcloud compute networks subnets describe SUBNET_NAME \ --region=REGION \ --format="get(privateIpGoogleAccess)"
In all above commands, replace the following with valid values:
SUBNET_NAME
: the name of the subnetREGION
: the region for the subnetNETWORK_NAME
: the name of the VPC network that contains the subnet
When creating a new
subnet, use the
--enable-private-ip-google-access
flag to enable Private Google Access:
gcloud compute networks subnets create SUBNET_NAME \ --region=REGION \ --network=NETWORK_NAME \ --range=PRIMARY_IP_RANGE \ --enable-private-ip-google-access
Replace the following with valid values:
SUBNET_NAME
: the name of the subnetREGION
: the region for the subnetNETWORK_NAME
: the name of the VPC network that contains the subnetPRIMARY_IP_RANGE
: the subnet's primary IP address range
Disabling Private Google Access
Follow these steps to disable Private Google Access for an existing subnet:
Console
- Go to the VPC networks page in the
Google Cloud Console.
Go to the VPC networks page - Click the name of the network that contains the subnet for which you need to disable Private Google Access.
- Click the name of an existing subnet. The Subnet details page is displayed.
- Click Edit.
- In the Private Google Access section, select Off.
- Click Save.
gcloud
Determine the name and region of the subnet. To list the subnets for a particular network, use the following command:
gcloud compute networks subnets list \ --filter=NETWORK_NAME
Run the following command to disable Private Google Access:
gcloud compute networks subnets update SUBNET_NAME \ --region=REGION \ --no-enable-private-ip-google-access
Run the following command to verify that Private Google Access is disabled:
gcloud compute networks subnets describe SUBNET_NAME \ --region=REGION \ --format="get(privateIpGoogleAccess)"
In all above commands, replace the following with valid values:
SUBNET_NAME
: the name of the subnetREGION
: the region for the subnetNETWORK_NAME
: the name of the VPC network that contains the subnet
What's next
- To configure Private Google Access for on-premises hosts, see Configuring Private Google Access for on-premises hosts.