Configurar túnel SSH (reenvío de puertos) en Windows
Puede utilizar el servidor OpenSSH integrado en Windows para reenviar puertos a través de un túnel SSH (túnel SSH). El reenvío de puertos en SSH le permite tunelizar (reenviar) puertos de aplicaciones desde su computadora local a un servidor remoto y viceversa. El reenvío de puertos a través de un túnel SSH se usa ampliamente en entornos Linux/Unix, y ahora también puede aprovechar esta función en Windows. En este ejemplo, mostraremos cómo tunelizar el tráfico de una conexión RDP a través de OpenSSH en un host de Windows Server.
¿Qué es un túnel SSH?
Un túnel SSH proporciona una conexión TCP cifrada y segura entre un host local y un servidor SSH remoto. El reenvío de puertos SSH le permite tunelizar una conexión desde un puerto local en su máquina local a cualquier puerto TCP en un servidor remoto (o viceversa) a través de SSH.
El reenvío de puertos en túneles SSH se utiliza para:
Evitar los cortafuegos;
-
Apertura de puertas traseras a redes privadas;
Reemplazos de escenarios VPN para conexión remota segura;
Proteja el tráfico de aplicaciones heredadas (protocolos) que transmiten datos en texto claro (sin encriptación).
Solo puede reenviar tráfico/puerto TCP al túnel SSH (no se admiten los protocolos UDP e ICMP).
La tunelización SSH se usa principalmente en escenarios en los que necesita conectarse a una computadora remota detrás del firewall. Por ejemplo, tiene un servidor Windows con solo el puerto SSH abierto (TCP 22). Todos los demás puertos están bloqueados por un firewall de hardware o Firewall de Windows Defender. Su tarea es conectarse al servidor de Windows utilizando el cliente RDP. Parecería una tarea imposible porque el puerto de escritorio remoto 3389 está bloqueado por el firewall. Sin embargo, puede acceder a cualquier puerto en un host remoto a través de un túnel SSH.
Estos son los escenarios de uso típicos de túneles SSH:
El reenvío TCP local es un reenvío de puerto local a un servidor remoto;
El reenvío TCP remoto es un reenvío de puerto remoto a una computadora local;
Túnel SSH doble: permite conectar ordenadores sin direcciones IP públicas asignadas o detrás de NAT/cortafuegos a través de un servidor SSH (si la solución de servidor OpenVPN no es aplicable).
Protección de RDP con el túnel SSH (reenvío de TCP local)
En este modo, crea un puerto TCP local en su computadora. Todas las conexiones a este puerto se reenviarán al puerto especificado en un servidor remoto a través del túnel SSH. En este ejemplo, crearemos un puerto local 8888 y la conexión a él se redirigirá al puerto RDP 3389 en un host remoto de Windows. El diagrama de conexión general se ve así:
Necesitamos un cliente SSH para el reenvío de puertos. Puede usar un cliente de terceros (como Putty), pero yo usaré el cliente SSH incorporado en Windows. Ejecute el siguiente comando en la consola de PowerShell para instalar el cliente OpenSSH en Windows 10/11 o Windows Server 2022/2019:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'Para crear un túnel SSH con un host remoto 192.168.1.90, ejecute el comando:
ssh -L 8888:192.168.1.90:3389 root@192.168.1.90En este ejemplo se utiliza la siguiente cadena de conexión:
LOCAL_PORT:DESTINATION_IP:DESTINATION_PORTy
USER@DESTINATION_IP(el nombre de usuario y la dirección del servidor SSH remoto)
Para hacer que el túnel SSH se ejecute en segundo plano, agregue el parámetro -f.
Para conectarse a un escritorio remoto a través del túnel SSH, debe conectarse al puerto local 8888 de su computadora mediante el cliente RDP (mstsc.exe):
127.0.0.1:8888
Inicie sesión en la computadora remota y trabaje de manera segura en la sesión RDP. Puede usar el cmdlet Get-NetTCPConnection o la herramienta TCPView para asegurarse de que la conexión RDP se haya establecido localmente (la conexión RDP fue iniciada por el servidor SSH que se ejecuta localmente):
Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|flPuede verificar que el puerto TCP/3389 en el servidor no sea accesible directamente desde su computadora. Puede comprobar la disponibilidad de un puerto mediante el cmdlet Test-NetConnection:
Test-NetConnection 192.168.1.90 -port 3389TcpTestSucceeded : FalseOtros equipos de su red local también pueden usar este túnel para conectarse simultáneamente a un servidor RDP incluso si la conexión directa no está permitida (tanto a través de SSH como a través de RDP). Para hacerlo, deben usar el cliente RDP para conectarse al puerto 8888 en su computadora (con el túnel SSH creado):
mstsc.exe /v 10.10.1.220:8888Asegurar una conexión RDP con un túnel SSH puede ser una buena alternativa de VPN para acceder a hosts públicos de Windows. En este caso, no necesita abrir directamente el puerto RDP/3389 en el host de Windows. Basta con abrir solo el puerto SSH/22, que lo protegerá de ataques de fuerza bruta RDP y la explotación de vulnerabilidades RDP de 0 días.
Puede usar la herramienta sshpass para proporcionar automatización de contraseñas para el inicio de sesión SSH. Puede ejecutar esta herramienta a través del subsistema WSL2 para Windows.
Instale sshpass en Ubuntu WSL:
$ sudo apt-get -y install ssphassEjecute el cliente de Conexión a Escritorio remoto (mstsc.exe) y guarde la configuración de conexión en el archivo localhost-3389.rdp:
Computer: localhost:8888
User name: remoteusernamePara conectarse automáticamente a un host RDP remoto con una contraseña SSH guardada, use el siguiente archivo bat:
start /min wsl sshpass -p "password" ssh -L 8888:192.168.31.90:3389 user@192.168.31.90
powershell sleep 5
start mstsc C:\script\localhost-3389.rdpO (preferiblemente) configure la autenticación de clave SSH.
¿Cómo crear un túnel SSH en Windows con Putty?
Veamos cómo crear un túnel SSH en Windows usando el popular cliente SSH Putty.
Ejecute PuTTY y vaya a Conexión -> SSH -> Túneles;
Especifique el número de puerto local en el Puerto de origen (en nuestro ejemplo, es 8888);
Especifique la dirección IP del servidor SSH y el puerto en el host remoto para reenviar la conexión:
192.168.31.90:3389Seleccione el destino Local y haga clic en Agregar;
Para evitar abrir un shell de host remoto al conectarse a través de un túnel, habilite la opción No iniciar un shell o comando en absoluto en la sección SSH;
Regrese a la pestaña Sesión, especifique el nombre o la dirección IP del host SSH remoto y el número de puerto de conexión (22 por defecto). Especifique el nombre de la sesión en el campo Sesión guardada y haga clic en Guardar;
Ahora puede iniciar el túnel SSH guardado en Putty directamente desde la barra de tareas de Windows 10.
Reenvío TCP remoto (SSH inverso) a una computadora local
Hay otro caso de uso del túnel SSH: el reenvío remoto de TCP. Puede permitir que un servidor remoto acceda a un puerto local en su computadora o a un puerto en otra computadora en su red local a través de un túnel SSH. Por ejemplo, desea un servidor externo (192.168.1.90) para acceder a su sitio de Intranet (no publicado en Internet). Para crear un túnel inverso, use el siguiente comando:
ssh -R 8080:internalwww:80 user@200.168.1.90Ahora, para acceder al sitio web interno desde un servidor SSH remoto, simplemente escriba la dirección
http://localhost:8080 en el navegador.
En todas las versiones de Windows, puede crear las reglas de reenvío de puertos usando el
netsh interface portproxydominio.
Con los túneles SSH, puede crear cadenas de reenvío de puertos. Puede habilitar o deshabilitar los túneles SSH en el archivo de configuración de OpenSSH (sshd_config) usando las siguientes directivas:
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel noEstas directivas de configuración no están disponibles en la versión actual de OpenSSH para Windows.







