Configura IP privadas

En esta página, se describe cómo configurar una instancia de Cloud SQL para usar una IP privada.

Para obtener más información sobre cómo funcionan las IP privadas, así como los requisitos de administración y del entorno, consulta IP privada.

Antes de comenzar

Requisitos de API y de IAM

  • Debes habilitar la API de Service Networking para tu proyecto.
  • Si usas una red de VPC compartida, también debes habilitar esta API para el proyecto host.

  • Para administrar una conexión de acceso a servicios privados, el usuario debe tener los siguientes permisos de IAM. Si no cuentas con los permisos necesarios, puedes recibir errores de permisos insuficientes.
    • compute.networks.list
    • compute.addresses.create
    • compute.addresses.list
    • servicenetworking.services.addPeering

    Si usas una red de VPC compartida, también debes agregar el usuario al proyecto host y asignarle los mismos permisos al usuario en el proyecto host.

Acceso privado a servicios

Cuando creas una nueva red de VPC en el proyecto, debes configurar el acceso privado a los servicios para asignar un rango de direcciones IP y crear una conexión privada a los servicios. Esto permite que los recursos en la red de VPC se conecten a instancias de Cloud SQL. La consola proporciona un asistente para ayudarte a establecer esta configuración.

Configura una instancia para que use una IP privada

Puedes configurar el uso de IP privada cuando creas una instancia de Cloud SQL o para una instancia ya existente.

Configura una IP privada en una instancia nueva

Si quieres configurar una instancia de Cloud SQL para usar una IP privada en el momento de su creación, realiza los siguientes pasos:

Console

  1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Haga clic en Crear instancia.
  3. En el asistente de creación, en la sección Opciones de configuración, expande la sección Conectividad.
  4. Selecciona la casilla de verificación IP privada.

    En una lista desplegable, se muestran las redes de VPC disponibles en tu proyecto. Si tu proyecto es el proyecto de servicio de una VPC compartida, también se muestran las redes de VPC del proyecto host.

  5. Selecciona la red de VPC que deseas usar:
  6. Si ves Se requiere conexión privada a servicio:

    1. Haz clic en Configurar conexión.
    2. En la sección Asignar un rango de IP, elige una de las siguientes opciones:
      • Selecciona uno o más rangos de IP existentes o crea uno nuevo desde el menú desplegable. El menú desplegable incluye los rangos asignados previamente, si hay alguno, o puedes seleccionar Asignar un rango de IP nuevo e ingresar un rango y un nombre nuevos.
      • Usa un rango de IP asignado automáticamente en tu red.
    3. Haga clic en Continuar.
    4. Haz clic en Crear conexión (Create connection).
    5. Verifica que veas el estado Se creó correctamente la conexión privada a servicio para la red VPN_NAME.
  7. Haz clic en Guardar.

gcloud

Si aún no lo has hecho, sigue las instrucciones que aparecen a continuación a fin de configurar el acceso privado a servicios para Cloud SQL. Crea tu instancia de Cloud SQL con el parámetro --network para especificar el nombre de la red de VPC elegida y la marca --no-assign-ip a fin de inhabilitar la IP pública. El valor del parámetro --network tiene el siguiente formato: projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME. El PROJECT_ID es el ID del proyecto de la red de VPC. Si la red de VPC es una VPC compartida, debe ser el ID del proyecto host de la VPC compartida.
gcloud beta sql instances create INSTANCE_ID \
--project=PROJECT_ID \
--network=VPC_NETWORK_NAME \
--no-assign-ip

Configura una IP privada en una instancia existente

Configurar una instancia de Cloud SQL existente para que use una IP privada hace que la instancia se reinicie, lo que causa un tiempo de inactividad.

A fin de configurar una instancia existente para que use una IP privada, sigue estos pasos:

