Introducción
De forma predeterminada, el servidor MySQL solo acepta conexiones desde localhost, lo que significa que solo pueden acceder las aplicaciones que se ejecutan en el mismo host.
Sin embargo, en algunas situaciones, es necesario permitir conexiones remotas. Por ejemplo, cuando desee conectarse al servidor MySQL remoto desde su sistema local o cuando utilice una implementación de varios servidores donde la aplicación se ejecuta en una computadora que no sea el servidor de la base de datos.
En esta guía, seguiremos los pasos necesarios para permitir conexiones remotas a un servidor MySQL. Las mismas instrucciones se aplican a MariaDB.
Configuración del servidor MySQL
El primer paso es configurar el servidor MySQL para escuchar en una dirección IP específica o todas las direcciones IP en la máquina.
Si el servidor MySQL y los clientes pueden comunicarse entre sí a través de una red privada, la mejor opción es configurar el servidor MySQL para que escuche solo en la IP privada. De lo contrario, si desea conectarse al servidor en una red pública, configure el servidor MySQL para que escuche todas las direcciones IP de la máquina.
Para hacer esto, necesita editar el archivo de configuración de MySQL y agregar o cambiar el valor de la opción bind-address. Puede establecer una única dirección IP y rangos de IP. Si la dirección se establece en 0.0.0.0, el servidor MySQL acepta conexiones en todas las interfaces IPv4 del host. Si ha configurado IPv6 en su sistema, en lugar de usar 0.0.0.0 use :: en su lugar.
La ubicación del archivo de configuración de MySQL varía según la distribución. En Ubuntu y Debian, el archivo se encuentra en /etc/mysql/mysql.conf.d/mysqld.cnf, mientras que en distribuciones basadas en Red Hat, como CentOS, el archivo se encuentra en /etc/my.cnf.
Abra el archivo con su editor de texto:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Busque la línea de dirección de enlace, de forma predeterminada, el valor se establece en 127.0.0.1 (escuchar solo en localhost).
En este ejemplo, configuraremos el servidor MySQL para que escuche en todas las interfaces IPv4 cambiando el valor a 0.0.0.0:
bind-address = 0.0.0.0
# skip-networking
Si hay una línea que contiene skip-networking, coméntela agregando # al principio de la línea.
En MySQL 8.0 y posteriores, es posible que el parámetro bind-address no esté presente. En este caso, agréguelo en la sección [mysqld].
Cuando termine, reinicie el servicio MySQL para que los cambios surtan efecto. Solo los usuarios root o con privilegios de sudo pueden reiniciar los servicios.
Para reiniciar el servicio MySQL en Debian o Ubuntu, escriba:
sudo systemctl restart mysql
En distribuciones basadas en RedHat como CentOS para reiniciar la ejecución del servicio:
sudo systemctl restart mysqld
Otorgar acceso a un usuario desde una máquina remota
El siguiente paso es permitir que el usuario remoto acceda a la base de datos.
Inicie sesión en el servidor MySQL como root escribiendo:
sudo mysql
Si está utilizando el antiguo complemento de autenticación MySQL nativo para iniciar sesión como root, ejecute el siguiente comando e ingrese la contraseña cuando se le solicite:
mysql -u root -p
Desde dentro del shell de MySQL, use la declaración GRANT para otorgar acceso a su usuario remoto.
GRANT ALL ON database_name.* TO username@'ip_address' IDENTIFIED BY 'password';
Dónde está:
- database_name es el nombre de la base de datos a la que se conectará el usuario.
- username es el nombre del usuario de MySQL.
- ip_address es la dirección IP desde la que se conectará el usuario. Utilice % para permitir que el usuario se conecte desde cualquier dirección IP.
- contraseña es la contraseña del usuario.
Por ejemplo, para otorgar acceso a una base de datos con el nombre db_noviello por un usuario llamado dbuser con contraseña 12345678 desde una computadora cliente con IP 10.10.99.99, ejecute:
GRANT ALL ON db_noviello.* TO dbuser@'10.10.99.99' IDENTIFIED BY '12345678';
Configuración del cortafuegos
El último paso es configurar el firewall para permitir el tráfico en el puerto 3306 (puerto predeterminado de MySQL) desde computadoras remotas.
iptables
Si está utilizando iptables como firewall, el siguiente comando permitirá el acceso desde cualquier dirección IP en Internet al puerto MySQL (no recomendado):
sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
Permitir el acceso desde una dirección IP específica:
sudo iptables -A INPUT -s 10.10.99.99 -p tcp --destination-port 3306 -j ACCEPT
UFW
UFW es la herramienta de firewall predeterminada en Ubuntu. Para permitir el acceso desde cualquier dirección IP en Internet (no recomendado):
sudo ufw allow 3306/tcp
Permitir el acceso desde una dirección IP específica:
sudo ufw allow from 10.10.99.99 to any port 3306
Cortafuegos D.
FirewallD es la herramienta de administración de firewall predeterminada en CentOS. Para permitir el acceso desde cualquier dirección IP en Internet (no recomendado):
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload
Para permitir el acceso desde una dirección IP específica en un puerto específico, puede crear una nueva zona de FirewallD o usar una regla avanzada.
Cree una nueva zona llamada mysqlzone:
sudo firewall-cmd --new-zone=mysqlzone --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.10.99.99/32
sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp
sudo firewall-cmd --reload
Verificar cambios
Para verificar que el usuario remoto puede conectarse al servidor MySQL, ejecute el siguiente comando desde otro servidor o desde su computadora local:
mysql -u username -h ip_address -p
username es el nombre del usuario al que otorgó acceso y ip_address es la dirección IP del host en el que se ejecuta el servidor MySQL.
Si todo está configurado correctamente, podrá acceder al servidor MySQL remoto.
Si recibe un error como el siguiente, el puerto 3306 no está abierto o el servidor MySQL no está escuchando la dirección IP.
ERROR 2003 (HY000): Can't connect to MySQL server on '10.10.99.99' (111)"
El siguiente error indica que el usuario al que está intentando acceder no tiene permisos para acceder al servidor MySQL remoto.
"ERROR 1130 (HY000): Host '10.10.99.99' is not allowed to connect to this MySQL server"
Conclusión
La guía está terminada, debería poder conectarse a un servidor de base de datos MySQL remoto.