这两种形式的 SSH 隧道命令有什么区别?

这两种形式的 SSH 隧道命令有什么区别?

我一直使用ssh -L以下格式将本地运行的 Web 前端连接到远程 RPC 或 HTTP 服务。

ssh -L <local port>:localhost:<remote port> <remote host> # Format 1

最近,我发现自己使用了不同类型的隧道来连接 SQL 数据库,我只能从其私有网络内的另一台服务器访问该数据库,格式如下。

ssh -L <local port>:<final target host>:<remote port> <intermediate remote host> # Format 2

虽然我理解这两种形式的功能,但我对它们的工作方式没有很好的理解。当我只知道第一种形式时,我假设它的ssh -L意思是“将端口上的流量传递local portremote porton remote host,然后将响应流量重定向回localhost”。这表明remote host是转发流量的接收者。

格式 2 和ssh手册页(特别是此段 [1])让我相信事实并非如此。两者都将参数中“:”之间列出的主机-L(而不是remote host命令末尾的主机)视为转发流量的最终接收者。此外,格式 2 除了初始化远程 shell 会话外,还使用 ​​SSH 命令末尾传递的主机作为流量的中间连接点。

总而言之,第二种ssh -L命令让我相信第一种命令不应该这样工作。如果格式 2 被视为流量的中间站点,为什么格式 1 可以作为转发流量local portremote port方式remote host

[1]

-L [bind_address:]port:remote_socket 每当与本地端口或套接字建立连接时,该连接都会通过安全通道转发,并且会连接到主持人港口 主机端口或来自远程机器的 Unix 套接字 remote_socket。

请注意,这段话从未提到主机名参数,作为最终参数传递给任何 SSH 命令(例如ssh -L <local port>:<...>:<remote port> <hostname>)。

答案1

我认为您已经非常接近理解了,只有几件事需要澄清。因此,假设在客户端计算机上发出以下 SSH 命令:

ssh -L [bind_address:]port:host:hostport user@server

此命令将启动 SSH 连接server并建立直接连接。-L指示 SSH 客户端在客户端计算机上打开一个端口(端口号为port,绑定到 指定的客户端网络接口bind_address)。这允许客户端上的另一个软件(如 Web 浏览器或 DB 管理工具)连接到该端口,并且发送的任何流量都将通过 SSH 隧道传输,并且在计算机上,serverSSH 服务器将打开连接host:hostport并通过该连接将流量发送到host计算机。

在格式 #1 示例中,您的 Web 服务器和 SSH 服务器是同一台计算机,因此host就是localhost,即localhostSSH 服务器的 。在第二个示例中,您使用 SSH 服务器作为中介来访问另一台远程计算机,但关键是 SSH 服务器能够连接到该计算机 ( host)。因此,实际上这两个命令都在做同样的事情,唯一的区别是一个命令最终连接到与 SSH 服务器位于同一台计算机上的服务,而另一个命令连接到远程服务器。

相关内容