我有以下设置:我想从机器 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
。由于machineB
和machineC
位于同一子网,因此您只需一步即可machineA
从登录。machineC
如果您没有 root 权限machineB
,则过程相同,但监听地址除外。如果GatewayPorts
设置为no
(默认值),则第一个参数(0.0.0.0
)将被忽略,监听地址将绑定到127.0.0.1
。在这种情况下,您仍然可以使用上面的命令,转发将以相同的方式工作,但打开的端口将无法从除 之外的任何位置使用machineB
。因此,您必须通过 SSH 进入machineB
,然后通过 SSH 进入localhost
,端口 2222,这将带您进入machineA
。
但是,您可能需要考虑使用更强大的工具,例如 VPN。