我在一台专用服务器上有一个主节点,所有端口都打开。我必须使用额外的专用服务器,其中我们用于在服务器之间通信的一些端口被 ISP 提供商关闭。因此,我无法使用主服务器的互联网 IP 地址在它们之间建立连接。
我使用如下命令从其中一台具有封闭端口的专用服务器创建了 SSH 端口转发:
ssh -fNT -L 84xx:localhost:84xx user@main_server_IP
当我只有一个端口转发时它可以工作,但如何为 2 个或更多端口关闭的服务器实现这一点?另外,当我有多个服务器用于转发连接时,我认为 localhost 的用法不正确。除了每个服务器都有的静态 IP 地址之外,如何创建 Intranet 地址?或者我可以使用静态 IP 地址而不是本地主机?我只需要转发通过 84xx 端口建立的节点的通信,所有其他连接都应该以常规方式进行,无需隧道。
答案1
正如您正确提到的,不应使用 localhost,主要是因为您使用了错误的隧道类型 -- -L 而不是 -R。您希望在主服务器上打开新端口以供外部客户端使用,这意味着这些端口应绑定到公共 IP 地址。如果将其绑定到本地主机,则外部的任何人都无法访问它。
考虑到您尝试解决问题的方式(ssh 隧道),简单的解决方案是在 main_server 上使用两个不同的端口。如果主服务器是“main_ip”,另外两个服务器是“sec1_ip”和“sec2_ip”,则必须运行以下命令:
在 sec1_ip 上:
ssh -fNT -R 8447:localhost:8447 user@main_ip
在 sec2_ip 上:
ssh -fNT -R 8448:localhost:8447 user@main_ip
之后,连接到 main_ip:8447 的每个人都将反向隧道连接到 sec1_ip,连接到 main_ip:8448 的每个人都将反向隧道连接到 sec2_ip。
请注意以下事项:
- 您必须使用不同的端口作为反向隧道的第一个选项。只能有一个进程在特定 IP 地址上打开特定端口。
- 我们使用 localhost 和 -R (反向隧道),而不是 -L。这意味着 localhost 部分位于 sec*_ip 服务器上。
- 如果您想对两个“隐藏”服务器使用相同的端口,则需要在 main_ip 服务器上请求额外的公共 IP 地址。在这种情况下,您可以将上述命令更改为:
在 sec1_ip 上:
ssh -fNT -R main_ip:8447:localhost:8447 user@main_ip
在 sec2_ip 上:
ssh -fNT -R main_ipB:8447:localhost:8447 user@main_ip