Console

  1. En Google Cloud Console, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Haz clic en el nombre de la instancia para abrir la página Descripción general de esa instancia.
  3. Selecciona Conexiones en el menú de navegación de SQL.
  4. Selecciona la casilla de verificación IP privada.

    En una lista desplegable, se muestran las redes disponibles en tu proyecto. Si tu proyecto es el proyecto de servicio de una VPC compartida, también se muestran las redes de VPC del proyecto host.

  5. Selecciona la red de VPC que deseas usar:
  6. Si ves Se requiere conexión privada a servicio:

    1. Haz clic en Configurar conexión.
    2. En la sección Asignar un rango de IP, elige una de las siguientes opciones:
      • Selecciona uno o más rangos de IP existentes o crea uno nuevo desde el menú desplegable. El menú desplegable incluye los rangos asignados previamente, si hay alguno, o puedes seleccionar Asignar un rango de IP nuevo e ingresar un rango y un nombre nuevos.
      • Usa un rango de IP asignado automáticamente en tu red.
    3. Haga clic en Continuar.
    4. Haz clic en Crear conexión (Create connection).
    5. Verifica que veas el estado Se creó correctamente la conexión privada a servicio para la red VPN_NAME.
  7. Haz clic en Guardar.

gcloud

Si aún no lo has hecho, sigue las instrucciones que aparecen a continuación a fin de configurar el acceso privado a servicios para Cloud SQL. Actualiza tu instancia de Cloud SQL con el parámetro --network para especificar el nombre de la red de VPC seleccionada.

VPC_NETWORK_NAME es el nombre de la red de VPC elegida, por ejemplo: my-vpc-network. El valor del parámetro --network tiene el siguiente formato: https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/global/networks/[VPC_NETWORK_NAME].

gcloud beta sql instances patch INSTANCE_ID \
--project=PROJECT_ID \
--network=VPC_NETWORK_NAME \
--no-assign-ip

Conéctate a una instancia mediante su IP privada

Debes usar el acceso privado a servicios para conectarte a instancias de Cloud SQL desde instancias de Compute Engine o Google Kubernetes Engine en la misma red de VPC (definidas aquí como fuentes internas) o fuera de esa red (una fuente externa).

Conéctate desde una fuente interna

Para conectarse desde una fuente en el mismo proyecto de Google Cloud que la instancia de Cloud SQL, como el proxy de Cloud SQL Auth que se ejecuta en un recurso de Compute Engine, ese recurso debe estar en la misma red de VPC que la instancia de Cloud SQL.

Para conectarse desde una fuente sin servidores, como el Entorno estándar de App Engine, el Entorno flexible de App Engine, Cloud Run oCloud Functions, tu aplicación o función se conecta directamente a tu instancia a través del Acceso a VPC sin servidores sin el proxy de Cloud SQL Auth.

Conéctate desde una fuente externa

Puedes conectarte desde un cliente en una red externa (red local o red de VPC) si la red externa está conectada a la red de VPC a la que está conectada tu instancia de Cloud SQL. Para permitir conexiones desde una red externa, haz lo siguiente:

  1. Asegúrate de que tu red de VPC esté conectada a la red externa mediante un túnel de Cloud VPN o un adjunto de VLAN para la interconexión dedicada o la interconexión de socio.
  2. Asegúrate de que las sesiones de BGP en los Cloud Routers que administran los túneles de Cloud VPN y los adjuntos de Cloud Interconnect (VLAN) hayan recibido prefijos específicos (destinos) de tu red local. Las rutas predeterminadas (destino 0.0.0.0/0) no se pueden importar a la red de VPC de Cloud SQL porque esa red tiene su propia ruta predeterminada local. Siempre se usan las rutas locales para un destino, aunque el intercambio de tráfico de Cloud SQL esté configurado para importar rutas personalizadas desde tu red de VPC.
  3. Identifica las conexiones de intercambio de tráfico que produce la conexión privada a los servicios:
    • cloudsql-mysql-googleapis-com
    • cloudsql-postgres-googleapis-com
    • servicenetworking-googleapis-com
  4. Actualiza todas las conexiones de intercambio de tráfico para habilitar la exportación de rutas personalizadas.
  5. Identifica el rango asignado que usa la conexión de servicios privados.
  6. Crea un anuncio de ruta personalizado de Cloud Router para el rango asignado en los Cloud Routers que administran sesiones de BGP para los túneles de Cloud VPN o los adjuntos de Cloud Interconnect (VLAN).

