从没有公网 IP 的服务器(该服务器隐藏在有公网 IP 的服务器后面)通过​​ ssh 进入没有公网 IP 的服务器

从没有公网 IP 的服务器(该服务器隐藏在有公网 IP 的服务器后面)通过​​ ssh 进入没有公网 IP 的服务器

我有以下设置:我想从机器 C 访问机器 A,但这两台机器都没有公共 IP 地址。但是,机器 C 与机器 B 位于同一网络中,而机器 B 具有公共 IP 访问权限,因此我可以从任何地方访问机器 C,方法是先通过 ssh 进入机器 B,然后从那里通过 ssh 进入机器 C。我在机器 B 上没有 root 访问权限,但在 A 和 CI 上都有。请参阅下图以了解详情:

machine A          machine B      machine C
no public IP       public IP      no public IP
root access        no root access root access     
how to access?    '---------------------------'
                           same network
                       hence both accessible

一个愚蠢的解决方案是让机器 A 定期嗅探机器 C 中的文件(通过上面描述的 2 步 ssh 访问),并且每当该文件中出现命令时,执行该命令并通过 ssh 将输出写入机器 C 的某个位置。但是,我想知道,ssh 是否可以以某种方式“反转”连接,以便机器 A 通过 2 个步骤连接到机器 C,然后连接被“反转”,以便机器 C 实际上具有机器 A 的远程 shell?如果可以,我该怎么做?

答案1

您可以machineA打开一个到 的 SSH 隧道machineB,并使用远程转发选项,这将允许您machineA从SSH 进入machineB

如果您在 上有 root 访问权限machineB,则将配置GatewayPorts选项设置为yes/etc/ssh/sshd_config然后在 上发出此命令machineA

ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B

这将打开 上的端口 2222 machineB,并将该端口上的任何流量转发到其自身,即端口 22。请注意,这将监听所有接口,包括公共接口,因此您可能需要防火墙端口号 2222(但您可能已经打开了防火墙machineB)。当此隧道处于活动状态时,您可以machineB通过端口 2222 SSH 连接到 ,这将带您到machineA。由于machineBmachineC位于同一子网,因此您只需一步即可machineA从登录。machineC

如果您没有 root 权限machineB,则过程相同,但监听地址除外。如果GatewayPorts设置为no(默认值),则第一个参数(0.0.0.0)将被忽略,监听地址将绑定到127.0.0.1。在这种情况下,您仍然可以使用上面的命令,转发将以相同的方式工作,但打开的端口将无法从除 之外的任何位置使用machineB。因此,您必须通过 SSH 进入machineB,然后通过 SSH 进入localhost,端口 2222,这将带您进入machineA

但是,您可能需要考虑使用更强大的工具,例如 VPN。

相关内容