是否可以有一个用于 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:8888
您127.0.0.3:8888
的目标。
您可以使用命名空间、容器、虚拟机,但这会更复杂,并且取决于您的需求。