Mostramos paso a paso cómo habilitar el acceso externo a una base de datos MySQL (o MariaDB), instalada sobre un equipo con el sistema operativo Linux CentOS 7 Minimal. Con este «truco» podremos acceder desde cualquier equipo de nuestra red LAN e incluso desde cualquier equipo de Internet (si se realiza el NAT oportuno en el router). Lo explicamos para Linux CentOS pero es válido para otras distribuciones de Linux.
- Requisitos para acceso externo a MySQL o MariaDB en equipo Linux CentOS 7.
- Configurar el cortafuegos de Linux CentOS para permitir conexiones por el puerto de MySQL o MariaDB.
- Configurar MySQL o MariaDB para permitir el acceso externo.
- Configuración del usuario de MySQL para acceso externo.
- Herramienta mytop para comprobar conexiones a servidor MySQL en tiempo real.
- Anexo – Ejemplo de contenido de fichero my.cnf o mysqld.cnf.
Requisitos para acceso externo a MySQL o MariaDB en equipo Linux CentOS 7
Necesitaremos disponer de un equipo con el sistema operativo Linux CentOS 7, aunque lo explicado en este artículo puede servir para otras distribuciones de Linux como RedHat o incluso otras versiones (como la 6 de CentOS) y con unas pequeñas variaciones servirá para otras distribuciones como Ubuntu. Dicho servidor tendrá instaldo MySQL Server o MariaDB.
Deberemos tener usuario y contraseña del sistema operativo Linux con permisos de administrador, también usuario y contraseña de un usuario administrador de MySQL Server o MariaDB.
Si queremos habilitar el acceso desde fuera de nuestra red LAN, desde Internet, tendremos que mapear el puerto de MySQL/MariaDB (por defecto el 3306) en el router o cortafuegos de nuestra red hacia la IP del equipo con MySQL/MariaDB. Para un router «normal», accederemos vía web a su configuración y en el menú «Internet» – «Redirección de puertos»:
Añadiremos una nueva redirección (NAT o mapeo), indicando la IP de destino, que debe ser la del servidor con Linux CentOS y MySQL y el puerto que mapearemos (que si no se ha establecido otro por defecto para MySQL y MariaDB es 3306):
Configurar el cortafuegos de Linux CentOS para permitir conexiones por el puerto de MySQL o MariaDB
Deberemos habilitar una regla en el cortafuegos de Linux CentOS 7 para permitir conexiones a través del puerto 3306 (o el que hayamos establecido para MySQL/MariaDB). Para ello ejecutaremos en la línea de comandos de Linux CentOS 7 lo siguiente:
firewall-cmd –permanent –add-port=3306/tcp
Y este otro para recargar las reglas:
firewall-cmd –reload
No debemos olvidar que en muchos casos tendremos habilitado (enforcing) el SELinux de CentOS, por lo tanto debemos configurarlo también para que permita las conexiones de MySQL/MariaDB, ejecutando este comando:
semanage port -a -t mysqld_port_t 3306 -p tcp
Si nos aparece el mensaje:
-bash: semanage: no se encontró la orden
deberemos instalar el paquete policycoreutils-python con este comando:
yum install policycoreutils-python
y volver a probar.
En definitiva deberemos configurar apropiadamente el cortafuegos que tengamos habilitado en nuestro equipo Linux, sea de la distribución que sea, abriendo el puerto de MySQL o MariaDB.
En otras distribuciones podremos usar el siguiente comando para abrir el puerto de MySQL:
iptables -I INPUT -p tcp –dport 3306 -m state –state NEW,ESTABLISHED -j ACCEPT
service iptables save
Configurar MySQL o MariaDB para permitir el acceso externo
Deberemos revisar la configuración de MySQL o MariaDB, que en el caso de Linux CentOS se encuentra en el fichero:
/etc/my.cnf
Para el caso de otras distribuciones como Linux Ubuntu 18 se puede encontrar en:
/etc/mysql/mysql.conf.d/mysqld.cnf
Editaremos este fichero de configuración con cualquier editor (vi, nano, etc.), descomentaremos (si está comentada) la línea:
skip-external-locking
y la línea:
bind_address = 127.0.0.1
la cambiaremos por:
bind_address = 0.0.0.0
Si tenemos la línea:
skip-networking
La comentaremos y dejaremos:
#skip-networking
Configuración del usuario de MySQL para acceso externo
Con lo anterior ya tendremos acceso de forma externa a nuestro servidor MySQL, desde cualquier otro equipo de nuestra red LAN o desde Internet. Por último nos quedaría configurar el usuario con el que vamos a acceder a MySQL, para permitirle conexiones externas. Podemos realizar este paso desde la línea de comandos, conectándonos a MySQL con el comando:
mysql -u root -p
(o bien cambiando root por un usuario con permisos de DBA o administrador de MySQL)
Crearemos un usuario con los permisos que queramos, usando esta orden en la línea de comandos de MySQL:
grand all privileges on nombre_bd.* to ‘nombre_usuario’@’%’ identified by ‘contraseña_usuario’ with grant option;
Teniendo en cuenta lo siguiente:
- nombre_bd.*: dará permisos para la base de datos nombre_bd y para todas sus tablas (*). Si queremos darle permisos a todos los esquemas/bases de datos podremos usar *.* y si queremos darle permisos para una única tabla de la base de datos usaremos nombre_bd.nombre_tabla.
- ‘nombre_usuario’@’%’: con esto indicaremos el nombre del usuario al que permitiremos el acceso y desde qué IP o rango de IP. Y si queremos permitirle el acceso desde cualquier IP pondremos %. Por ejemplo, si solo queremos darle acceso desde cualquier IP del rango 192.168.1.x pondremos ‘nombre_usuario’@’192.168.1.%’.
- identified by ‘contraseña_usuario’: introduciremos aquí la contraseña que se establecerá para este usuario.
Si nos da este error:
ERROR 1827 (HY000): The password hash doesn’t have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.
Puede deberse a que tenemos establecida una política de seguridad para la contraseña. Para establecerla debemos generarla previamente con con la orden (siempre ejecutando desde la línea de comandos de MySQL):
select PASSWORD(‘miclave’);
(Cambiando «miclave» por la contraseña que queramos para el usuario)
Por lo tanto sería esta la contraseña que introduciríamos en el comando anterior:
grand all privileges on nombre_bd.* to ‘nombre_usuario’@’%’ identified by ‘*9DFEE097279EFB6742DD80AF8809C3C6DD57CD08’ with grant option;
Ejecutaremos en esta misma consola el siguiente comando para hacer efectivos los permisos:
flush privileges;
Y reiniciaríamos el servicio de MySQL para que se apliquen los posibles cambios que hayamos hecho en el fichero de configuración con:
systemctl restart mysql
En otras distribuciones podremos usar:
service mysql restart
o también:
/etc/init.d/mysql restart
Herramienta mytop para comprobar conexiones a servidor MySQL en tiempo real
Recomendamos una herramienta interesante para comprobar y ver las conexiones que se van produciendo a MySQL Server en tiempo real, se trata de mytop y se puede instalar con:
yum install mytop
o también para Ubuntu:
apt-get install mytop
Una vez instalada la ejecutaremos con:
mytop
Y nos mostrará, en tiempo real y actualizándose, las conexiones que se van produciendo a nuestro servidor MySQL, incluso la consulta SQL que se ejecuta y otros datos interesantes para posibles depuraciones y comprobaciones:
Como vemos en la imagen, obtiene datos tan interesantes como:
- Versión del servidor de MySQL, en nuestro caso MySQL 5.7.22.
- Queries: número de consultas que se han ejecutado en el servidor.
- qps: número de consultas por segundo de media.
- Slow: número de consultas lentas que se han ejecutado.
- qps now: consultas ejecutándose por segundo actualmente.
- Slow qps: consultas lentas ejecutándose por segundo actualmente.
- Threads: hilos de ejecución activos y sleeping (durmiendo).
- Bps: bytes recibidos (in) y enviados (out) en general y Now actuales.
- Lista de usuarios conectados con el ID, el nombre de usuario, la IP, la base de datos y la última consulta SQL ejecutada.
Anexo – Ejemplo de contenido de fichero my.cnf o mysqld.cnf
# The MySQL database server configuration file.
# You can copy this to one of:
# – «/etc/mysql/my.cnf» to set global options,
# – «~/.my.cnf» to set user-specific options.
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain «#» chars…
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
# * Basic Settings
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
bind_address = 0.0.0.0
# * Fine Tuning
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options = BACKUP
#max_connections = 100