如何在 Linux 上设置反向 SSH 隧道

反向 SSH 是一种可用于从外部访问系统(位于防火墙后面)的技术。

如大家所知,SSH 是一种支持网络节点之间加密通信的网络协议。 使用此协议,我们可以进行安全的远程登录、从/到远程机器的安全复制等。

我们通常会执行以下操作以使用 ssh 命令安全地连接到远程服务器。

$ ssh [your-account-login]@[server-ip]

什么是反向 SSH?

SSH 是一个非常好的安全访问远程机器或服务器的工具。但是,当我们尝试连接到防火墙后面的远程服务器并且此防火墙拒绝任何传入连接或没有先前传出请求的数据传输请求时,就会出现问题。这意味着只允许那些由远程服务器机器发起的连接。对于那些想要远程访问此服务器机器的人来说,这是一个真正的问题。

反向 SSH 提供了一种技术,我们可以通过该技术模拟到此远程服务器计算机的正常 SSH。

主要问题是防火墙拒绝我们的机器尝试与远程服务器机器建立的 ssh 连接。但是我们知道,同一防火墙不会对源自服务器计算机的连接有任何问题。所以,为什么不请坐在防火墙后面的人做一些事情,以实现远程访问服务器的目标。为此,我们必须使用 ssh -R 选项。

这是手册页中 ssh -R 选项的描述:

-R [bind_address:]port:host:hostport 指定将远程(服务器)主机上的给定端口转发到本地端的给定主机和端口。 这通过分配一个套接字来侦听远程端的端口来工作,并且每当与该端口建立连接时,该连接都会通过安全通道转发,并从本地计算机建立与主机端口 hostport 的连接。

因此,我们可以使用带有 -R 选项的 ssh 命令(在我们的例子中来自服务器)连接到我们的机器,在那里分配一个端口并确保该端口上的任何连接请求都转发到远程服务器的 ssh 端口。

服务器机器执行 ssh 并通过端口转发确保您可以 ssh 返回服务器机器,而不是我们的机器执行 ssh。


如何创建反向 SSH 隧道?

这是我们坐在远程服务器端的朋友应该在服务器上运行的命令:

$ ssh -fN -R 7000:localhost:22 username@yourMachine-ipaddress

所以这个从远程服务器到你机器的 ssh 连接请求将确保你机器上端口 7000 的任何 ssh 连接请求被转发到远程服务器的端口 22。

现在在端口 7000 上从我们的机器向我们自己的机器发出 ssh 连接请求:

$ ssh username@localhost -p 7000

在这里,尽管我们似乎在 localhost 上执行 ssh,但我们的请求将被转发到远程主机。因此,我们应该在远程服务器上使用我们的帐户“用户名”,并在提示输入密码时输入相应的密码。

这应该清楚与反向 ssh 技术相关的大部分方面。但是,有一个问题。问题是你必须先请你的一个朋友——他坐在防火墙后面——来创建一个 ssh 连接。这不是每次都可行的。

为了克服这个问题,我们可以做的是设置一台不受防火墙限制的机器(就像我们的机器一样),使其始终处于开启状态。让我们将此机器称为 machine_z

machine_z 的好处是,我们可以一次在其上设置反向 ssh,然后将其保留为这样。在任何时候,当我们需要登录远程机器时,可以在指定端口上 ssh 进入 machine_z(如前所示),我们的连接请求将被转发到远程服务器机器,瞧,我们将在远程运行命令服务器。

在相关说明中,我们还可以设置无密码 SSH 以在不输入密码的情况下连接到另一台服务器。

我们需要在 machine_z 上配置的一些设置包括:

  • 确保将参数 TCPKeepAliveClientAliveIntervalClientAliveCountMax 和 GatewayPorts 设置为适当的值。这些参数位于 /etc/sshd_config 或 /etc/ssh/sshd_config 文件中
  • 如果我们对上述参数进行了一些更改,我们应该重新启动 sshd 守护程序以反映更改。
  • 此外,请确保使用 nohup 命令运行第一个 ssh 命令(从远程服务器执行到 machine_z),以便此 ssh 会话不受用户注销时可能发生的挂起的影响。