Mysql: Tunelizando la conexión por medio de SSH
Tabla de contenido:
- Reenvío de puerto local
- Reenvío de puerto remoto
- Reenvío de puerto dinámico
- Configurar el túnel SSH en Windows
- Conclusión
El túnel SSH o el reenvío de puertos SSH es un método para crear una conexión SSH encriptada entre un cliente y una máquina servidor a través de la cual se pueden retransmitir los puertos de servicios.
El reenvío de SSH es útil para transportar datos de red de servicios que utilizan un protocolo no encriptado, como VNC o FTP, para acceder a contenido geo-restringido o evitar firewalls intermedios. Básicamente, puede reenviar cualquier puerto TCP y hacer un túnel del tráfico a través de una conexión SSH segura.
Hay tres tipos de reenvío de puertos SSH:
- Reenvío de puertos locales. - Reenvía una conexión desde el host del cliente al host del servidor SSH y luego al puerto del host de destino. Reenvío de puerto remoto. - Reenvía un puerto desde el host del servidor al host del cliente y luego al puerto del host de destino. Reenvío de puerto dinámico. - Crea un servidor proxy SOCKS que permite la comunicación a través de una variedad de puertos.
, hablaremos sobre cómo configurar túneles SSH cifrados locales, remotos y dinámicos.
Reenvío de puerto local
El reenvío de puerto local le permite reenviar un puerto en la máquina local (cliente ssh) a un puerto en la máquina remota (servidor ssh), que luego se reenvía a un puerto en la máquina de destino.
En este tipo de reenvío, el cliente SSH escucha en un puerto determinado y hace un túnel de cualquier conexión a ese puerto al puerto especificado en el servidor SSH remoto, que luego se conecta a un puerto en la máquina de destino. La máquina de destino puede ser el servidor SSH remoto o cualquier otra máquina.
El reenvío de puertos locales se usa principalmente para conectarse a un servicio remoto en una red interna, como una base de datos o un servidor VNC.
En Linux, macOS y otros sistemas Unix para crear un reenvío de puerto local pasan la opción
-L
al cliente
ssh
:
ssh -L LOCAL_PORT:DESTINATION:DESTINATION_PORT SSH_SERVER
Las opciones utilizadas son las siguientes:
-
LOCAL_PORT
: la IP de la máquina local y el número de puerto. Cuando se omiteLOCAL_IP
el cliente ssh se une a localhost.DESTINATION:DESTINATION_PORT
: la IP o el nombre de host y el puerto de la máquina de destino.SERVER_IP
: el usuario SSH remoto y la dirección IP del servidor.
Puede usar cualquier número de puerto mayor que
1024
como
LOCAL_PORT
. Los números de puertos inferiores a
1024
son puertos privilegiados y solo pueden ser utilizados por root. Si su servidor SSH está escuchando en un puerto que no sea el 22 (el predeterminado) use la opción
-p
.
El nombre de host de destino debe poder resolverse desde el servidor SSH.
Supongamos que tiene un servidor de base de datos MySQL que se ejecuta en la máquina
db001.host
en una red interna (privada), en el puerto 3306 al que se puede acceder desde la máquina
pub001.host
y desea conectarse utilizando su cliente local
mysql
máquina al servidor de la base de datos. Para hacerlo, puede reenviar la conexión de esta manera:
ssh -L 3336:db001.host:3306 [email protected]
Una vez que ejecute el comando, se le pedirá que ingrese la contraseña de usuario SSH remota. Después de ingresarlo, iniciará sesión en el servidor remoto y se establecerá el túnel SSH. Es una buena idea configurar una autenticación basada en clave SSH y conectarse al servidor sin ingresar una contraseña.
Ahora, si señala su cliente de base de datos de máquina local a
127.0.0.1:3336
, la conexión se reenviará al servidor MySQL
db001.host:3306
través de la máquina
pub001.host
que actuará como un servidor intermedio.
Puede reenviar múltiples puertos a múltiples destinos en un solo comando ssh. Por ejemplo, tiene otro servidor de base de datos MySQL que se ejecuta en la máquina
db002.host
y desea conectarse a ambos servidores desde su cliente local que ejecutaría:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 [email protected]
Para conectarse al segundo servidor, usaría
127.0.0.1:3337
.
Cuando el host de destino es el mismo que el servidor SSH, en lugar de especificar la IP del host de destino o el nombre de host, puede usar
localhost
.
Supongamos que necesita conectarse a una máquina remota a través de VNC que se ejecuta en el mismo servidor y no es accesible desde el exterior. El comando que usarías es:
ssh -L 5901:127.0.0.1:5901 -N -f [email protected]
La opción
-f
le dice al comando
ssh
que se ejecute en segundo plano y que
-N
no ejecute un comando remoto. Estamos usando
localhost
porque el VNC y el servidor SSH se están ejecutando en el mismo host.
Reenvío de puerto remoto
El reenvío de puerto remoto es lo opuesto al reenvío de puerto local. Le permite reenviar un puerto en la máquina remota (servidor ssh) a un puerto en la máquina local (cliente ssh), que luego se reenvía a un puerto en la máquina de destino.
En este tipo de reenvío, el servidor SSH escucha en un puerto determinado y canaliza cualquier conexión a ese puerto al puerto especificado en el cliente SSH local, que luego se conecta a un puerto en la máquina de destino. La máquina de destino puede ser la máquina local o cualquier otra.
En Linux, macOS y otros sistemas Unix para crear un reenvío de puerto remoto pasan la opción
-R
al cliente
ssh
:
ssh -R REMOTE_PORT:DESTINATION:DESTINATION_PORT SSH_SERVER
Las opciones utilizadas son las siguientes:
-
REMOTE_PORT
: la IP y el número de puerto en el servidor SSH remoto. UnREMOTE
vacío significa que el servidor SSH remoto se enlazará en todas las interfaces.DESTINATION:DESTINATION_PORT
: la IP o el nombre de host y el puerto de la máquina de destino.SERVER_IP
: el usuario SSH remoto y la dirección IP del servidor.
El reenvío de puertos locales se usa principalmente para dar acceso a un servicio interno a alguien desde el exterior.
Supongamos que está desarrollando una aplicación web en su máquina local y desea mostrar una vista previa a su compañero desarrollador. No tiene una IP pública, por lo que el otro desarrollador no puede acceder a la aplicación a través de Internet.
ssh -L 8080:127.0.0.1:3000 -N -f [email protected]
El comando anterior hará que el servidor ssh escuche en el puerto
8080
y canalice todo el tráfico desde este puerto a su máquina local en el puerto
3000
.
Ahora su compañero desarrollador puede escribir
the_ssh_server_ip:8080
en su navegador y obtener una vista previa de su increíble aplicación.
Reenvío de puerto dinámico
El reenvío dinámico de puertos le permite crear un socket en la máquina local (cliente ssh) que actúa como un servidor proxy SOCKS. Cuando un cliente se conecta a este puerto, la conexión se reenvía a la máquina remota (servidor ssh), que luego se reenvía a un puerto dinámico en la máquina de destino.
De esta manera, todas las aplicaciones que usan el proxy SOCKS se conectarán al servidor SSH y el servidor reenviará todo el tráfico a su destino real.
En Linux, macOS y otros sistemas Unix para crear un reenvío de puerto dinámico (SOCKS) pasan la opción
-D
al cliente
ssh
:
ssh -D LOCAL_PORT SSH_SERVER
Las opciones utilizadas son las siguientes:
-
LOCAL_PORT
: la IP de la máquina local y el número de puerto. Cuando se omiteLOCAL_IP
el cliente ssh se une a localhost.SERVER_IP
: el usuario SSH remoto y la dirección IP del servidor.
Un ejemplo típico de un reenvío de puerto dinámico es hacer un túnel del tráfico del navegador web a través de un servidor SSH.
El siguiente comando creará un túnel SOCKS en el puerto
9090
:
ssh -D 9090 -N -f [email protected]
Una vez que se establece el túnel, puede configurar su aplicación para usarlo. Este artículo explica cómo configurar Firefox y el navegador Google Chrome para usar el proxy SOCKS.
El reenvío de puertos debe configurarse por separado para cada aplicación que desee tunelizar el tráfico.
Configurar el túnel SSH en Windows
Los usuarios de Windows pueden crear túneles SSH utilizando el cliente PuTTY SSH. Puedes descargar PuTTY aquí.
-
Inicie Putty e ingrese la dirección IP del servidor SSH en el campo
Host name (or IP address)
delHost name (or IP address)
.Aparecerá una nueva ventana pidiéndole su nombre de usuario y contraseña. Una vez que ingrese su nombre de usuario y contraseña, iniciará sesión en su servidor y se iniciará el túnel SSH.
La configuración de la autenticación de clave pública le permitirá conectarse a su servidor sin ingresar una contraseña.
Conclusión
Le hemos mostrado cómo configurar túneles SSH y reenviar el tráfico a través de una conexión SSH segura. Para facilitar su uso, puede definir el túnel SSH en su archivo de configuración SSH o crear un alias Bash que configurará el túnel SSH.
seguridad sshCómo configurar el túnel ssh para evitar un firewall
Un firewall es algo bueno, pero si te impide hacer algo, entonces el túnel SSH es una buena opción para explorar.
Cómo verificar los puertos de escucha en Linux (puertos en uso)
Este artículo explica cómo averiguar los puertos en uso y qué servicios están escuchando en qué puertos utilizando los comandos netstat, ss y lsof. Las instrucciones son aplicables para todos los sistemas operativos basados en Linux y Unix como macOS.
Cómo configurar el túnel de calcetines ssh para navegación privada
Este tutorial lo guiará a través del proceso de crear un túnel SSH encriptado y configurar los navegadores web Firefox y Google Chrome para usar el proxy SOCKS.