我对 SSH 隧道建立时发生的确切机制很感兴趣。
假设我们有 3 台计算机:本地主机、中间主机和远程主机,拓扑结构如下:
Localhost --- INTERNET --- IntermediateHost --- LAN --- RemoteHost
我们希望建立一条到 RemoteHost 上运行的 Web 服务器的隧道。
中间和远程主机接受 SSH 连接。
当我在本地机器上执行以下命令时:
$ ssh -L 2022:remote:80 user@intermediate
如果我做出以下假设,那么我是对的吗?
- SSH客户localhost 打开2022端口并监听(开始作为服务器)
- 与此同时,SSH客户本地主机在中间主机上使用默认端口(22)打开 SSH 连接。
- 在此连接中,客户端通知中间主机它想要打开一个隧道(因为 SSH 协议支持它),所以现在中间 SSH 服务器知道它必须将通过此连接收到的流量发送到远程主机的端口 80。
因此,现在,在 Localhost 上运行的 Web 浏览器连接到 localhost:2022 并通过套接字发送“GET /”。SO 接管并将此信息封装在 TCP 数据包中,目标端口为 2022,然后将此信息封装在 IP 数据包中,目标地址为 LOCALHOST,操作系统的路由表确定该数据包是发往同一台机器的,因此它解开 TCP 数据包,读取目标,然后解开它,将“GET /”返回到 SSH 客户端之前打开的 serverSocket(在端口 2022 上)
这是正确的吗?因为据我所知,隧道通过 SSH 包装 TCP/IP 数据包,但在这种情况下,SSH 客户端无法访问 TCP/IP 数据包,它只能获取“应用程序级别”信息:“GET /”。
谢谢你!
答案1
您对该过程的理解是正确的。
“包装”或“隧道”确实发生在 TCP 级别:通过 SSH 连接传输的流与 LAN 中的套接字连接相连,并且通过此连接来回传输的所有内容也会通过该连接传输。