如何将 AllowTcpForwarding 设置为 no 进行 ssh 转发?

How to ssh forwarding with AllowTcpForwarding set to no?

需要在某个远程盒子上完成一些开发工作。幸运的是,我有 shell 访问权限,但我需要通过一个将 AllowTcpForwarding 设置为 false 的网关。

我在文档中看到了一个高峰,上面写着:

AllowTcpForwarding Specifies whether TCP forwarding is permitted. The default is ''yes''. Note that disabling TCP forwarding does not improve security unless users are also denied shell access, as they can always install their own forwarders.

我将如何安装(或构建)我自己的转发器?我的目标是通过 SSH 设置一个 remote interpreter using Pycharm 并将其绑定到某个本地端口,数据通过 ssh 提供,通过网关,然后到代码实际上是 运行 的开发箱。

我知道我可以通过以下方式连接到我的远程盒子:

ssh -t user1@gateway ssh user2@devbox

但显然这个选项在 pycharm 中不可用。我必须能够打开一些本地端口,这样

ssh -p 12345 localhost
(or variant)

会将我连接到 user2@devbox。这将允许我将远程解释器配置为使用 localhost 上的端口 12345 连接到远程框。

如果您有合理的需要通过此网关服务器建立隧道连接,您应该尝试与网关管理员交谈以找到可以接受的工作方式。找到一种解决服务器配置的方法不会改变您可能违反了您应该遵守的 政策 的事实。话虽如此:

客户端和服务器之间的 SSH 连接支持多个独立的数据流,称为通道。端口转发使用一种名为 "direct-tcpip" 的通道类型。端口转发操作有四个部分:

  1. ssh 客户端(连接到 ssh 服务器)绑定到 TCP 端口并侦听连接。
  2. 当某些东西连接到客户端正在侦听的端口时,客户端会向服务器发送请求以打开“direct-tcpip”通道。来自客户端的请求指定通道应连接到的主机和端口。
  3. 远程系统上的 ssh 服务器与指定的主机和端口建立 TCP 连接。
  4. ssh 客户端在 direct-tcpip 通道和本地 TCP 连接之间中继数据。
  5. ssh 服务器在 direct-tcpip 通道和远程 TCP 连接之间中继数据。

如果服务器已被配置为不允许 TCP 转发,那么它将对来自客户端的任何 direct-tcpip 通道请求作出错误响应。要解决这个问题,正如 SSH 文档所暗示的那样,客户端需要通过允许客户端打开的其他一些通道类型传递这些转发请求,并且需要 运行 执行远程系统上的某个进程上面的第 3 步和第 5 步——通常由远程 ssh 服务器完成的步骤。

我不知道有任何现成的解决方案。这里的工作范围是:

  1. 开发一个可以安装在网关上的程序来执行转发操作的远程部分。该程序必须能够与目标主机和端口建立 TCP 连接,然后在 TCP 连接和 SSH 连接之间中继数据。

  2. 开发一个可以执行转发操作的本地部分的自定义 ssh 客户端。它需要绑定到本地 TCP 端口并监听连接。当有东西连接时,客户端必须打开到服务器的通道,调用远程程序连接到隧道目标,然后在 TCP 连接和 ssh 通道之间中继数据。

一个合理的方法是让自定义 ssh 客户端在远程系统上打开一个 "exec" or "shell" channel for each forwarded connection, and then invoke a program like netcat。 Netcat 需要连接到转发操作的目标,然后在其标准 input/output 和转发目标之间中继数据。如果您不能在网关上安装 netcat,您可以为此目的使用 perl、python、java、C 或任何其他在网关上可用且允许的语言编写自定义程序打开 TCP 连接。

网关上可能安装了一些程序,可用于将 stdio 转发到远程网络端口。例如,查找 corkscrewnetcatncsocatproxytunnel

然后如果 Perl 在网关上可用,您可以使用 here that I wrote some time ago to solve that same problem (the code is explained here 提供的单行程序。

最后,您还可以 运行 使用 ProxyCommand 设置或 PyCharm 使用的某些等效设置与目标计算机建立 SSH 连接。