Quiere conectar un cliente de escritorio a una base que vive en un servidor. La vía rápida -escuchar en todas las direcciones y abrir el puerto- pone su base delante de todo internet, donde los escáneres la encuentran en horas. Hay una forma mejor que no tarda más.
La respuesta correcta: un túnel SSH
ssh -N -L 3307:127.0.0.1:3306 sara@server.example.com
# then point the client at:
# host 127.0.0.1 port 3307
La base sigue escuchando solo en localhost, no se abre nada en el cortafuegos y SSH cifra la conexión. Todos los clientes de escritorio -TablePlus, DBeaver, Sequel Ace, MySQL Workbench- lo traen incorporado como opción de SSH.
Confirme que no esté ya expuesta
sudo ss -tlnp | grep 3306
# 127.0.0.1:3306 good
# 0.0.0.0:3306 exposed
# /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1
Si de verdad tiene que ser alcanzable
Un servidor de aplicación en otro centro de datos, por ejemplo. Entonces: una red privada si el proveedor la ofrece, una regla de cortafuegos que nombre la dirección de origen exacta, un usuario limitado a ese anfitrión y TLS obligatorio.
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY '...' REQUIRE SSL;
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.20';
Compruebe lo que ya existe
SELECT user, host FROM mysql.user ORDER BY host;
Toda fila con % en la columna del anfitrión merece una explicación. Vea usuarios y permisos, sin dar de más.