![这两种形式的 SSH 隧道命令有什么区别?](https://linux22.com/image/1541855/%E8%BF%99%E4%B8%A4%E7%A7%8D%E5%BD%A2%E5%BC%8F%E7%9A%84%20SSH%20%E9%9A%A7%E9%81%93%E5%91%BD%E4%BB%A4%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我一直使用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 port
给remote port
on remote host
,然后将响应流量重定向回localhost
”。这表明remote host
是转发流量的接收者。
格式 2 和ssh
手册页(特别是此段 [1])让我相信事实并非如此。两者都将参数中“:”之间列出的主机-L
(而不是remote host
命令末尾的主机)视为转发流量的最终接收者。此外,格式 2 除了初始化远程 shell 会话外,还使用 SSH 命令末尾传递的主机作为流量的中间连接点。
总而言之,第二种ssh -L
命令让我相信第一种命令不应该这样工作。如果格式 2 被视为流量的中间站点,为什么格式 1 可以作为转发流量local port
的remote 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 隧道传输,并且在计算机上,server
SSH 服务器将打开连接host:hostport
并通过该连接将流量发送到host
计算机。
在格式 #1 示例中,您的 Web 服务器和 SSH 服务器是同一台计算机,因此host
就是localhost
,即localhost
SSH 服务器的 。在第二个示例中,您使用 SSH 服务器作为中介来访问另一台远程计算机,但关键是 SSH 服务器能够连接到该计算机 ( host
)。因此,实际上这两个命令都在做同样的事情,唯一的区别是一个命令最终连接到与 SSH 服务器位于同一台计算机上的服务,而另一个命令连接到远程服务器。