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';
Nunca cree un usuario con el comodín de anfitrión: un permiso a 'app'@'%' quiere decir desde cualquier punto de la Tierra. Es, con diferencia, la causa más común de que tomen una base de datos, y es un solo carácter.

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.