是否可以有一个用于 ssh 隧道的共享端口,根据客户端隔离会话?

是否可以有一个用于 ssh 隧道的共享端口,根据客户端隔离会话?

是否可以有一个用于 ssh 隧道的共享端口,根据客户端隔离会话?例如,如果我有 client1 使用到共享服务器上端口 9999 的隧道作为到另一台服务器的 ssh 隧道,如下所示:

client1端口8888 —> 共享主机端口9999 —> server1端口4477

有没有办法让共享服务器上的端口 9999 也可以被另一个客户端使用来隧道连接到不同的终端主机,如下所示?

client2端口8888—>共享主机端口9999—>server2端口5568

关键点是转发到共享主机端口的客户端本地端口始终是相同的端口。隧道可以从共享主机扩展到所需的端点,但隧道仍将通过共享主机上的同一端口传递。

我已经尝试了很多方法,但最终要么是 client2 会话在该端口上被拒绝,要么是来自 client1 的流量被传送到 client2。

我意识到这不是一个理想的设置,但不幸的是,这就是我必须处理的。

--编辑-- 添加示例:

有 2 个 Web 服务器只能通过共享主机访问。在此示例中,他们将仅回复“服务器 1 响应”或“服务器 2 响应”。身份验证由 rsa 密钥处理,并且 user1 和 user2 使用完全独立的硬件。

user1 首先连接:

user1@localbox1$ ssh -t -L 8888:localhost:9999 [email protected] "ssh -L 9999:localhost:80 [email protected]"
[email protected] $ 

隧道按预期运行:

user1@localbox1$ curl "http://localhost:8888"
server1 repsonse
user1@localbox1$

当用户 2 尝试连接时,他们会收到一条错误消息,并使用用户 1 的隧道:

user2@localbox2$ ssh -t -L 8888:localhost:9999 [email protected] "ssh -L 9999:localhost:80 [email protected]"
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 9999
Could not request local forwarding.
[email protected] $ 

然后,用户 1 的会话被转发到用户 2 的隧道。

user2@localbox2$ curl "http://localhost:8888"
server1 response
user2@localbox2$

如果隧道已创建,则响应将server2 response不是server1 response

值得注意的是,不幸的是,第二条隧道的远程命令是必要的,因为终端主机地址可能会发生变化,并且无法从用户端确定这些值。为了简单起见,在本示例中,我仅使用了一些实际的最终主机地址。

答案1

是的,这是可能的,假设 client1 和 client2 是不同的计算机,而不是同一台计算机上的不同用户。

您认为它不起作用有什么理由吗?您是否尝试过但有些东西不起作用?

编辑

在您的示例中,client1 和 client2 在同一台计算机上,localbox所以这当然不起作用。

最简单的解决方案是使用两个不同的端口。有什么特殊原因不使用不同的端口吗?

另一种解决方案是使用不同的源地址:

ssh -t -L 127.0.0.2:8888:localhost:9999 [email protected]

ssh -t -L 127.0.0.3:8888:localhost:9999 [email protected]

您现在可以连接到127.0.0.2:8888127.0.0.3:8888的目标。

您可以使用命名空间、容器、虚拟机,但这会更复杂,并且取决于您的需求。

相关内容