我能够在单个服务器上使用每个连接一个端口接受来自多个远程系统的反向 SSH 连接:
Remote A: ssh -fN -R5000:localhost:22 user@server-ip -p22
Remote B: ssh -fN -R5001:localhost:22 user@server-ip -p22
Remote C: ssh -fN -R5002:localhost:22 user@server-ip -p22
我可以根据需要从本地客户端访问这些系统:
Access Remote A: ssh root@server-ip -p5000
Access Remote B: ssh root@server-ip -p5001
这需要在服务器上转发每个远程系统的一个端口。当有 100 多个远程系统连接时,除了在服务器防火墙中打开 100 多个端口并像上面一样静态地为每个远程系统分配一个端口之外,我还有其他选择吗?我的目标是让多个远程系统按需创建隧道,这样我就可以查询谁连接了。
我发现 sslh 是一个多路复用器,可以根据协议区分单个端口上的流量,但这仅适用于不同的协议,例如 ssl/ssh。有没有允许单个端口上有多个隧道的解决方案?
例子:
Remote A: ssh -fN -R5000:localhost:22 user@server-ip -p22 -identifier abc123
Remote B: ssh -fN -R5000:localhost:22 user@server-ip -p22 -identifier def456
access Remote A: ssh root@server-ip -p5000 -identifier abc123
access Remote B: ssh root@server-ip -p5000 -identifier def456
答案1
我遇到了和你一样的问题,但到现在为止,我只想到了一个可能的答案。我的情况与你的略有不同,因为我只需要一个活动的 ssh 隧道,但所有客户端都必须准备好在需要时进行连接。
我猜可以创建一个客户端/服务器简单协议来处理所有客户端并创建某种列表。然后用户可以选择其中一个客户端来创建反向隧道。这样做需要另一个开放端口而不是 ssh 服务器,但使用线程服务器可以在同一端口下为该辅助协议 listen() 各种客户端。
我仍在研究解决方案(我可能会实现我刚刚写的内容),但请注意,您应该确定一次连接的最大客户端数量并配置该数量的端口。由于我的只是嵌入式设备的小型 Linux“支持”,所以我一次只能在一台设备上工作,所以我只需要 1 台设备。
一个更聪明的想法是通过辅助协议告知客户端在哪个服务器端口连接反向隧道。