Conéctate desde Cloud Shell

En la actualidad, Cloud Shell no es compatible con la conexión a una instancia de Cloud SQL que solo tiene una dirección IP privada.

Conéctate desde direcciones que no sean RFC 1918

RFC 1918 especifica las direcciones IP que se asignan para usar de manera interna (es decir, dentro de una organización) y que no se enrutarán en Internet. En concreto, las siguientes:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

Las conexiones a una instancia de Cloud SQL mediante una dirección IP privada se autorizan de forma automática para los rangos de direcciones RFC 1918. De esta manera, todos los clientes privados pueden acceder a la base de datos sin pasar por el proxy.

Los rangos de direcciones que no son RFC 1918 (direcciones que no están dentro del espacio de direcciones RFC 1918) deben configurarse como redes autorizadas.

Para conectarte desde una dirección que no sea RFC 1918, debes configurar la autorización de IP por instancia a fin de permitir el tráfico de rangos de direcciones que no sean RFC 1918.

Por ejemplo, usa un comando de gcloud como el siguiente:

gcloud sql instances patch INSTANCE_NAME \
--authorized-networks=192.88.99.0/24,11.0.0.0/24

De forma predeterminada, Cloud SQL no procesa rutas de subred de tu VPC que no son RFC 1918. Debes actualizar el intercambio de tráfico entre redes a Cloud SQL para exportar cualquier ruta que no sea RFC 1918.

gcloud compute networks peerings update cloudsql-postgres-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID
  • cloudsql-postgres-googleapis-com es un nombre de conexión privada a servicio de tu página de red de VPC.

    Selecciona tu red y busca la sección Conexión privada a servicio.

  • NETWORK es el nombre de tu red de VPC.

Soluciona problemas

Haz clic en los vínculos de la tabla para obtener más información:

Situación Posible problema Solución
FATAL: database 'user' does not exist. gcloud sql connect --user solo funciona con el usuario predeterminado “postgres”. Conéctate con el usuario predeterminado y, luego, cambia de usuario.
SSL error: invalid padding. Error de certificado del servidor. Crea un certificado de servidor nuevo y realiza una rotación.
Quieres saber quién está conectado. N/A Consulta estas alternativas para solucionarlo.
Se generan errores Unauthorized to connect. Puede haber muchas causas principales. Consulta estas alternativas para solucionarlo.
Invalid request: Incorrect Service Networking config for instance. SERVICE_NETWORKING_NOT_ENABLED.

Network association failed.

Service Networking API no está habilitada en el proyecto. Habilita Service Networking API en el proyecto.
Remaining connection slots are reserved. Se alcanzó la cantidad máxima de conexiones. Aumenta la marca max_connections.
Set Service Networking service account as servicenetworking.serviceAgent role on consumer project. La cuenta de servicio de Service Networking no está vinculada a la función servicenetworking.serviceAgent. Vincula la cuenta de servicio de Service Networking a la función servicenetworking.serviceAgent.
error x509: certificate is not valid for any names, but wanted to match project-name:db-name. Problema conocido: En este momento, el marcador del proxy de Cloud SQL no es compatible con Go 1.15. Hasta que este problema se corrija, consulta este debate en GitHub, en el que se incluye una solución alternativa.
No se pueden analizar los certificados en algunos sistemas operativos. Los clientes que usan bibliotecas x509 de mac OS 11.0 (Big Sur) podrían no completar el análisis de algunos certificados de las instancias de postgres. Es posible que se muestre al cliente como un error genérico, como “cancelado”. La solución alternativa es rotar el certificado de servidor y volver a crear los certificados de cliente.
Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection. Los intercambios de tráfico de VPC no se actualizaron después de modificar o quitar un rango asignado. Consulta estas alternativas para solucionarlo a fin de obtener información detallada sobre la actualización del intercambio de tráfico de VPC.
Allocated IP range not found in network. Los intercambios de tráfico de VPC no se actualizaron después de modificar o quitar un rango asignado. Consulta estas alternativas para solucionarlo a fin de obtener información detallada sobre la actualización del intercambio de tráfico de VPC.
ERROR: (gcloud.sql.connect) It seems your client does not have ipv6 connectivity and the database instance does not have an ipv4 address. Please request an ipv4 address for this database instance.. Intentas conectarte a tu instancia de IP privada con Cloud Shell. Por el momento, no se admite la conexión desde Cloud Shell a una instancia con solo una dirección IP privada.

