SSH 网关:当远程优先时如何理解 ssh -L?

SSH 网关:当远程优先时如何理解 ssh -L?

我了解一些 ssh 转发基础知识,但是这个超级用户帖子对我来说这似乎有点倒退。换句话说,有了 2 个主机,这……

ssh -L 0.0.0.0:10022:localhost:22 root@A

…似乎允许从本地主机到 A 的连接。但是如果有 3 个主机,这…

ssh -L 0.0.0.0:10022:A:22 root@B

…允许 localhost 通过 B 访问 A?为什么 localhost 不能通过 A 访问 B?

ssh 手册页似乎描述了 2-hosts 选项,而不是 3-hosts 选项:

-L [bind_address:]port:host:hostport

每当与本地端口或套接字建立连接时,该连接都会通过安全通道转发,并从远程计算机与host端口hostport或 Unix 套接字建立连接。remote_socket

答案1

我不清楚你的(误解)到底是什么。我猜混淆可能是因为“localhost”这个词。

Localhost 是一个相对术语。根据定义,在任何机器的上下文中localhost都应该准确地指代这台机器。实际上,每个 Linux 都解析localhost为 IP 地址127.0.0.1(我将 IPv6 放在一边),这要归功于/etc/hosts文件中的正确条目。127.0.0.1应该分配给环回接口。

在链接的答案中,大多数出现的单词都是指既不是也不是localhost的机器(三台机器中的一台);这是调用命令的本地机器。同样,当你说“localhost”时,你可能指的是既不是也不是。从现在起,我们称这台计算机为本地计算机host1host2AB客户端

基本上你在客户端上运行它:

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

涉及两台计算机:客户端和服务器。命令的某些部分在客户端或服务器的上下文中有效。

  • ssh -L是客户端可以理解的带有选项的可执行文件(服务器可能ssh根本没有)。
  • server是从客户端角度来看的服务器地址(服务器甚至可能不知道它具有这样的地址或名称)。
  • user是服务器上存在的用户名(它可能存在于客户端,也可能不存在,无关紧要)。
  • bind_addressport分别是客户端ssh将侦听的地址(网络接口的地址)和 TCP 端口(我不知道这些参数是否传递给服务器,服务器不需要它们)。 在你的情况下0.0.0.0意味着“每个可用的接口”。
  • hosthostport分别是服务器应将通过隧道从客户端发送的数据包发送到的地址和 TCP 端口。这些参数适用于服务器;host在服务器上解析从客户端的角度来看,这host可能是一个无效的地址,也可能解析为完全不同的内容——这并不重要,因为客户端根本不解析它;它host只是一个传递给服务器的字符串,在客户端方面没有任何意义。

这意味着如果有一个文字localhost作为此host参数,则从服务器的角度来看它是“localhost”,即服务器本身。它的意思不是“客户”。


利用这些知识,让我们来分析您的示例。

ssh -L 0.0.0.0:10022:localhost:22 root@A

这将捕获进入客户端 TCP 端口10022的所有内容;捕获的数据包将在服务器上重新创建并发Alocalhost:22,但localhost在服务器上意味着“服务器A本身的环回接口”。

ssh -L 0.0.0.0:10022:A:22 root@B

这将捕获进入客户端 TCP 端口10022的所有内容;捕获的数据包将在服务器上重新创建BA:22从那里发往目的地。

实际上它可以描述为“通过 B 到 A 的本地主机”,其中“localhost”表示客户端。

相关内容