什么是反向SSH隧道?(以及如何使用它)

需要通过SSH连接到无法访问的Linux计算机吗?让它呼叫您,然后深入搜索该连接以获得您自己的远程SSH会话。我们教你怎么做。

何时需要使用反向SSH隧道

有时,远程计算机可能很难访问。他们所在的站点可能有严格的防火墙规则,或者本地管理员可能设置了复杂的网络地址转换规则。如果您需要连接到这样一台计算机,您如何访问它?

让我们建立一些标签。您的计算机是本地计算机,因为它离您很近。您要连接的计算机是远程计算机,因为它与您位于不同的位置。

为了区分本文中使用的本地和远程计算机,远程计算机名为“Howtogeek”,运行的是Ubuntu Linux(带有紫色终端窗口)。本地计算机名为“Sulaco”,运行的是Manjaro Linux(带有黄色终端窗口)。

通常,您需要从本地计算机启动SSH连接并连接到远程计算机。在我们描述的网络场景中,这不是一个选项。具体的网络问题是什么并不重要-每当您无法通过SSH直接连接到远程计算机时,这一点都很有用。

但是,如果您一端的网络配置很简单,远程计算机就可以连接到您。然而,仅有这一点还不足以满足您的需要,因为它不能在远程计算机上为您提供有效的命令行会话。但这只是一个开始。您已经在两台计算机之间建立了连接。

答案在于反向SSH隧道。

什么是反向SSH隧道?

反向SSH隧道允许您使用已建立的连接来设置从本地计算机返回到远程计算机的新连接。

因为原始连接是从远程计算机到您的,所以使用它去往另一个方向就是在“反向”使用它。而且因为SSH是安全的,所以您可以将安全连接放在现有的安全连接中。这意味着您与远程计算机的连接在原始连接中充当专用隧道。

因此,我们得出了“反向SSH隧道”的名称。

它怎麽工作?

反向SSH隧道依赖远程计算机使用已建立的连接侦听来自本地计算机的新连接请求。

远程计算机侦听本地计算机上的网络端口。如果它检测到对该端口的SSH请求,它会将该连接请求中继回其自身,沿着已建立的连接向下转发。这将提供从本地计算机到远程计算机的新连接。

设置起来容易,描述起来难。

使用SSH反向隧道

您的Linux计算机上已经安装了SSH,但如果本地计算机以前从未接受过SSH连接,则可能需要启动SSH守护进程(SSHD)。

sudo systemctl start sshd

要在您每次重新启动计算机时启动SSH守护程序,请使用以下命令:

sudo systemctl enable sshd

在远程计算机上,我们使用以下命令。

-R(反向)选项告诉ssh必须在远程计算机上创建新的SSH会话。 “43022:LOCALHOST:22”告诉SSH,本地计算机上端口43022的连接请求应该转发到远程计算机上的端口22。之所以选择端口43022,是因为它被列为未分配。这不是一个特殊的号码。 dave@sulaco.local是远程计算机将在本地计算机上连接到的用户帐户。

ssh -R 43022:localhost:22 dave@sulaco.local

您可能会收到一条警告,提示您以前从未连接过本地计算机。或者,当连接详细信息添加到已识别的SSH主机列表中时,您可能会看到一条警告。您看到的内容(如果有的话)取决于是否已从远程计算机连接到本地计算机。

系统将提示您输入用于连接到本地计算机的帐户密码。

请注意,连接完成后,命令提示符从dave@Howtogeek更改为dave@sulaco。

我们现在已从远程计算机连接到本地计算机。这意味着我们可以向它发出命令。让我们使用who命令查看本地计算机上的登录。

who

我们可以看到,拥有名为Dave的用户帐户的用户已经登录到本地计算机,并且远程计算机已经从IP地址192.168.4.25连接(使用相同的用户凭据)。

相关:如何在Linux中确定当前用户帐户

正在连接到远程计算机

因为来自远程计算机的连接成功,并且它正在侦听连接,所以我们可以尝试从本地计算机连接到远程计算机。

远程计算机正在侦听本地计算机上的端口43022。因此,有些与直觉相反的是,为了建立到远程计算机的连接,我们要求SSH在端口43022上连接本地计算机。该连接请求将被转发到远程计算机。

ssh localhost -p 43022

系统提示我们输入用户帐户密码,然后从本地计算机连接到远程计算机。我们的Manjaro电脑高兴地说,“欢迎使用Ubuntu 18.04.2 LTS”。

请注意,命令提示符已从dave@sulaco更改为dave@Howtogeek。我们已经实现了与难以访问的远程计算机建立SSH连接的目标。

将SSH与密钥一起使用

为了更方便地从远程计算机连接到本地计算机,我们可以设置SSH密钥。

在远程计算机上,键入以下命令:

ssh-keygen

系统将提示您输入密码。您可以按Enter键忽略密码问题,但不建议这样做。这意味着远程计算机上的任何人都可以与您的本地计算机建立SSH连接,而无需询问密码。

由符号分隔的三四个单词将构成一个健壮的密码短语。

将生成您的SSH密钥。

我们需要将公钥传输到本地计算机。使用此命令:

ssh-copy-id dave@sulaco.local

系统将提示您输入要登录的用户帐户的密码,在本例中为dave@sulaco.local。

当您第一次请求从远程计算机连接到本地计算机时,您必须提供密码。在以后的连接请求中,只要终端窗口保持打开状态,您就不必再次输入密码。

相关:如何从Linux Shell创建和安装SSH密钥

并不是所有的隧道都很可怕

有些隧道可能是黑暗和扭曲的,但是如果您能够保持头脑中远程计算机和本地计算机之间的关系,反向SSH隧道就不会太难导航。那就把它倒过来。

相关文章