Está en la página 1de 5

Permitir acceso externo a MySQL o MariaDB en Linux CentOS 7 Minim... https://proyectoa.com/permitir-acceso-externo-a-mysql-o-mariadb-en-l...

Permitir acceso externo a MySQL o MariaDB en


Linux CentOS 7 Minimal - Proyecto A

alonsojpd

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).

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):

1 de 5 06/08/2019 12:57
Permitir acceso externo a MySQL o MariaDB en Linux CentOS 7 Minim... https://proyectoa.com/permitir-acceso-externo-a-mysql-o-mariadb-en-l...

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

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

2 de 5 06/08/2019 12:57
Permitir acceso externo a MySQL o MariaDB en Linux CentOS 7 Minim... https://proyectoa.com/permitir-acceso-externo-a-mysql-o-mariadb-en-l...

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)

3 de 5 06/08/2019 12:57
Permitir acceso externo a MySQL o MariaDB en Linux CentOS 7 Minim... https://proyectoa.com/permitir-acceso-externo-a-mysql-o-mariadb-en-l...

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

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.

4 de 5 06/08/2019 12:57
Permitir acceso externo a MySQL o MariaDB en Linux CentOS 7 Minim... https://proyectoa.com/permitir-acceso-externo-a-mysql-o-mariadb-en-l...

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.

#
# 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.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# 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

5 de 5 06/08/2019 12:57

También podría gustarte