SSH动态端口转发中如何使用SOCKS协议?

SSH动态端口转发中如何使用SOCKS协议?
  1. 当通过SSH动态端口转发在应用程序客户端和应用程序服务器之间创建连接时ssh -D,SOCKS协议是如何使用的? SOCKS是否用作通信协议

    • 在应用程序客户端和 SSH 客户端之间,
    • 或者在 SSH 客户端和 SSH 服务器之间,
    • 或者SSH服务器和应用服务器之间?
  2. 一旦应用程序客户端通过 SSH 动态端口转发连接到应用程序服务器,SSH 客户端和服务器通常会“让开”。这是否意味着现在不再使用SSH协议?哪些协议仍在使用,例如 SOCKS 和/或 SSH 是否仍在使用?应用程序客户端和应用程序服务器之间的通信是否仍然封装在 SSH 协议内(因此受到保护)?

谢谢。

答案1

SSH 协议允许通过一个 TCP 连接复用多个独立的数据流。每个数据流被称为渠道。通过 TCP 连接发送的所有数据都经过加密。发送者将来自不同通道的数据聚合成单个数据流,然后对其进行加密。接收器将解密数据并将聚合的数据流分离回各自的通道。

在端口转发的情况下,SSH 客户端使用 TCP 连接通过 TCP 连接到远程 SSH 服务器。SSH协议。在通常的客户端->服务器转发情况下,SSH 客户端也会侦听某个端口上的 TCP 连接。到此端口的连接将通过服务器转发到某个目标。

当“发起者”(又名“应用程序客户端”)连接到 SSH 客户端的侦听端口时,SSH 客户端将向服务器发送通道打开请求,请求“direct-tcpip”通道。此请求的参数包括通道应连接到的主机名/IP 地址和端口。 SSH 服务器将与指定的主机和端口建立另一个 TCP 连接,我将其称为“目标”。现在有三个 TCP 连接:

  1. 发起者和 SSH 客户端之间
  2. SSH客户端和SSH服务器之间
  3. SSH服务器与转发目标之间

SSH 客户端和服务器通过 SSH 连接在发起方和目标之间双向中继数据。

因此,在转发来自发起者的连接时,SSH 客户端必须告诉 SSH 服务器该连接应转发到哪里。如果您ssh使用命令行选项运行来转发端口,例如:

ssh -L 1234:example.com:2345 ...

然后将连接转发到哪里的信息来自命令行参数;ssh请记住,到端口 1234 的连接将转发到 example.com 端口 2345。

如果ssh使用运行 SOCKS 服务器的选项来调用,例如:

ssh -D 1234

那么连接到 SOCKS 端口的每个发起者都应该首先发送一条 SOCKS 协议消息,指定它想要连接的主机和端口。ssh将使用 SOCKS 消息中的信息来构造 direct-tcpip 通道打开请求。

答案2

我想说,SSH 客户端和服务器“让开”是描述动态端口转发的一种非常糟糕的方式,并且可能是一些作者重复他们可能被教导的写得不好或过于简单的描述的结果在某一点。

正如其他人所描述的,SOCKS 被用作一种标准化方式来告诉任何兼容的 TCP 代理代理连接应该去哪里。本质上,SOCKS 协议就像使用老式的手动切换电话:“接线员,请将我连接到 X 镇的电话号码 Y!”完成此操作后,操作员不会(应该)监听连接,您可以使用您想要的任何语言与另一端的人交谈。

在 SSH 动态转发中,应用程序客户端打开到动态转发端口(SOCKS 服务器端口)的 TCP 连接,发出标准 SOCKS 请求以连接到特定 IP 地址和端口,然后可以恢复使用它将使用的任何协议本地通过该 TCP 连接。它需要能够发出初始 SOCKS 请求,但不需要了解更多信息。 (连接结束时可能有一些特定于 SOCKS 的小事情,但否则转发的连接对于端点而言将是完全透明且协议中立的。)

另一端的应用程序服务器只看到来自 SSH 服务器的普通旧 TCP 连接:它不需要知道连接正在转发,也不需要知道客户端涉及 SOCKS 协议。

(当您的电话响起并接听时,即使电话碰巧来自技术博物馆,该博物馆具有功能齐全的手动电话交换机,并且具有连接固定电话网络的出线,您也不需要执行任何特殊操作。)

因此,从严格的客户端/服务器术语来看,当激活动态转发功能时,SSH客户端也将充当袜子服务器具有特定的附加属性,即使用 SOCKS 服务器的所有连接都将在加密的 SSH 隧道内传递到远程SSH服务器并从那里恢复为常规 TCP 连接。

或者,换句话说,启用动态转发的 SSH 客户端 + SSH 连接 + SSH 服务器的组合将充当 SOCKS 代理,该代理已延伸到 SSH 连接所覆盖的距离,以便 SOCKS 代理的入站端与 SSH 客户端位于同一位置,出站端位于 SSH 服务器,而其间发生的情况对于外部观察者来说看起来像是无描述的加密 SSH 流量。

注意只有 SSH 客户端和 SSH 服务器之间的跃点才会受到 SSH 的保护。但应用程序客户端和 SSH 客户端/SOCKS 服务器之间的跃点通常位于单个主机内。唯一可能未加密的剩余部分(除非应用程序协议包含其自己的加密)是 SSH 服务器和应用程序服务器之间的跃点。

答案3

使用了SOCKS协议吗?

客户端(Web 浏览器)与 ssh 服务器通信(通过 ssh 客户端)

应用程序客户端和应用程序服务器之间的通信是否仍然封装在 SSH 协议内(因此受到保护)?

是的。

参考资料

相关内容