System Administration 2 min de lectura 8 de abril de 2026

Configurar acceso remoto seguro a MariaDB con Firewalld

Pasos para abrir el puerto 3306 de forma segura limitando el tráfico a una IP específica.

Solución en "Dos Clics" (TL;DR)

Guía y script bash para configurar firewalld y MariaDB, permitiendo el acceso remoto al puerto 3306 solo para una IP específica.

Configurar el acceso remoto a una base de datos MariaDB requiere un equilibrio preciso entre conectividad y seguridad. El objetivo es permitir que una IP externa específica se conecte al puerto 3306 sin exponer el servidor a todo internet. Este proceso involucra la configuración de firewalld y el ajuste de las directivas de escucha de MariaDB.

1. El desafío del firewall

Al intentar restringir el acceso mediante firewalld, es común encontrar errores de sintaxis al definir las rich rules. Un error frecuente es el INVALID_RULE: unknown element, que suele ocurrir al intentar dividir la regla en varias líneas sin el escape correcto de caracteres.

Error detectado: La sintaxis multilínea con barras invertidas (\) en terminal puede fallar si no se maneja con cuidado. La solución más robusta es definir la regla en una sola línea.

La regla correcta para permitir el tráfico desde la IP 190.212.124.115 hacia el puerto 3306 es la siguiente:

Terminal (SSH)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="190.212.124.115" port port="3306" protocol="tcp" accept'

2. Configuración de MariaDB

Por defecto, MariaDB está configurado para escuchar solo en 127.0.0.1. Para permitir conexiones remotas, es necesario modificar el archivo de configuración /etc/mysql/mariadb.conf.d/50-server.cnf y cambiar la directiva bind-address a 0.0.0.0.

/etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 0.0.0.0

Tras este cambio, es indispensable reiniciar el servicio para aplicar los cambios: sudo systemctl restart mariadb. Se puede verificar que el servicio está escuchando correctamente con ss -tulnp | grep 3306.

3. Automatización mediante script

Para evitar errores manuales y facilitar la replicación, he consolidado el proceso en un script de Bash. Este script no solo configura el firewall y MariaDB, sino que también crea un usuario restringido (RegUCM) con acceso limitado únicamente a la base de datos necesaria.

allow-ucm-mysql.sh
#!/bin/bash
set -e

# 1. Abrir puerto 3306 para IP específica
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="190.212.124.115" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

# 2. Configurar MariaDB para aceptar conexiones externas
MYSQL_CONF="/etc/mysql/mariadb.conf.d/50-server.cnf"
sudo sed -i 's/^bind-address\s*=.*/bind-address = 0.0.0.0/' "$MYSQL_CONF"
sudo systemctl restart mariadb

# 3. Crear usuario RegUCM con acceso a portal
sudo mariadb <
Consejo Práctico: Siempre que sea posible, evita el uso del usuario root para conexiones remotas. Crear un usuario con privilegios limitados a una base de datos específica es una práctica de seguridad fundamental.
La historia detrás de la nota

Automatizar este proceso no solo ahorra tiempo, sino que elimina el riesgo de cometer errores de sintaxis en el firewall que podrían dejar el servicio inaccesible o, peor aún, demasiado abierto.