Conexión anulada

Verás el mensaje de error Got an error reading communication packets o Aborted connection xxx to db: DB_NAME.

Posible problema

  • Hay inestabilidad en las herramientas de redes.
  • No hay respuesta a los comandos keep-alive de TCP (el cliente o el servidor no responden, es posible que estén sobrecargados).
  • Se excedió el ciclo de vida de la conexión del motor de base de datos y el servidor finalizó la conexión.

Solución

Las aplicaciones deben tolerar fallas de red y seguir prácticas recomendadas, como la agrupación de conexiones y los reintentos. La mayoría de los agrupadores de conexiones detectan estos errores siempre que sea posible. De lo contrario, la aplicación debe reintentar o fallar de manera controlada.

Para los reintentos de conexión, recomendamos los siguientes métodos:

  1. Realiza una retirada exponencial. Aumenta el intervalo de tiempo entre cada reintento de manera exponencial.
  2. Agrega una retirada aleatoria.
La combinación de estos métodos ayuda a reducir la limitación.


GRAVE: La base de datos “user” no existe

Verás el mensaje de error FATAL: database 'user' does not exist cuando intentes conectarte a una instancia de PostgreSQL mediante gcloud sql connect --user.

Posible problema

El comando gcloud sql connect --user solo funciona con el usuario predeterminado (postgres).

Solución

La solución consiste en conectarse con el usuario predeterminado y, luego, usar el comando "\c" de psql para volver a conectarse como el usuario diferente.


Error de SSL: relleno no válido

Verás el mensaje de error SSL error: invalid padding cuando intentes conectarte a una instancia de PostgreSQL mediante SSL.

Posible problema

Es posible que haya un error en el certificado de CA de servidor.

Solución

Crea un nuevo certificado de CA de servidor y realiza una rotación de los certificados de servidor.


Quieres saber quién está conectado

Deseas saber quién está conectado y por cuánto tiempo.

Posible problema

N/A

Solución

Accede a la base de datos y ejecuta este comando: SELECT datname, usename, application_name as appname, client_addr, state, now() - backend_start as conn_age, now() - state_change as last_activity_age FROM pg_stat_activity WHERE backend_type = 'client backend' ORDER BY 6 DESC LIMIT 20</code>.


No estás autorizado para establecer la conexión

Verás el mensaje de error Unauthorized to connect.

Posible problema

Puede haber muchas causas, ya que la autorización ocurre en muchos niveles.

  • A nivel de la base de datos, el usuario de la base de datos debe existir y su contraseña debe coincidir.
  • A nivel del proyecto, es posible que el usuario no tenga los permisos de IAM correctos.
  • A nivel de Cloud SQL, es posible que la causa principal dependa de cómo te conectes a tu instancia. Si te conectas directamente a una instancia a través de la IP pública, la IP de origen de la conexión debe estar en la red autorizada de la instancia.

    La conectividad de IP privada está permitida de forma predeterminada, excepto cuando te conectas desde una dirección que no es RFC 1918. Las direcciones de clientes que no son RFC 1918 deben configurarse como redes autorizadas.

    De forma predeterminada, Cloud SQL no procesa rutas de subred de tu VPC que no son RFC 1918. Debes actualizar el intercambio de tráfico entre redes a Cloud SQL para exportar cualquier ruta que no sea RFC 1918. Por ejemplo:

    gcloud compute networks peerings update cloudsql-postgres-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
    

    Si te conectas a través del proxy de autenticación de Cloud SQL, asegúrate de que los permisos de IAM estén configurados de forma correcta.

  • A nivel de red, si la instancia de Cloud SQL usa una IP pública, la IP de origen de la conexión debe estar en una red autorizada.

