Cómo conectar con un servidor MySQL de manera remota, desde otro servidor o estación de trabajo para el acceso a las bases de datos.
Una duda típica para desarrolladores es cómo conectar con un servidor MySQL de manera remota, de modo que puedas realizar acciones de administración o acceso a una base de datos, desde otros ordenadores o servidores distintos a donde se encuentra alojada.
Lo vamos a tratar en este artículo de manera que puedas resolver los problemas típicos de las conexiones remotas con MySQL, o incluso con MariaDB, ya que básicamente el procedimiento será el mismo.
Casos de uso de las conexiones remotas a MySQL
Dependiendo de tu situación o necesidad, es posible que tengas que realizar las conexiones remotas con MySQL de distintos modos. Básicamente dividiría los distintos casos en estas situaciones:
- Conectar a MySQL desde un servidor web que está en otra máquina. Esta situación sería típica en el desplegue de aplicaciones en servidores, pudiendo colocar la base de datos en un servidor y los archivos de la web en otro u otros.
- Conectarse a una base de datos MySQL / MariaDB que está en un servidor de Internet, generalmente para el acceso a los datos en crudo y la administración de de las tablas de la base de datos.
Conexión remota a MySQL desde un servidor web, distinto al servidor de la base de datos
Si queremos disponer de una arquitectura aplicación distribuida en varios servidores, algo básico sería disponer de un servidor de bases de datos y un servidor web. De esta manera podemos tener dos máquinas para implementar la aplicación, lo que nos permite una sencilla distribución de la carga de trabajo.
Desde el servidor web nos conectaremos con la base de datos para obtener la información necesaria para poder realizar los procesos de la aplicación. Para ello necesitamos unas configuraciones bastante específicas en el servidor de bases de datos:
- Apertura del puerto 3306, que es el predeterminado para MySQL / MariaDB
- Creación de un usuario en MySQL con permisos de trabajo sobre la base de datos a la que se pretende acceder y que pueda hacer conexiones remotas.
- Configuración de MySQL para que acepte las conexiones remotas
Se recomienda abrir las conexiones remotas solamente para determinadas IP. Esto es perfectamente posible ya que el servidor web desde donde nos necesitamos conectar tendrá una IP determinada. Así que podemos usar esa IP en la configuración para mimitas las conexiones a ella, y con ello evitar que se puedan conectar a MySQL desde IPs diferentes. Será el caso que veremos en este artículo.
Apertura del puerto 3306
Esta configuración la tienes que realizar en el firewall del servidor donde está instalado el gestor de bases de datos. Los pasos dependerán de qué firewall estés usando en tu servidor.
Un firewall típico para sistemas Linux sería UFW. Si tenemos este firewall en nuestro sistema podríamos abrir el puerto usando un comando como este:
sudo ufw allow from 0.0.0.0 to any port 3306
Lógicamente, tendrás que sustituir 0.0.0.0 por la IP del servidor web desde donde quieres conectar con el servidor MySQL.
También podrías seleccionar un grupo de IPs desde las que quieres conectar. Para ello podrías indicar el comando como este:
sudo ufw allow from 0.0.0.0/10 to any port 3306
Por último, si quieres dar permisos para conexión desde cualquier IP, lo que no sería necesario generalmente, también podrías hacerlo con el comando:
sudo ufw allow 3306
Insisto, estos son los comandos para la configuración del firewall UFW, pero si no usas este software, tendrás que documentarte con el firewall que corresponda.
Crear una base de datos y un usuario con permisos de acceso remoto
Ahora tenemos que crear la base de datos a la que queremos acceder remotamente y el usuario que usaremos para poder acceder a ella.
Esta serie de comandos la tenemos que realizar desde el cliente de MySQL, por lo que nos tendremos que conectar por SSH con el servidor donde está la base de datos y luego haciendo acceso a MySQL por línea de comandos.
Una vez logueado en MySQL, creamos la base de datos, si es que no la has creado ya:
create database bbdd;
Creamos un usuario al que permitimos conectar desde una IP determinada:
create user mi_usuario@0.0.0.0;
De nuevo, colocarás la IP del servidor web, en lugar de 0.0.0.0. Esto en el caso que solamente te conectes al servidor desde una única IP.
Ahora bien, si las conexiones las vas a realizar desde un rango de IPs puedes por ejemplo usar el carácter "%" como un comodín en la IP del usuario:
create user mi_usuario@0.0.0.%;
También puedes crear los usuarios con una máscara de red como alternativa, así como otras fórmulas que podrías encontrar en la documentación de MySQL.
Luego tendrás que aplicarle una clave a este usuario. Tienes que usar el comando siguiente. cambiando 0.0.0.0 por la fórmula de IP usada en el momento de crear el usuario:
alter user mi_usuario@0.0.0.0 identified by 'secret';
Por último le das permisos a este usuario para acceso a la base de datos que acabamos de crear.
grant all on bbdd.* to mi_usuario@x.x.x.x;
Ahora corremos los procesos para que estos privilegios sean tenidos en cuenta inmediatamente.
flush privileges;
Configurar MySQL para que puedas aceptar conexiones remotas
De manera predeterminada MySQL no acepta conexiones que sean desde otros servidores u ordenadores en general, como medida de seguridad. Por ello tienes que editar los archivos de configuración de MySQL para asegurarte que las conexiones se permiten.
El archivo de configuración de MySQL donde se limita el acceso está en la carpeta " /etc/mysql/mysql.conf.d" y dentro el archivo "mysqld.cnf". Debes editar ese archivo para poder hacer los cambios pertinentes.
Nota: El archivo de configuración de MySQL dependiendo de tu distribución puede estar en otro lugar. Incluso el archivo de configuración puede hacer "include" de varios archivos sueltos. Esto lo tendrás que verificar en tu máquina en concreto. La ruta que he señalado es la que corresponde a Ubuntu.
Encontrarás una línea como esta:
bind-address = 127.0.0.1
Si simplemente comentas esta línea colocando "#" delante, estarás permitiendo accesos desde cualquier IP.
A partir de las versiones de MySQL 8 en adelante, si quieres puedes indicar una lista de IPs separadas por comas.
bind-address = 0.0.0.1,0.0.1.1,0.0.0.2
Después de editar este archivo es necesario reiniciar el servidor de MySQL para que las configuraciones tengan efecto. Esto generalmente lo haces con el comando:
service mysql restart
Completando estos pasos ya tendrás tu sistema dispuesto para recibir conexiones desde otros servidores, desde una o varias IP, según te convenga en tu caso.
Conexión remota a un servidor MySQL desde un ordenador personal
Todo lo visto hasta el momento en este artículo no es necesario realizarlo en el caso que quieras simplemente conectarte contra una base de datos remotamente para las acciones típicas de gestión de una base de datos, como ver las tablas, crear y borrar tablas, ver datos y editarlos, etc.
Para trabajar con una base de datos durante el desarrollo y mantenimiento de la aplicación, en vez de abrir las conexiones remotas en el servidor, lo normal es usar lo que se llama Túneles SSH. Obviamente, es mucho más interesante y seguro utilizar un túnel SSH en comparación con abrir las conexiones remotas en el servidor de MySQL.
La mayoría de los programas que permiten administrar MySQL mediante interfaz gráfica como HeidiSQL, MySQL Workbench o Sequel Pro tienen funciones para poder realizar la conexión por medio de SSH. Una vez conectados por SSH son capaces de acceder a MySQL sin necesidad de abrir ningún puerto adicional en el servidor remoto.
Este tipo de conexiones por túnel SSH se configuran de manera distinta dependiendo del software que vayamos a usar, pero todos atienden a unas reglas básicas:
- Usaremos el mismo método de conexión SSH que utilizamos comúnmente con el terminal. Por ejemplo, el usuario y la contraseña del servidor remoto o la llave SSH que hayamos configurado.
- Usaremos un usuario MySQL que permita conexiones en "localhost". Como se está aplicando el túnel SSH es como si estuviéramos dentro del servidor, por tanto, una vez dentro podemos acceder a MySQL sencillamente con usuarios que permiten acceso mediante conexiones por "localhost". Por ello, no es necesario crear usuarios específicos para usar con túneles SSH.
A continuación puedes ver la ventana de conexión de un acceso remoto en Sequel Pro. En tu software se realizará de otra manera posiblemente, con otro formulario, aunque en definitiva los datos serían muy parecidos.
En este otro artículo puedes ver otras alternativas de conexión remota a MySQL seguras que podrían interesarte.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...