Túneles, aplicados a MySQL - perfeccion-ar/infraestructura-clasica-y-avanzada GitHub Wiki
En ocasiones no podemos acceder a phpMyAdmin, porque no está exhibido hacia afuera. O si existe, está adentro de la red de la empresa.

Lo mismo sucede frecuentemente con el puerto 3306 de MySQL, o el 443 de la API del Kubernetes, etc: ninguno de ellos se exhibe hacia afuera. Ésto no nos permite hacer, por ejemplo, desde casa, mysql -u root -p -H 37.27.49.225
- Tampoco nos permite abrir una conexión desde algún bonito cliente para MySQL, como MySQL Workbench, HeidiSQL, Datagrip, DBbeaver, etc
Sin embargo, tenemos acceso al equipo por SSH, y esto es muy útil, porque podemos canalizarnos por adentro para llegar MySQL, o a cualquier otro servicio.
Típicamente en las empresas y en los clouds se pone un firewall adelante, y se deja entrar solo la ip domiciliaria. En las empresas por ejemplo, con Fortinet. En Gcloud, con el propio firewall de Gcloud. En nuestro simple server sería con iptables, o alguna interface como UFW (Uncomplicated Firewall). Pero por ahora lo dejamos así.
Es decir, usamos nuestro acceso SSH al puerto proxeado del container (ej 2225 en el host hacia el 22 del container LXD) para llegar a otro servicio (Apache, MySQL, Kubernetes, etc), o para llegar a otro servicio de red interna de otro equipo al que pueda llegar nuestro container LXD, devenido ahora en Bastión.
Ya sabíamos, por cierto, que conectados a nuestro container LXD, podemos usarlo de Bastión en su forma mas simple, ya sea saltando a otro equipo mediante ssh, o tratando de conectarnos a otros servicios. Siguiendo con MySQL, y como ejemplo,
mysql -u root -h ip_otra_maquina_u_otro_container
Pero no perdamos el objetivo: la idea es entrar a MySQL desde nuestra máquina directamente. No entrando con ssh primero al host Bastión, y luego volviendo a saltar con el comando mysql, lo cual es incómodo, y como dijimos, no funciona bien con clientes gráficos. Entonces, veamos como hacerlo con un túnel:
- En la máquina domiciliaria, corremos el siguiente comando. Ello creará un túnel que durará 3600 segundos, al host, puerto 2225, entre la máquina de Adrian (10.19.29.224) y la maquina domiciliaria, usando de puente al host 37.27.49.225. Canalizamos localmente (127.0.0.1) el puerto 50000 hacia puerto 3306 que está adentro de la máquina remota (el container 10.19.29.224).
ssh -v [email protected] -nN -p 2225 -L127.0.0.1:50000:10.19.29.224:3306 sleep 3600
La dirección 10.19.29.224 se puede obtener simplemente con preguntarle al container con Mysql cuál es la ip asociada a su placa externa eth0

Este túnel hay que dejarlo corriendo, debuggeando la conexión. Los certificados id_rsa.pub deben estar en el /root/.ssh/authorized_keys
del container destino. Si se pulsa Ctrl + C, el túnel se corta.
- Adentro del container, hace falta abrir el puerto 3306 para todas las interfaces del propio container
Abrimos con nano o con vim el archivo /etc/mysql/mysql.conf.d/mysqld.cnf
Esta línea
bind-address = 127.0.0.1
La comentamos, y agregamos esta otra línea
bind-address = 0.0.0.0
Reiniciamos MySQL con systemctl restart mysql
Ya podemos probar localmente. Por ejemplo, si tenemos Ubuntu en nuestra compu, o Ubuntu bajo WSL, y hemos instalado el paquete mysql-common
, ya tenemos en la línea de comandos el cliente mysql
- Estando habilitado el túnel, podemos conectarnos haciendo
mysql -u root -p'Pepelepu1.' -h 127.0.0.1 -P 50000

Ya podemos incluso hacer dumps e importaciones locales sin necesidad de subir y bajar archivos con scp! Ejemplo:
mysqldump -u root -p'Pepelepu1.' -h 127.0.0.1 -P 50000 agenda> agenda-backup.sql
También podemos apuntar cualquier cliente gráfico de MySQL al puerto 50000.
Aunque lo podemos apuntar al puerto 50000, en modo localhost, a veces el mismo cliente tiene opción para tunelearse vía SSH. En el caso de DBeaver (Ubuntu: sudo snap install dbeaver-ce
) los pasos serían


Y luego disfrutar de una interface mas ordenada que nuestro phpMyadmin, con todas las bases de todos los servers en una sola interface