Solución

  • Verifica el nombre de usuario y la contraseña.
  • Verifica las funciones y los permisos de IAM del usuario.
  • Si usas una IP pública, asegúrate de que el origen esté en las redes autorizadas.

No se pudo asociar la red

Tal vez veas alguno de los siguientes mensajes de error:

  • Invalid request: Incorrect Service Networking config for instance: INSTANCE_NAME:SERVICE_NETWORKING_NOT_ENABLED.
  • Error: Network association failed due to the following error: configura la cuenta de servicio de las herramientas de redes de servicios como la función servicenetworking.serviceAgent en el proyecto consumidor.

Posible problema

La Service Networking API no está habilitada en el proyecto.

Solución

Habilita la Service Networking API en tu proyecto. Si ves este error cuando intentas asignar una dirección IP privada a una instancia de Cloud SQL y usas una VPC compartida, también debes habilitar la Service Networking API para el proyecto host.


Las ranuras de conexión restantes están reservadas

Verás el mensaje de error FATAL: remaining connection slots are reserved for non-replication superuser connections.

Posible problema

Se alcanzó la cantidad máxima de conexiones.

Solución

Edita el valor de la marca max_connections.


Configura la cuenta de servicio de las Herramientas de redes de servicios como servicenetworking.serviceAgent en el proyecto del consumidor

Verás el mensaje de error set Service Networking service account as servicenetworking.serviceAgent role on consumer project..

Posible problema

La cuenta de servicio de Service Networking no está vinculada a la función servicenetworking.serviceAgent.

Solución

A fin de mitigar este problema, intenta usar estos comandos de gcloud para vincular la cuenta de servicio de Service Networking a la función servicenetworking.serviceAgent.

gcloud beta services identity create --service=servicenetworking.googleapis.com --project=PROJECT_ID
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:service-PROJECT_NUMBER@service-networking.iam.gserviceaccount.com" --role="roles/servicenetworking.serviceAgent"

Error x509: el certificado no es válido para ningún nombre

Verás el mensaje de error error x509: certificate is not valid for any names, but wanted to match project-name:db-name.

Posible problema

Problema conocido: En este momento, el marcador del proxy de Cloud SQL no es compatible con Go 1.15.

Solución

Hasta que este error se corrija, consulta este debate en GitHub, en el que se incluye una solución alternativa.


No se pueden analizar los certificados en algunos sistemas operativos

Cuando usas bibliotecas x509 de mac OS 11.0 (Big Sur), es posible que no se analicen los certificados de las instancias de postgres. Esto puede aparecer como un error genérico, como “cancelado”.

Solución

El error se corrigió y las nuevas instancias no presentarán este problema. En el caso de las instancias antiguas con este problema, rota el certificado de servidor y vuelve a crear los certificados de cliente.


No se pueden modificar los rangos asignados en CreateConnection. Usa UpdateConnection

Verás el mensaje de error Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection o The operation "operations/1234" resulted in a failure "Allocated IP range 'xyz' not found in network.

Posible problema

El primer error se produce cuando intentas establecer una conexión de nuevo con un rango reservado diferente.

El segundo error aparece cuando se modificó el rango asignado, pero vpc-peerings no se actualizó.

Solución

Debes modificar la conexión privada. Usa el siguiente comando y asegúrate de usar el argumento --force:

gcloud services vpc-peerings update --network=VPC_NETWORK --ranges=ALLOCATED_RANGES --service=servicenetworking.googleapis.com --force

Próximos pasos