En este tutorial se explica cómo ejecutar una base de datos MySQL en una red privada de Google Cloud para permitir el acceso remoto seguro a la base de datos mediante Compute Engine.
Sigue este tutorial si quieres instalar tu propia base de datos MySQL en Compute Engine, pero quieres restringir el acceso solo a los clientes de MySQL autorizados que también se ejecuten en Compute Engine. Puede que quieras gestionar tu propia instancia de MySQL en lugar de usar el servicio gestionado debido a las instancias entre regiones, el uso avanzado de parámetros y las necesidades de rendimiento específicas.
En este tutorial se describe cómo configurar tu aplicación de servidor MySQL para que acepte tráfico remoto de un cliente MySQL instalado en una instancia de Compute Engine en la misma red privada.
Para obtener información sobre cómo elegir la opción de implementación de MySQL adecuada, consulta el artículo Cómo instalar MySQL en Compute Engine.
En este tutorial se da por hecho que conoces los siguientes conceptos:
- Comandos básicos de Linux
- Ubuntu Server 18.04
- MySQL 5.7
- Compute Engine
Arquitectura
En este tutorial, desplegarás dos instancias de Compute Engine. Una instancia es el servidor y la otra es el cliente, tal como se muestra en el siguiente diagrama:

Crear instancias de Compute Engine
Crea dos instancias de MySQL: una de cliente y otra de servidor.
Crear una instancia de cliente de Compute Engine
-
Name the instance
my-client. -
Define la marca
--zoneen la zona en la que quieras crear la instancia. -
Asigna el valor
ubuntu-os-clouda la marca--image-project. -
Asigna el valor
ubuntu-1804-ltsa la marca--image-family. -
Define la marca
--scopescomohttps://www.googleapis.com/auth/cloud-platform. -
Create a Compute Engine instance. Configure the instance as follows:
-
Name the instance
my-server. -
Define la marca
--zoneen la zona en la que quieras crear la instancia. -
Asigna el valor
ubuntu-os-clouda la marca--image-project. -
Asigna el valor
ubuntu-1804-ltsa la marca--image-family. -
Define la marca
--scopescomohttps://www.googleapis.com/auth/cloud-platform. - Para conectarte a la instancia
my-client, usa el comandossh. - Actualiza el gestor de paquetes
apt-get.sudo apt-get update
- Instala el paquete de cliente de MySQL.
sudo apt-get -y install mysql-client-5.7
- Para conectarte a la instancia
my-server, usa el comandossh. - Actualiza el gestor de paquetes
apt-get.sudo apt-get update
- Instala el paquete del servidor MySQL.
sudo apt-get -y install mysql-server-5.7
En la sesión SSH de tu instancia
my-server, usa el siguiente comando para mejorar la seguridad de tu instalación de MySQL.sudo mysql_secure_installationPulsa
enterpara saltarte la configuración del complementoVALIDATE PASSWORD.Introduce una nueva contraseña de administrador dos veces.
Para quitar a los usuarios anónimos, introduce
Yy pulsaenter.Para evitar el inicio de sesión root remoto, introduce
Yy pulsaenter.Para eliminar la base de datos de prueba, introduce
Yy pulsaenter.Para volver a cargar las tablas de privilegios, introduce
Yy pulsaenter.En Cloud Shell, usa SSH para conectarte a la instancia
my-server.Actualiza el archivo de configuración
/etc/mysql/mysql.conf.d/mysqld.cnfcon la siguiente información:LOCAL_IP=$(curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \ -H "Metadata-Flavor: Google") sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" /etc/mysql/mysql.conf.d/mysqld.cnfReinicia el servicio MySQL para aplicar los cambios al servidor en ejecución.
sudo service mysql restartComprueba que el servidor se esté ejecutando de forma local. Sustituye
[ROOT_PASSWORD]por la contraseña raíz del servidor MySQL que has establecido en un paso anterior.sudo mysql --user=root -p[ROOT_PASSWORD] -e "show databases"El resultado será similar al siguiente:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
En Cloud Shell, crea una variable de entorno para la dirección IP interna
my-client.CLIENT_IP=$(gcloud compute instances describe my-client \ --zone=ZONE \ --format='value(networkInterfaces[0].networkIP)')Crea un usuario de MySQL con una contraseña. Sustituye
[MY_PASSWORD]por tu contraseña y[ROOT_PASSWORD]por la contraseña del usuario raíz de MySQL.sudo mysql -uroot -p[ROOT_PASSWORD] \ -e "CREATE USER 'TESTUSER'@'${CLIENT_IP}' IDENTIFIED BY '[MY_PASSWORD]';"Concede al nuevo usuario de MySQL permiso para iniciar sesión en el servidor desde la dirección IP interna de
my-client.sudo mysql -uroot -p[ROOT_PASSWORD] -e \ "GRANT ALL PRIVILEGES ON *.* TO 'TESTUSER'@'${CLIENT_IP}' \ IDENTIFIED BY '[MY_PASSWORD]';"Para quitar la dirección IP externa, actualiza los ajustes de configuración en Cloud Shell. Sustituye
[ZONE]por tu Google Cloud zona.gcloud compute instances delete-access-config my-server \ --access-config-name "external-nat" \ --zone="ZONE"- En Cloud Shell, usa SSH para conectarte a la instancia
my-client. Prueba la conexión enumerando las bases de datos.
sudo mysql --host=my-server --user=TESTUSER \ --password=[MY_PASSWORD] -e "SHOW DATABASES;"La salida tiene un aspecto similar al siguiente:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
En Cloud Shell, crea una regla de cortafuegos para permitir las comunicaciones de
mysql-clientamysql-server.gcloud compute firewall-rules create "mysql-remote-access" \ --allow tcp:3306 --source-tags "mysql-client" \ --target-tags "mysql-server"- Añade una dirección IP externa a
my-serverpara permitir la conectividad externa. - Añade la dirección IP de origen de tu cliente externo a las reglas de cortafuegos.
- Modifica la cuenta
TESTUSERo crea una cuenta de usuario vinculada a la dirección IP de origen de tu cliente externo.
gcloud compute instances create my-server --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform
Instalar el cliente de MySQL
En los siguientes pasos se describe cómo instalar MySQL en una instancia de Compute Engine.
Instalar el servidor MySQL
En los siguientes pasos se describe cómo instalar MySQL en una instancia de Compute Engine.
Mejorar la seguridad de la instalación de MySQL
Debes establecer una contraseña raíz para MySQL y realizar tareas básicas de mantenimiento de seguridad en la configuración del servidor MySQL. Para obtener más información, consulta la documentación de MySQL sobre
mysql_secure_installation.Configurar el servidor MySQL
Para poder conectarte de forma remota al servidor MySQL, debes configurarlo para que escuche en su dirección IP interna. A continuación, crea una cuenta de usuario no root para que el cliente MySQL se conecte al servidor.
Todos los comandos de cliente de MySQL deben incluir determinadas marcas de línea de comandos (por ejemplo, para autenticar). Los comandos de MySQL de esta sección incluyen las siguientes marcas:
--userpara el nombre de usuario,-ppara la contraseña y-epara ejecutar la instrucción dada y salir inmediatamente. Para obtener más información, consulta la referencia de las opciones de comandos de MySQL 5.7.Crear un usuario de MySQL
La conexión remota como usuario root se ha inhabilitado con el comando
mysql_secure_installationanterior. Debes crear un usuario con los permisos necesarios para permitir las conexiones remotas.Quitar la dirección IP externa de
my-serverLa instancia
my-serverno necesita una dirección IP externa porque el cliente puede acceder amy-servera través de una dirección IP interna.Verificar el acceso remoto de un cliente a una instancia de servidor
En los pasos que se indican a continuación se describe cómo conectarse al servidor MySQL de
my-serverdesde tu instancia demy-client.Con estos pasos se verifica que tu cliente MySQL puede conectarse correctamente al servidor MySQL a través de la dirección IP interna.
Consideraciones sobre el cortafuegos en entornos de producción
La configuración de red predeterminada de Google Cloud incluye una regla de cortafuegos
default-allow-internalque permite el tráfico interno entre instancias de Compute Engine en una amplia gama de puertos, incluido el puerto de MySQL, el puerto3306. En entornos no predeterminados con una superficie de seguridad establecida, es posible que tengas que crear una regla de cortafuegos para permitir que tu instancia demy-clientse comunique con tu instancia demy-servera través de la red. De lo contrario, las dos instancias no podrán comunicarse entre sí.Puedes basar las reglas de cortafuegos en intervalos de direcciones IP o etiquetas. Los intervalos de direcciones IP son útiles si quieres conceder acceso a un amplio intervalo de direcciones IP internas. Por otro lado, si quieres conceder acceso a instancias específicas de tu red, las etiquetas ofrecen una solución más flexible. Las etiquetas facilitan la incorporación de nuevos clientes sin conceder acceso a una amplia gama de direcciones IP. Solo tienes que asignar la etiqueta adecuada a la nueva instancia de cliente de MySQL. Por ejemplo, puedes crear una regla de cortafuegos que permita el tráfico de todas las instancias de cliente etiquetadas con
mysql-client.Para admitir reglas de cortafuegos que usen etiquetas, puedes asignar las etiquetas adecuadas a las VMs
my-clientymy-serveren Cloud Shell.gcloud compute instances add-tags my-client --tags mysql-client --zone=ZONE gcloud compute instances add-tags my-server --tags mysql-server --zone=ZONEAñadir una nueva regla de cortafuegos
En los pasos siguientes se describe cómo crear una regla de cortafuegos para permitir que las instancias con la etiqueta
my-clientse comuniquen con las instancias que tienen la etiquetamy-servermediante el puerto3306.Ahora puede conectarse a MySQL desde
my-client.Consideraciones sobre el acceso de clientes externos
En este tutorial se explica cómo acceder desde clientes MySQL a servidores MySQL que se ejecutan en Compute Engine. Permitir el acceso desde un cliente que no se ejecuta en Compute Engine queda fuera del ámbito de este tutorial. Si necesitas permitir el acceso que no sea de Compute Engine, modifica lo siguiente:
-
Name the instance
gcloud compute instances create my-client --zone=ZONE --image-project=ubuntu-os-cloud --image-family=ubuntu-1804-lts --scopes=https://www.googleapis.com/auth/cloud-platform