我了解一些 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”时,你可能指的是既不是也不是。从现在起,我们称这台计算机为本地计算机host1
host2
A
B
客户端。
基本上你在客户端上运行它:
ssh -L bind_address:port:host:hostport user@server
涉及两台计算机:客户端和服务器。命令的某些部分在客户端或服务器的上下文中有效。
ssh -L
是客户端可以理解的带有选项的可执行文件(服务器可能ssh
根本没有)。server
是从客户端角度来看的服务器地址(服务器甚至可能不知道它具有这样的地址或名称)。user
是服务器上存在的用户名(它可能存在于客户端,也可能不存在,无关紧要)。bind_address
和port
分别是客户端ssh
将侦听的地址(网络接口的地址)和 TCP 端口(我不知道这些参数是否传递给服务器,服务器不需要它们)。 在你的情况下0.0.0.0
意味着“每个可用的接口”。host
和hostport
分别是服务器应将通过隧道从客户端发送的数据包发送到的地址和 TCP 端口。这些参数适用于服务器;host
在服务器上解析从客户端的角度来看,这host
可能是一个无效的地址,也可能解析为完全不同的内容——这并不重要,因为客户端根本不解析它;它host
只是一个传递给服务器的字符串,在客户端方面没有任何意义。
这意味着如果有一个文字localhost
作为此host
参数,则从服务器的角度来看它是“localhost”,即服务器本身。它的意思不是“客户”。
利用这些知识,让我们来分析您的示例。
ssh -L 0.0.0.0:10022:localhost:22 root@A
这将捕获进入客户端 TCP 端口10022
的所有内容;捕获的数据包将在服务器上重新创建并发A
往localhost:22
,但localhost
在服务器上意味着“服务器A
本身的环回接口”。
ssh -L 0.0.0.0:10022:A:22 root@B
这将捕获进入客户端 TCP 端口10022
的所有内容;捕获的数据包将在服务器上重新创建B
并A:22
从那里发往目的地。
实际上它可以描述为“通过 B 到 A 的本地主机”,其中“localhost”表示客户端。