SSH 隧道如何在低级别工作?

Mr.*_*art 5 networking ssh operating-systems sockets

我对建立 SSH 隧道时发生的确切机制感兴趣。

假设我们有 3 台计算机:本地主机、中间主机和远程主机,具有以下拓扑:

Localhost --- INTERNET --- IntermediateHost --- LAN --- RemoteHost
Run Code Online (Sandbox Code Playgroud)

并且我们想建立一个通向在 RemoteHost 上运行的 Web 服务器的隧道。

中间和远程主机接受 SSH 连接。

当我在本地机器中执行以下命令时:

$ ssh -L 2022:remote:80 user@intermediate
Run Code Online (Sandbox Code Playgroud)

如果我假设以下,我是对的吗?

  • localhost的SSH客户端打开2022端口并监听(开始充当服务器)
  • 同时,localhost的 SSH客户端在中间主机上打开一个默认端口(22)的 SSH 连接。
  • 在这个连接中,客户端通知 IntermediateHost 它想要打开一个隧道(因为 SSH 协议支持它),所以现在中间 SSH 服务器知道它必须将通过这个连接接收到的流量发送到 RemoteHost 的 80 端口。

所以现在,在 Localhost 上运行的 Web 浏览器连接到 localhost:2022 并通过套接字发送“GET /”。SO 控制并将此信息封装在 TCP 数据包中,目标端口为 2022,然后将此信息封装在 IP 数据包中,目标地址为 LOCALHOST,操作系统的路由表确定该数据包是针对同一台机器的,所以它解开TCP数据包,读取目的地,然后解开它,将“GET /”返回给SSH客户端之前打开的serverSocket(在端口2022上)

这样对吗?因为据我所知,隧道通过SSH将TCP/IP数据包包裹起来,但是在这种情况下,SSH客户端无法访问TCP/IP数据包,它只能获取“应用程序级别”信息:“GET /”。

谢谢!

glg*_*lgl 2

您对流程的理解是正确的。

“包装”或“隧道”确实发生在 TCP 级别:通过 SSH 连接传入的流连接到 LAN 中的套接字连接,并且通过该连接来回的所有内容也会通过该连接。