SSH隧道详解:SSH端口转发教程
Secure Shell协议定义了一种安全连接到远程主机的机制。SSH取代了Telnet——最初用于运行远程登录会话的互联网应用程序。
多年来,SSH已不仅仅是一个终端仿真工具,这主要归功于其使用用户定义的端口和主机系统安全路由网络流量的能力。这些连接被称为隧道,因为它们提供了通过不安全网络安全传输数据的连接。
让我们深入了解SSH隧道,包括其工作原理和各种类型的SSH隧道,然后再深入探讨设置每种隧道类型的教程。
什么是SSH隧道?
SSH隧道是SSH客户端和SSH服务器之间的安全连接。本地机器将来自任意端口的网络流量通过SSH连接路由到远程系统上的指定端口——通常是TCP端口22。
SSH通过网络应用程序端口将网络流量从本地主机隧道传输到远程系统,反之亦然。SSH隧道(也称为SSH端口转发)使两个系统能够通过防火墙在内部网和互联网上安全交换数据。它也是云管理的关键组成部分。
隧道有多种用途,包括:
- 通过SSH端口隧道传输HTTP或HTTPS流量,从受限网络外部访问内部Web服务
- 绕过防火墙和网络控制以访问被这些设备阻止的服务(请谨慎操作,这些限制是有原因的)
- 通过SSH隧道传输非安全协议,如虚拟网络计算或远程桌面协议
- 在不受信任或受信任的网络中传输时保护未加密的应用程序数据
- 安全挂载远程网络文件系统和通用互联网文件系统文件系统,为数据传输提供加密连接
SSH如何工作?
SSH最简单的用例是登录到远程主机进行终端仿真会话。在这种情况下,用户使用SSH客户端软件安全地连接到运行SSH服务器的另一台主机。您可以配置SSH在客户端和服务器之间交换公钥,以验证用户并加密通过SSH连接发送的数据。
SSH客户端软件几乎总是可在现代计算机上使用。OpenSSH是一个开源命令行SSH实现,最初为OpenBSD操作系统开发,但现在几乎可用于所有基于Unix的操作系统,包括Linux和macOS。Windows 10及更新版本也在命令行中包含了OpenSSH。PuTTY是另一个可用于Windows的开源GUI版本SSH。
启动SSH会话需要以下条件:
- 要访问的远程机器的域名或IP地址。此远程主机必须运行SSH服务器程序sshd的实例
- 访问本地机器上的SSH客户端。通过输入ssh命令启动SSH连接。虽然您可以使用SSH的GUI版本(如Windows的PuTTY),但学习使用命令行版本对几乎所有现代操作系统都有用
- 具有访问远程服务器权限的用户登录凭据
例如,使用用户ID example-user在名为server.example.com的远程主机上启动终端会话,使用此SSH命令:
|
|
此命令使用端口22(默认SSH端口)在远程服务器上打开终端会话。SSH服务器也可以在其他端口上响应会话请求。例如,要连接到自定义SSH端口分配为2222的远程服务器,请输入:
|
|
-p选项标志指定远程服务器上的端口号2222,这导致SSH将流量发送到端口2222而不是默认端口22。仅当您已配置远程服务器侦听该端口上的请求时,此方法才有效。
您可以将SSH与域名或IP地址一起使用。如果名为server.example.com的主机的IP地址为192.0.2.127,则以下命令与上面的示例具有相同的效果:
|
|
建立SSH连接时,服务器和客户端交换公钥信息并协商安全会话密钥以加密SSH数据交换。首次连接到远程SSH主机时,SSH会提示您验证远程主机的公钥。
标准SSH示例是用户example-user使用端口22登录到远程主机server.example.com的终端会话。
三种主要类型的SSH隧道
SSH隧道连接在两个独立主机上运行的进程之间的数据流。存在三种主要类型的SSH隧道;您将根据具体需求选择一种。
1. 本地端口转发
本地端口转发使您能够从本地SSH客户端连接到远程目标SSH服务器。当目标服务器无法被本地主机访问时(例如,由于防火墙过滤),但它可以被SSH服务器访问时,选择此方法。本地端口转发可以从私有网络内部绕过防火墙,访问防火墙原本会阻止的远程系统。
2. 远程端口转发
远程端口转发(或反向SSH隧道)使能够使用SSH客户端软件从不同的SSH服务器连接到目标SSH服务器。远程端口转发是一种较少使用的方法,用于从外部私有网络访问内部服务器,否则该服务器无法从公共互联网访问。恶意黑客可能使用此方法利用私有网络上的系统。
3. 动态端口转发
动态端口转发通过指定端口上的SSH路由所有入站和出站网络流量。这使任何两个主机之间能够建立SSH连接,所有连接都由SSH客户端通过SSH服务器转发。它也是设置SOCKS代理服务器的一种机制,当您配置本地客户端软件将所有流量传递到指定端口时,该服务器将网络流量封装在SSH隧道中。动态端口转发还可以绕过网络防火墙并从私有网络内部访问任何目标服务器。
准备设置SSH隧道
本教程重点介绍在命令行界面使用SSH协议的OpenSSH实现。
在尝试打开SSH隧道之前,请采取以下步骤:
- 验证SSH是否已安装并在本地机器和远程SSH服务器上运行。在Windows系统或基于Unix的系统上,通过打开PowerShell窗口(Windows)或shell会话(基于Unix的系统)并输入不带任何参数的ssh命令来完成此操作。该命令返回帮助消息,指示正确用法和可用参数
- 还要验证SSH服务器sshd是否在目标(目的地)主机上运行。如果主机没有运行SSH守护进程(服务器程序)并侦听SSH连接请求,则必须在创建隧道之前启动它。验证这一点的一种方法是与相关服务器启动SSH连接。如果连接被接受,则可以安全地假设sshd正在运行
- 这也是验证SSH服务器上被验证的用户帐户是否具有正确权限的好时机。至少,用户帐户应被授权使用sudo命令发出超级用户命令,但有限制以防止帐户被劫持并用于对抗组织
运行ssh命令验证SSH是否安装在Windows系统上。
获取或验证远程服务器的主机名或IP地址。服务器IP地址始终足够,尽管拥有域名可以使输入SSH命令更容易。
在Windows系统上,您可以通过打开"设置"应用程序,选择"网络和互联网"选项,并查看当前连接到网络的网络接口的属性来确定系统的IP地址。
使用命令行发现IP地址的命令可用于所有操作系统:
- 在Windows命令行中,通过输入命令ipconfig显示系统的IP地址。它显示系统上所有网络接口的网络配置,包括IP地址
- 在Linux系统上,通过输入ip addr命令显示IP地址。它显示系统上所有网络接口的网络配置,包括IP地址
使用ip addr命令显示Linux系统的IP地址。
确定要用于SSH端口转发重定向的端口号。对于知名端口,请参考互联网号码分配机构服务名称和传输协议端口号注册表。最常用的IANA注册端口包括端口80(HTTP)、443(HTTPS)和22。
通常,您可以选择1024到65535之间的任何非知名端口,但端口1080是SOCKS的注册端口。在为SOCKS代理设置动态端口转发隧道时,应使用它。
例如,当为从内部网络上的Web服务器到外部服务器的本地端口转发设置隧道时,源端口和目标端口都可以设置为80用于HTTP传输。当在同时作为SSH服务器和Web服务器运行的本地服务器上设置隧道时,入站端口可以设置为8080,以将隧道流量与普通Web流量区分开。
在实施前通过检查以下内容来审查计划的隧道:
- 主机是否可达?
- 所有主机是否安装了最新且可互操作的SSH版本?
- 作为SSH服务器的主机是否安装并启动了SSH服务器软件?
- 用户在相关系统上是否具有足够的权限?
一旦定义了隧道端点,逐步的方法可以简化故障排除,因为您可以在打开每个组件时测试它。
在SSH服务器上初始化SSH守护进程。对于Windows 10及更高版本,您必须安装OpenSSH服务器并使用具有管理员权限运行的PowerShell命令行启动它。使用以下命令从PowerShell命令行初始化OpenSSH服务器守护进程:
|
|
在Linux系统上使用以下命令启动OpenSSH服务器:
|
|
使用systemctl status sshd命令显示SSH守护进程的状态。在上面的屏幕截图中,守护进程已启动。
请记住,sudo命令需要授权密码才能获得超级用户访问权限以运行服务器服务。
一旦建立与所有端点系统的连接并确认对SSH程序的访问权限,设置隧道就很简单,尽管某些SSH实现可能提供不同的选项。要确定Windows上安装的SSH版本,请打开PowerShell窗口并输入以下命令:
使用ssh -V命令在Windows PowerShell中显示版本信息。
|
|
要验证Linux上运行的SSH版本,请输入以下命令:
|
|
使用ssh -V命令在Linux shell中显示版本信息。
如何创建本地端口转发隧道
本地端口转发在SSH命令中使用-L选项,标志本地端口将通过SSH服务器转发到另一台服务器或主机。换句话说,本地主机连接到运行SSH服务器的另一台主机,然后将绑定到转发端口的任何网络数据通过SSH服务器修补到所需的目标主机。
例如,如果您正在使用私有网络上的计算机,并且想要访问组织防火墙阻止的Web服务器,您可以使用此命令将本地端口8080重定向到所需的Web服务器:
|
|
在此示例中,-L选项指示ssh-server.example.com上的SSH服务器应将本地主机上的端口8080转发到所需但受限制的服务器social.example.org上的端口80。
运行具有指定端口的SSH命令意味着您应该能够使用Web浏览器中的URL访问受限制的服务器,例如http://localhost:8080/,它指向运行SSH的本地主机上的指定端口。SSH通过SSH隧道转发HTTP请求以访问所需的Web服务器。
使用SSH的本地端口转发使本地操作员能够绕过防火墙保护以访问远程资源。
如何创建远程端口转发隧道
道德黑客、渗透测试人员和恶意攻击者经常使用远程端口转发(也称为反向隧道)。如果攻击者可以利用私有网络内的仅一台主机,他们可以使用该访问权限潜在地访问受保护网络内的任何系统。
要启动反向隧道,在您想要用于将外部网络请求转发到否则受限制的私有网络上的主机的私有网络内的主机上运行带有-R选项的ssh命令。考虑以下命令,在位于防火墙边界内的主机上运行:
|
|
在此命令中,localhost指的是位于私有网络内的主机。被转发的端口(5900)是VNC的默认端口,VNC是允许远程控制桌面的软件。被转发到的系统是somehost.example.net,一个可被localhost访问但也位于受保护网络上的主机。通常,此主机不应被防火墙边界外的任何人访问;但是,在这种情况下,localhost已被设置为可被公共互联网访问。您也可以使用此类型的转发来利用私有网络外已被授予访问受限服务权限的主机上的特权访问。
在此示例中,您可以配置VNC客户端软件连接到localhost的域名或公共IP地址上的端口5900,以获得对系统somehost.example.net的控制。
在实践中,以这种方式打开反向隧道可能很复杂。许多组织都知道此漏洞,它使攻击者能够在受保护系统上运行远程命令,并且他们部署了针对它的保护措施。无论如何,请与网络和IT人员核实,避免因反向隧道触发警报。
使用SSH的远程端口转发可以使外部人员访问私有网络上的网络资源。
如何创建动态端口转发隧道
使用SSH的动态端口转发通常用于设置SOCKS代理服务器。在此示例中,SSH客户端在本地主机上的特定端口上侦听。当它在该端口上接收流量时,SSH服务器将应用层消息封装或隧道传输到连接到接收主机的安全隧道中。
使用SOCKS代理时,必须使用SSH接受要隧道传输的流量的端口号配置客户端软件。SOCKS代理的默认端口是1080,因此启动SOCKS代理(启用动态端口转发)的SSH命令是:
|
|
-D选项在本地主机上启用动态端口转发,因此所有在端口1080上接收的消息都转发到名为bastion.example.org的主机。Bastion是一种通常位于防火墙边界外或网络DMZ中的主机类型。它通过SSH隧道调解对外部主机的访问。
总结
SSH是当今现代环境中至关重要的网络安全服务。它连接客户端与服务器、管理工作站与网络设备,以及各种计算机与云服务。使用SSH进行隧道传输提供了许多控制流量、确保私有数据传输的选项。立即开始使用SSH隧道,看看它们如何使您的环境受益。
Damon Garn拥有Cogspinner Coaction,并提供自由IT写作和编辑服务。他撰写了多本CompTIA学习指南,包括Linux+、Cloud Essentials+和Server+指南,并广泛为Informa TechTarget、The New Stack和CompTIA博客供稿。