En mi caso, la Base de Datos está en un hosting privado desde el cual solo es accesible a través de una IP fija: el servidor de producción.
Como el router de mi casa va cambiando periodicamente la IP, cada cierto tiempo voy perdiendo la conexión con la Base de Datos… y sería un fallo de seguridad abrir todo el rango de IPs para que, aunque mi IP cambie, no pierda la conexión…
La configuración que está en el servidor de producción es:
mysql -h dirección.basededatos.com:35333 -u admin
Pero desde mi ordenador de casa no puedo usar esta configuración porque, como he dicho antes, dirección.basededatos.com solo admite conexiones desde 1 sola IP, que es el servidor de producción.
Para arreglar esto podemos exponer un puerto remoto desde el servidor hacia mi ordenador de casa (haciendo forward), lo que vendría a ser:
Local (3306) —> VPN/SSH —> Servidor de producción —> Internet (35333) -> Base de datos
o traducido a shell:
ssh -L localhost:3306:dirección.basededatos.com:35333 -N usuario@nuestro-servidor.com
-L para definir las opciones de enrutamiento: puerto_local:dirección_remota:puerto_remoto
-N para que no ejecute el comando y cierre el terminal, sino que deje abierta la conexión.
Con esto ya podemos conectarnos desde nuestro ordenador de casa:
mysql -h localhost:3306 -u admin
Mejora: Si esto lo necesitamos para conectanos desde dentro de un contanier docker, abrimos el tunel con:
ssh -L ip-del-docker-anfitrion:3306:dirección.basededatos.com:35333 -N usuario@nuestro-servidor.com
y después para conectarnos:
mysql -h ip-del-docker-anfitrion:3306 -u admin
Para sacar la IP del anfitrion, ejecutamos en nuestro pc:
ip addr show docker0
Docker for mac
Para los que usan macOS el comando cambia un poco porque no existe la interfaz docker0:
ssh -L 3306:dirección.basededatos.com:35333 -N usuario@nuestro-servidor.com
y como host de BD de nuestro proyecto poner: host.docker.interna