在 Windows 上配置 SSH 隧道(端口转发)
您可以使用Windows上内置的OpenSSH服务器通过SSH隧道(SSH隧道)转发端口。 SSH 中的端口转发允许您将应用程序端口从本地计算机隧道(转发)到远程服务器,反之亦然。通过 SSH 隧道进行端口转发广泛应用于 Linux/Unix 环境中,现在您也可以在 Windows 中利用此功能。在此示例中,我们将展示如何在 Windows Server 主机上通过 OpenSSH 传输 RDP 连接流量。
什么是 SSH 隧道?
SSH 隧道在本地主机和远程 SSH 服务器之间提供安全、加密的 TCP 连接。 SSH 端口转发允许您通过 SSH 将连接从本地计算机上的本地端口建立到远程服务器上的任何 TCP 端口(反之亦然)。
SSH 隧道中的端口转发用于:
绕过防火墙;
-
为私人网络打开后门;
VPN场景替代安全远程连接;
保护以明文(不加密)传输数据的遗留应用程序(协议)的流量。
您只能将 TCP 流量/端口转发到 SSH 隧道(不支持 UDP 和 ICMP 协议)。
SSH 隧道主要用于需要连接到防火墙后面的远程计算机的情况。例如,您有一台仅打开 SSH 端口 (TCP 22) 的 Windows Server。所有其他端口均被硬件防火墙或 Windows Defender 防火墙阻止。您的任务是使用 RDP 客户端连接到 Windows Server。这似乎是一项不可能完成的任务,因为远程桌面端口 3389 被防火墙阻止了。但是,您可以通过 SSH 隧道访问远程主机上的任何端口。
以下是 SSH 隧道的典型使用场景:
本地TCP转发是本地端口转发到远程服务器;
远程TCP转发是远程端口转发到本地计算机;
双 SSH 隧道 - 允许通过 SSH 服务器连接未分配公共 IP 地址或位于 NAT/防火墙后面的计算机(如果 OpenVPN 服务器解决方案不适用)。
使用 SSH 隧道保护 RDP(本地 TCP 转发)
在此模式下,您在计算机上创建本地 TCP 端口。到此端口的所有连接都将通过 SSH 隧道转发到远程服务器上的指定端口。在此示例中,我们将创建本地端口 8888,其连接将被重定向到远程 Windows 主机上的 RDP 端口 3389。一般连接图如下所示:
我们需要一个 SSH 客户端来进行端口转发。您可以使用第三方客户端(如 Putty),但我将使用 Windows 上内置的 SSH 客户端。在PowerShell控制台中运行以下命令,在Windows 10/11或Windows Server 2022/2019上安装OpenSSH客户端:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'要创建与远程主机 192.168.1.90 的 SSH 隧道,请运行以下命令:
ssh -L 8888:192.168.1.90:3389 root@192.168.1.90本示例中使用以下连接字符串:
LOCAL_PORT:DESTINATION_IP:DESTINATION_PORT和
USER@DESTINATION_IP(远程SSH服务器的用户名和地址)
要使 SSH 隧道在后台运行,请添加 -f 参数。
为了通过 SSH 隧道连接到远程桌面,您需要使用 RDP 客户端 (mstsc.exe) 连接到计算机的本地端口 8888:
127.0.0.1:8888
登录到远程计算机并在 RDP 会话中安全地工作。您可以使用 Get-NetTCPConnection cmdlet 或 TCPView 工具来确保已在本地建立 RDP 连接(RDP 连接是由本地运行的 SSH 服务器发起的):
Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|fl您可以检查服务器上的 TCP/3389 端口是否无法从您的计算机直接访问。您可以使用 Test-NetConnection cmdlet 检查端口的可用性:
Test-NetConnection 192.168.1.90 -port 3389TcpTestSucceeded : False即使不允许直接连接(通过 SSH 和通过 RDP),本地网络的其他计算机也可以使用此隧道同时连接到 RDP 服务器。为此,他们必须使用 RDP 客户端连接到您计算机上的端口 8888(已创建 SSH 隧道):
mstsc.exe /v 10.10.1.220:8888使用 SSH 隧道保护 RDP 连接可能是访问公共 Windows 主机的良好 VPN 替代方案。这种情况下,不需要直接在Windows主机上打开RDP/3389端口。仅打开 SSH/22 端口就足够了,这将保护您免受 RDP 暴力攻击和 0-day RDP 漏洞的利用。
您可以使用sshpass工具为SSH登录提供密码自动化。您可以通过 Windows 的 WSL2 子系统运行此工具。
在 Ubuntu WSL 中安装 sshpass:
$ sudo apt-get -y install ssphass运行远程桌面连接客户端 (mstsc.exe) 并将连接设置保存到 localhost-3389.rdp 文件:
Computer: localhost:8888
User name: remoteusername要使用保存的 SSH 密码自动连接到远程 RDP 主机,请使用以下 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.rdp或者(最好)设置 SSH 密钥身份验证。
如何使用 Putty 在 Windows 上创建 SSH 隧道?
让我们看看如何使用流行的 SSH 客户端 Putty 在 Windows 上创建 SSH 隧道。
运行 PuTTY 并导航至 Connection -> SSH -> Tunnels;
在源端口中指定本地端口号(在我们的示例中为8888);
指定 SSH 服务器的 IP 地址和远程主机上的端口以转发连接:
192.168.31.90:3389选择本地目的地并点击添加;
为了避免在通过隧道连接时打开远程主机 shell,请在 SSH 部分中启用根本不启动 shell 或命令选项;
返回“会话”选项卡,指定远程 SSH 主机的名称或 IP 地址以及连接端口号(默认为 22)。在“保存的会话”字段中指定会话名称,然后单击“保存”;
现在,您可以直接从 Windows 10 任务栏启动 Putty 中保存的 SSH 隧道。
远程 TCP 转发(反向 SSH)到本地计算机
还有另一个 SSH 隧道用例 - 远程 TCP 转发。您可以允许远程服务器通过 SSH 隧道访问您计算机上的本地端口或本地网络上另一台计算机上的端口。例如,您希望外部服务器 (192.168.1.90) 访问您的 Intranet 站点(未发布在 Internet 上)。要创建反向隧道,请使用以下命令:
ssh -R 8080:internalwww:80 user@200.168.1.90现在,为了从远程 SSH 服务器访问内部网站,只需输入地址
http://localhost:8080 在浏览器中。
在所有 Windows 版本上,您可以使用以下命令创建端口转发规则
netsh interface portproxy命令。
使用 SSH 隧道,您可以创建端口转发链。您可以使用以下指令在 OpenSSH 配置文件 (sshd_config) 中启用或禁用 SSH 隧道:
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel no这些配置指令在当前版本的 Windows 版 OpenSSH 中不可用。







