是否需要通过 SSH 连接到无法直接访问的 Linux 计算机?让它主动“呼叫”你,然后利用这个连接建立你自己的远程 SSH 会话。本文将向你展示具体操作方法。
何时需要使用反向 SSH 隧道?
有时,远程计算机可能难以访问。它们可能位于有严格防火墙规则的环境中,或者本地管理员可能设置了复杂的网络地址转换规则。如果你需要连接到这样的计算机,应该如何操作呢?
我们先来明确一下术语。你的电脑是本地计算机,因为它就在你身边。你想要连接的计算机是远程计算机,因为它位于不同的位置。
为了区分本文中使用的本地计算机和远程计算机,我们将远程计算机称为 “wdzwdz”,它运行 Ubuntu Linux 系统(使用紫色终端窗口)。本地计算机名为 “Sulaco”,运行 Manjaro Linux 系统(使用黄色终端窗口)。
通常,你会从本地计算机发起一个SSH 连接以连接到远程计算机。但在我们描述的网络场景中,这通常是不可能的。具体导致无法连接的网络问题并不重要——关键在于,当您无法直接通过 SSH 连接到远程计算机时,此方法非常有用。
但是,如果你的网络设置简单直接,远程计算机可以连接到你的计算机。但这还不够,因为它本身无法在远程计算机上为你提供有效的命令行会话。但这却是一个好的开始。你已经在两台计算机之间建立了一条连接。
关键在于使用反向 SSH 隧道。
什么是反向 SSH 隧道?
反向 SSH 隧道允许你利用已建立的连接,在本地计算机和远程计算机之间创建一条新的连接通道。
由于初始连接是从远程计算机到你的计算机,因此将其反向用于另一方向被称为 “反向” 使用。由于 SSH 本身是安全的,你可以将一个安全的连接置于另一个现有的安全连接中。这意味着你与远程计算机的连接可以充当原始连接中的一条专用通道。
这就是“反向 SSH 隧道”名称的由来。
它是如何工作的?
反向 SSH 隧道依赖于远程计算机,它利用已经建立的连接来监听来自本地计算机的新连接请求。
远程计算机监听本地计算机上的特定网络端口。如果它检测到该端口的 SSH 请求,它会将该连接请求转发回自己,沿着已建立的连接传递。这样就建立了一条从本地计算机到远程计算机的新连接。
实际设置比描述要容易得多。
使用 SSH 反向隧道
SSH 已经安装在你的 Linux 计算机上,但如果本地计算机以前从未接受过 SSH 连接,你可能需要启动 SSH 守护进程 (sshd)。
sudo systemctl start sshd
要设置每次计算机重启时自动启动 SSH 守护进程,可以使用以下命令:
sudo systemctl enable sshd
在远程计算机上,我们使用以下命令:
-R(反向)选项指示 ssh 在远程计算机上创建一个新的 SSH 会话。
“43022:localhost:22” 指示 ssh 将来自本地计算机端口 43022 的连接请求转发到远程计算机的端口 22。之所以选择端口 43022,是因为它在列表中被列为未分配的端口。 这并不是一个特殊的数字。
[email protected] 是远程计算机要连接到本地计算机上的用户帐户。
ssh -R 43022:localhost:22 [email protected]
你可能会收到关于以前从未连接到本地计算机的警告。或者,当连接详细信息被添加到已识别的 SSH 主机列表时,你可能会看到一条警告。你实际看到的内容(如果有)取决于是否曾经从远程计算机连接到本地计算机。
系统会提示你输入连接本地计算机的用户帐户密码。
请注意,建立连接后,命令提示符从 [email protected] 变为 [email protected]
我们现在是从远程计算机连接到本地计算机。这意味着我们可以向它发出命令。让我们使用 who 命令来查看本地计算机上的登录信息。
who
我们可以看到名为 dave 的用户已经登录到本地计算机,并且远程计算机已经从 IP 地址 192.168.4.25 连接(使用相同的用户凭据)。
连接到远程计算机
因为来自远程计算机的连接是成功的,并且它正在监听连接,我们可以尝试从本地计算机连接到远程计算机。
远程计算机正在监听本地计算机上的端口 43022。因此,有点违反直觉的是,要连接到远程计算机,我们需要 ssh 连接本地计算机的 43022 端口。这个连接请求将被转发到远程计算机。
ssh localhost -p 43022
系统会提示我们输入用户帐户密码,然后从本地计算机连接到远程计算机。我们的 Manjaro 计算机热情地欢迎道:“欢迎使用 Ubuntu 18.04.2 LTS”。
请注意,命令提示符已从 [email protected] 变为 [email protected] 我们已经实现了与难以访问的远程计算机建立 SSH 连接的目标。
使用带有密钥的 SSH
为了更方便地从远程计算机连接到本地计算机,我们可以设置 SSH 密钥。
在远程计算机上,输入以下命令:
ssh-keygen
系统将提示你输入密码。你可以按 Enter 忽略密码短语的问题,但强烈不建议这样做。这意味着远程计算机上的任何人都可以与你的本地计算机建立 SSH 连接,而无需输入密码。
由符号分隔的三个或四个单词可以构成一个稳固的密码短语。
你的 SSH 密钥将会生成。
我们需要将公钥传输到本地计算机。使用以下命令:
ssh-copy-id [email protected]
系统将提示你输入你正在登录的用户帐户的密码,在这种情况下是 [email protected]
第一次从远程计算机向本地计算机发出连接请求时,你必须提供密码。只要该终端窗口保持打开状态,你就不必为将来的连接请求再次输入它。
并非所有隧道都令人恐惧
有些隧道可能是黑暗而曲折的,但如果你能理清远程计算机和本地计算机之间的关系,那么反向 SSH 隧道并不难理解。接下来,反向理解即可。