Imprimir

Entunelar protocolos con OpenSSH (Port Forwarding)

Con OpenSSH se puede crear un túnel encriptado entre dos máquinas y enviar a través de él los datos de otros protocolos (es un tipo de VPN, Virtual Private Network, Red Privada Virtual). Esto es útil, por ejemplo:

  • para entunelar protocolos que son inseguros por enviar la información sin cifrar, como Telnet, FTP, HTTP, MySQL, las X, etc.
  • para atravesar un firewall donde sólo está permitido SSH.

El único requisito para configurar un túnel SSH es que sea un protocolo basado en TCP, por lo que este método no se puede aplicar a servicios UDP como DHCP, NFS, NetBIOS, etc.

Vamos a verlo con un ejemplo. Desde el cliente queremos hacer consultas al servidor de base de datos MySQL instalado en el servidor. Pero MySQL no soporta conexiones seguras entre los clientes y el servidor, de manera que la identificación de los usuarios remotos y los datos de las consultas serán visibles a cualquier máquina de la red. Por ello, utilizaremos SSH para establecer una conexión segura, de la siguiente manera:

Entunelar MySQL

  • en el cliente, el cliente MySQL (mysql) hace una petición al puerto 3306 TCP de localhost, donde escucha el cliente SSH (ssh).
  • el cliente SSH (ssh) escucha el puerto 3306 TCP y redirecciona las peticiones al servidor SSH (sshd) a través del túnel, de manera que todo el tráfico de datos entre el cliente y el servidor MySQL van cifrados por la red.
  • en el servidor, el servidor SSH (sshd) redirecciona el tráfico procedente del túnel al puerto 5000 TCP de localhost, donde escucha el servidor MySQL (mysqld), de manera que éste ve las conexiones como procedentes de la propia máquina.

Veamos cuál es el procedimiento a seguir:

  1. configuramos el servidor MySQL para que escuche en el puerto 5000 TCP de localhost. Para ello, editaremos el archivo de configuración /etc/mysql/my.cnf:
    [mysqld]
    #skip-networking
    bind-address = 127.0.0.1
    port = 5000

    Una vez reiniciado el servidor MySQL, sólo podremos conectar con la base de datos desde localhost, en la máquina local.

  2. levantamos el túnel desde el cliente con el siguiente comando (el túnel se establecerá una vez introducido el password):
    francis@asterix:~$ ssh -N -L 3306:127.0.0.1:5000 usuario@servidor
    Password:
    • 3306:127.0.0.1:5000: abre un túnel que conecta el puerto 3306 del cliente con el 5000 del servidor, en cuyos extremos están el cliente y el servidor SSH.
    • -N: esta opción establece el túnel, ya que indica no ejecutar comandos remotos.
    • -L: indica que este extremo es el cliente del túnel.
  3. para conectarnos al servidor MySQL desde el cliente tenemos que conectar con el extremo local del túnel, ejecutando:
    francis@asterix:~$ mysql -u root -h 127.0.0.1 -p test
    Enter password:
    mysql>

Deja un comentario