SSH 动态转发 (-D) 在幕后是如何工作的?

Shu*_*eng 5 ssh

SSH 动态转发 (-D) 在幕后是如何工作的?

据我了解,SSH 动态转发会在本地主机上打开 SOCSK4 代理,并且与 SOCK4 代理的每个连接都会通过 SSH 隧道转发到远程目标。

SSH 是否拦截与 SOCKS4 代理的连接?我的意思是,它不能是“普通”SOCKS4 代理,因为那样它会直接代理到远程主机的连接。

此外,SSH 如何处理来自远程主机的响应,即如何通过 SSH 隧道将它们传输回本地主机上的接收者?

Att*_*tie 7

当给出该-D标志时,SSH 客户端将启动内置的 SOCKS4/5 代理。(注意:“袜子”,而不是“袜子”)。

\n
\n
-D [bind_address:]port\n
Run Code Online (Sandbox Code Playgroud)\n

指定本地 \xe2\x80\x9cdynamic\xe2\x80\x9d 应用程序级端口转发。这是通过分配一个套接字来侦听本地端的端口来实现的,可以选择绑定到指定的bind_address。每当与此端口建立连接时,该连接都会通过安全通道转发,然后使用应用程序协议来确定从远程计算机连接到的位置。目前支持 SOCKS4 和 SOCKS5 协议,并且ssh 将充当 SOCKS 服务器

\n
\n

当另一个应用程序希望连接到代理服务时,它们将通过此 SOCKS 服务器建立连接。SOCKS 协议是在连接开始时发生的一点协商,如下所示:(受 wiki 页面启发

\n
    \n
  1. ssh -D 1234 user@remote执行时,SSH 客户端启动一个监听端口 1234 的 SOCKS 代理服务器。
  2. \n
  3. 本地应用程序希望通过 SOCKS 代理与服务进行通信,因此连接到端口 1234。
  4. \n
  5. SOCKS 客户端请求连接到特定的 IP 地址和端口 - 例如:66.102.7.99,端口 4321。
  6. \n
  7. SOCKS 服务器(在本例中为 SSH 客户端)将协商与其服务器建立此前向连接(remote来自上面的 )。这可能会失败。
  8. \n
  9. SOCKS服务器将向客户端响应成功/失败信息。
  10. \n
  11. 如果成功,通过此套接字传递的所有数据现在都将被正确转发:\n
      \n
    • 从本地应用程序到 SSH 服务器 ( remote),然后到66.102.7.99
    • \n
    • 66.102.7.99到 SSH 服务器(remote),然后到本地 SSH 客户端,最后到本地应用程序。
    • \n
    \n
  12. \n
\n
\n
\n

SSH 是否拦截与 SOCK4 代理的连接?

\n
\n

不,SSH 客户端SOCKS 代理。

\n
\n

我的意思是,它不能是“普通”SOCK4 代理,因为那样它会直接代理到远程主机的连接。

\n
\n

我想这并不是真的——SSH 客户端和服务器共同作用来实现“正常”SOCKS 代理的功能。高级结果是代理在一台主机上侦听,但从另一台主机转发数据,中间有一个神奇的链接。

\n
\n

此外,SSH 如何处理来自远程主机的响应,即如何通过 SSH 隧道将它们传输回本地主机上的接收者?

\n
\n

TCP 是一种面向连接的通信方法。也就是说,一旦建立了连接,数据就可以双向流动,并被可靠地识别为“与该连接相关”。有了这些信息,就可以轻松地将数据与任意规则相关联,例如“转发到 SSH 服务器,谁将转发到66.102.7.99”。

\n